]> git.mxchange.org Git - simgear.git/blobdiff - simgear/sound/sample_openal.cxx
Oops, one addtional tweak.
[simgear.git] / simgear / sound / sample_openal.cxx
index a4459788731de4e4d277dd9fd50d78290be078da..7a84e78d36dd0e482b395b9ff46edb3e47a19216 100644 (file)
 // $Id$
 
 
-#include <AL/al.h>
-#include <AL/alut.h>
+#if defined( __APPLE__ )
+# define AL_ILLEGAL_ENUM AL_INVALID_ENUM
+# define AL_ILLEGAL_COMMAND AL_INVALID_OPERATION
+# include <OpenAL/al.h>
+# include <OpenAL/alut.h>
+#else
+# include <AL/al.h>
+# include <AL/alut.h>
+#endif
 
 #include <simgear/debug/logstream.hxx>
 #include <simgear/misc/sg_path.hxx>
@@ -54,7 +61,9 @@ static void print_openal_error( ALuint error ) {
 
 
 // constructor
-SGSoundSample::SGSoundSample( const char *path, const char *file ) :
+SGSoundSample::SGSoundSample( const char *path, const char *file,
+                              bool cleanup ) :
+    data(NULL),
     pitch(1.0),
     volume(1.0),
     loop(AL_FALSE)
@@ -63,8 +72,10 @@ SGSoundSample::SGSoundSample( const char *path, const char *file ) :
     if ( strlen(file) ) {
         samplepath.append( file );
     }
-     
-    SG_LOG( SG_GENERAL, SG_ALERT, "From file sounds sample = "
+
+    sample_name = samplepath.str();
+
+    SG_LOG( SG_GENERAL, SG_DEBUG, "From file sounds sample = "
             << samplepath.str() );
 
     ALuint error;
@@ -81,13 +92,16 @@ SGSoundSample::SGSoundSample( const char *path, const char *file ) :
     if ( error != AL_NO_ERROR ) {
         print_openal_error( error );
         throw sg_exception("Failed to gen OpenAL buffer.");
-    } else {
-        SG_LOG( SG_GENERAL, SG_ALERT, "Buffer created ok!" );
     }
 
     // Load the sample file
+#if defined (__APPLE__)
+    alutLoadWAVFile( (ALbyte *)samplepath.c_str(),
+                     &format, &data, &size, &freq );
+#else
     alutLoadWAVFile( (ALbyte *)samplepath.c_str(),
                      &format, &data, &size, &freq, &loop );
+#endif
     if (alGetError() != AL_NO_ERROR) {
         throw sg_exception("Failed to load wav file.");
     }
@@ -98,7 +112,10 @@ SGSoundSample::SGSoundSample( const char *path, const char *file ) :
         throw sg_exception("Failed to buffer data.");
     }
 
-    alutUnloadWAV( format, data, size, freq );
+    if ( cleanup ) {
+        alutUnloadWAV( format, data, size, freq );
+        data = NULL;
+    }
 
     // Bind buffer with a source.
     alGenSources(1, &source);
@@ -117,11 +134,14 @@ SGSoundSample::SGSoundSample( const char *path, const char *file ) :
 
 // constructor
 SGSoundSample::SGSoundSample( unsigned char *_data, int len, int _freq ) :
+    data(NULL),
     pitch(1.0),
     volume(1.0),
     loop(AL_FALSE)
 {
-    SG_LOG( SG_GENERAL, SG_ALERT, "In memory sounds sample" );
+    SG_LOG( SG_GENERAL, SG_DEBUG, "In memory sounds sample" );
+
+    sample_name = "unknown, generated from data";
 
     source_pos[0] = 0.0; source_pos[1] = 0.0; source_pos[2] = 0.0;
     source_vel[0] = 0.0; source_vel[1] = 0.0; source_vel[2] = 0.0;
@@ -129,7 +149,7 @@ SGSoundSample::SGSoundSample( unsigned char *_data, int len, int _freq ) :
     // Load wav data into a buffer.
     alGenBuffers(1, &buffer);
     if (alGetError() != AL_NO_ERROR) {
-        SG_LOG( SG_GENERAL, SG_ALERT, "Error in alGenBuffers()" );
+        throw sg_exception("Failed to gen buffer." );
         return;
     }
 
@@ -157,7 +177,10 @@ SGSoundSample::SGSoundSample( unsigned char *_data, int len, int _freq ) :
 
 // destructor
 SGSoundSample::~SGSoundSample() {
-    SG_LOG( SG_GENERAL, SG_ALERT, "Deleting a sample" );
+    SG_LOG( SG_GENERAL, SG_INFO, "Deleting a sample" );
+    if ( data != NULL ) {
+        free(data);
+    }
     alDeleteSources(1, &source);
     alDeleteBuffers(1, &buffer);
 }