]> git.mxchange.org Git - simgear.git/blobdiff - simgear/sound/sample_openal.cxx
direction vector needs to be initialized, otherwise garbage data could cause
[simgear.git] / simgear / sound / sample_openal.cxx
index 77f0737a5926141051b773a148f3852245506046..27fc988364e7e4d539d58385e5c7e7aba8b833c0 100644 (file)
@@ -80,9 +80,11 @@ SGSoundSample::SGSoundSample( const char *path, const char *file,
     SG_LOG( SG_GENERAL, SG_DEBUG, "From file sounds sample = "
             << samplepath.str() );
 
-   source_pos[0] = 0.0; source_pos[1] = 0.0; source_pos[2] = 0.0;
+    source_pos[0] = 0.0; source_pos[1] = 0.0; source_pos[2] = 0.0;
     offset_pos[0] = 0.0; offset_pos[1] = 0.0; offset_pos[2] = 0.0;
     source_vel[0] = 0.0; source_vel[1] = 0.0; source_vel[2] = 0.0;
+    direction[0] = 0.0; direction[1] = 0.0; direction[2] = 0.0;
+    inner = outer = 360.0; outergain = 0.0;
 
     // clear errors from elsewhere?
     alGetError();
@@ -128,6 +130,10 @@ SGSoundSample::SGSoundSample( const char *path, const char *file,
     alSourcef( source, AL_PITCH, pitch );
     alSourcef( source, AL_GAIN, volume );
     alSourcefv( source, AL_POSITION, source_pos );
+    alSourcefv( source, AL_DIRECTION, direction );
+    alSourcef( source, AL_CONE_INNER_ANGLE, inner );
+    alSourcef( source, AL_CONE_OUTER_ANGLE, outer );
+    alSourcef( source, AL_CONE_OUTER_GAIN, outergain);
     alSourcefv( source, AL_VELOCITY, source_vel );
     alSourcei( source, AL_LOOPING, loop );
 
@@ -138,7 +144,8 @@ SGSoundSample::SGSoundSample( const char *path, const char *file,
 
 
 // constructor
-SGSoundSample::SGSoundSample( unsigned char *_data, int len, int _freq ) :
+SGSoundSample::SGSoundSample( unsigned char *_data, int len, int _freq,
+                              bool cleanup) :
     data(NULL),
     pitch(1.0),
     volume(1.0),
@@ -153,6 +160,7 @@ SGSoundSample::SGSoundSample( unsigned char *_data, int len, int _freq ) :
     source_pos[0] = 0.0; source_pos[1] = 0.0; source_pos[2] = 0.0;
     offset_pos[0] = 0.0; offset_pos[1] = 0.0; offset_pos[2] = 0.0;
     source_vel[0] = 0.0; source_vel[1] = 0.0; source_vel[2] = 0.0;
+    inner = outer = 360.0; outergain = 0.0;
 
     // clear errors from elsewhere?
     alGetError();
@@ -172,6 +180,14 @@ SGSoundSample::SGSoundSample( unsigned char *_data, int len, int _freq ) :
     freq = _freq;
 
     alBufferData( buffer, format, data, size, freq );
+    if (alGetError() != AL_NO_ERROR) {
+        throw sg_exception("Failed to buffer data.");
+    }
+
+    if ( cleanup ) {
+        alutUnloadWAV( format, data, size, freq );
+        data = NULL;
+    }
 
     // Bind buffer with a source.
     alGenSources(1, &source);
@@ -183,6 +199,10 @@ SGSoundSample::SGSoundSample( unsigned char *_data, int len, int _freq ) :
     alSourcef( source, AL_PITCH, pitch );
     alSourcef( source, AL_GAIN, volume );
     alSourcefv( source, AL_POSITION, source_pos );
+    alSourcefv( source, AL_DIRECTION, direction );
+    alSourcef( source, AL_CONE_INNER_ANGLE, inner );
+    alSourcef( source, AL_CONE_OUTER_ANGLE, outer );
+    alSourcef( source, AL_CONE_OUTER_GAIN, outergain );
     alSourcefv( source, AL_VELOCITY, source_vel );
     alSourcei( source, AL_LOOPING, loop );
 
@@ -195,9 +215,6 @@ SGSoundSample::SGSoundSample( unsigned char *_data, int len, int _freq ) :
 // destructor
 SGSoundSample::~SGSoundSample() {
     SG_LOG( SG_GENERAL, SG_INFO, "Deleting a sample" );
-    if ( data != NULL ) {
-        free(data);
-    }
     alDeleteSources(1, &source);
     alDeleteBuffers(1, &buffer);
 }