]> git.mxchange.org Git - simgear.git/blobdiff - simgear/sound/sample_openal.cxx
Add a function to calculate the normalmap from a regular texture.
[simgear.git] / simgear / sound / sample_openal.cxx
index 107d630e005b44d54d81045ad5f254b8ac4093d6..fa74a9063727652191ba8e79b1967ce4880474e5 100644 (file)
@@ -2,7 +2,7 @@
 // 
 // Written by Curtis Olson, started April 2004.
 //
-// Copyright (C) 2004  Curtis L. Olson - curt@flightgear.org
+// Copyright (C) 2004  Curtis L. Olson - http://www.flightgear.org/~curt
 //
 // This program is free software; you can redistribute it and/or
 // modify it under the terms of the GNU General Public License as
@@ -61,30 +61,37 @@ 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),
+    reference_dist(500.0),
+    max_dist(3000.),
     loop(AL_FALSE)
 {
     SGPath samplepath( path );
     if ( strlen(file) ) {
         samplepath.append( file );
     }
-     
+
+    sample_name = samplepath.str();
+
     SG_LOG( SG_GENERAL, SG_DEBUG, "From file sounds sample = "
             << samplepath.str() );
 
-    ALuint error;
-
     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();
 
     // create an OpenAL buffer handle
     alGenBuffers(1, &buffer);
-    error = alGetError();
+    ALuint error = alGetError();
     if ( error != AL_NO_ERROR ) {
         print_openal_error( error );
         throw sg_exception("Failed to gen OpenAL buffer.");
@@ -108,38 +115,63 @@ 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);
     if (alGetError() != AL_NO_ERROR) {
-        throw sg_exception("Failed to gen source.");
+        throw sg_exception("Failed to gen source.\nPlease update your sound driver and try again.");
     }
 
     alSourcei( source, AL_BUFFER, buffer );
     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 );
+
+    alSourcei( source, AL_SOURCE_RELATIVE, AL_TRUE );
+    alSourcef( source, AL_REFERENCE_DISTANCE, reference_dist );
+    alSourcef( source, AL_MAX_DISTANCE, max_dist );
 }
 
 
 // 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),
+    reference_dist(500.0),
+    max_dist(3000.),
     loop(AL_FALSE)
 {
     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;
+    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();
 
     // Load wav data into a buffer.
     alGenBuffers(1, &buffer);
-    if (alGetError() != AL_NO_ERROR) {
-        SG_LOG( SG_GENERAL, SG_ALERT, "Error in alGenBuffers()" );
+    ALuint error = alGetError();
+    if ( error != AL_NO_ERROR ) {
+        print_openal_error( error );
+        throw sg_exception("Failed to gen buffer." );
         return;
     }
 
@@ -149,19 +181,35 @@ 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);
     if (alGetError() != AL_NO_ERROR) {
-        throw sg_exception("Failed to gen source.");
+        throw sg_exception("Failed to gen source.\nPlease update your sound driver and try again.");
     }
 
     alSourcei( source, AL_BUFFER, buffer );
     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 );
+
+    alSourcei( source, AL_SOURCE_RELATIVE, AL_TRUE );
+    alSourcef( source, AL_REFERENCE_DISTANCE, reference_dist );
+    alSourcef( source, AL_MAX_DISTANCE, max_dist );
 }