X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fsound%2Fsample_openal.cxx;h=27fc988364e7e4d539d58385e5c7e7aba8b833c0;hb=a7f78b9f68550efd85e3032cdfaf362664352359;hp=107d630e005b44d54d81045ad5f254b8ac4093d6;hpb=6f29d234ebb164edeb409f10c4b806c96e0af6bf;p=simgear.git diff --git a/simgear/sound/sample_openal.cxx b/simgear/sound/sample_openal.cxx index 107d630e..27fc9883 100644 --- a/simgear/sound/sample_openal.cxx +++ b/simgear/sound/sample_openal.cxx @@ -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,7 +115,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); @@ -120,26 +130,47 @@ 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 ); + + 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; + 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,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); @@ -160,8 +199,16 @@ 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 ); + + alSourcei( source, AL_SOURCE_RELATIVE, AL_TRUE ); + alSourcef( source, AL_REFERENCE_DISTANCE, reference_dist ); + alSourcef( source, AL_MAX_DISTANCE, max_dist ); }