]> git.mxchange.org Git - simgear.git/blobdiff - simgear/sound/soundmgr_openal.cxx
Pass current-dir down through XMLSound
[simgear.git] / simgear / sound / soundmgr_openal.cxx
index e372f3cc5fd0551bfb73ddd85fa627ae3f3cb4cc..c3eda45a0568e7cb2e9037a23b0f9a8cc9af6fb0 100644 (file)
 #endif
 
 #if defined( __APPLE__ )
-# include <OpenAL/alut.h>
+# include <ALUT/alut.h>
 #else
 # include <AL/alut.h>
 #endif
 
 #include <iostream>
 #include <algorithm>
+#include <cstring>
 
 #include "soundmgr_openal.hxx"
 
 #include <simgear/misc/sg_path.hxx>
 #include <simgear/math/SGMath.hxx>
 
+using std::string;
+
 extern bool isNaN(float *v);
 
 #define MAX_SOURCES    128
 
+
+#ifndef ALC_ALL_DEVICES_SPECIFIER
+# define ALC_ALL_DEVICES_SPECIFIER     0x1013
+#endif
+
 //
 // Sound Manager
 //
@@ -81,6 +89,8 @@ SGSoundMgr::SGSoundMgr() :
         }
     }
     _alut_init++;
+#else
+  //#error ALUT 1.1 required, ALUT 1.0 is no longer supported, please upgrade
 #endif
 }
 
@@ -460,11 +470,15 @@ unsigned int SGSoundMgr::request_buffer(SGSoundSample *sample)
         if ( sample->is_file() ) {
             int freq, format;
             size_t size;
-            bool res;
-
-            res = load(sample_name, &sample_data, &format, &size, &freq);
-            if (res == false) return buffer;
 
+            try {
+              bool res = load(sample_name, &sample_data, &format, &size, &freq);
+              if (res == false) return buffer;
+            } catch (sg_exception& e) {
+              SG_LOG(SG_GENERAL, SG_ALERT, "failed to load sound buffer:" << e.getFormattedMessage());
+              return NO_BUFFER;
+            }
+            
             sample->set_frequency( freq );
             sample->set_format( format );
             sample->set_size( size );
@@ -499,20 +513,23 @@ unsigned int SGSoundMgr::request_buffer(SGSoundSample *sample)
 
 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;
-    }
+    if ( !sample->is_queue() )
+    {
+        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");
+        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");
+        }
     }
 }