+void SGSoundMgr::release_buffer(SGSoundSample *sample)
+{
+ string sample_name = sample->get_sample_name();
+ buffer_map_iterator buffer_it = _buffers.find( sample_name );
+ if ( buffer_it == _buffers.end() ) {
+ // buffer was not found
+ return;
+ }
+
+ sample->no_valid_buffer();
+ buffer_it->second.refctr--;
+ if (buffer_it->second.refctr == 0) {
+ ALuint buffer = buffer_it->second.id;
+ alDeleteBuffers(1, &buffer);
+ _buffers.erase( buffer_it );
+ testForALError("release buffer");
+ }
+}
+
+void SGSoundMgr::update_pos_and_orientation() {
+ /**
+ * Description: ORIENTATION is a pair of 3-tuples representing the
+ * 'at' direction vector and 'up' direction of the Object in
+ * Cartesian space. AL expects two vectors that are orthogonal to
+ * each other. These vectors are not expected to be normalized. If
+ * one or more vectors have zero length, implementation behavior
+ * is undefined. If the two vectors are linearly dependent,
+ * behavior is undefined.
+ *
+ * This is in the same coordinate system as OpenGL; y=up, z=back, x=right.
+ */
+ SGVec3d sgv_at = _orientation.backTransform(-SGVec3d::e3());
+ SGVec3d sgv_up = _orientation.backTransform(SGVec3d::e2());
+ _at_up_vec[0] = sgv_at[0];
+ _at_up_vec[1] = sgv_at[1];
+ _at_up_vec[2] = sgv_at[2];
+ _at_up_vec[3] = sgv_up[0];
+ _at_up_vec[4] = sgv_up[1];
+ _at_up_vec[5] = sgv_up[2];
+
+ // static const SGQuatd q(-0.5, -0.5, 0.5, 0.5);
+ // SGQuatd hlOr = SGQuatd::fromLonLat(SGGeod::fromCart(_base_pos));
+ // SGQuatd ec2body = hlOr*_orientation;
+ _absolute_pos = _base_pos; // + ec2body.backTransform( _offset_pos );
+}
+
+bool SGSoundMgr::load(string &samplepath, void **dbuf, int *fmt,
+ size_t *sz, int *frq )
+{
+ if ( !_working ) return false;
+
+ ALenum format;
+ ALsizei size;
+ ALsizei freq;
+ ALvoid *data;
+
+#if defined(ALUT_API_MAJOR_VERSION) && ALUT_API_MAJOR_VERSION >= 1
+ ALfloat freqf;
+ data = alutLoadMemoryFromFile(samplepath.c_str(), &format, &size, &freqf );
+ freq = (ALsizei)freqf;
+ if (data == NULL) {
+ int error = alutGetError();
+ string msg = "Failed to load wav file: ";
+ msg.append(alutGetErrorString(error));
+ throw sg_io_exception(msg.c_str(), sg_location(samplepath));
+ return false;
+ }