X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;ds=sidebyside;f=simgear%2Fsound%2Fsample_group.cxx;h=a5d19641d385e86097f7a20cccbf6069ac37c4bb;hb=145a7fa1467c028f80e141a324950b2c47e34b7b;hp=44dabc1f89eab2a6064746f654a887eb88aed913;hpb=7c5de29b61de09b181672572164064ee3ca375cc;p=simgear.git diff --git a/simgear/sound/sample_group.cxx b/simgear/sound/sample_group.cxx index 44dabc1f..a5d19641 100644 --- a/simgear/sound/sample_group.cxx +++ b/simgear/sound/sample_group.cxx @@ -26,43 +26,13 @@ #include -#if defined (__APPLE__) -# ifdef __GNUC__ -# if ( __GNUC__ >= 3 ) && ( __GNUC_MINOR__ >= 3 ) -// # include -inline int (isnan)(double r) { return !(r <= 0 || r >= 0); } -# else - // any C++ header file undefines isinf and isnan - // so this should be included before - // the functions are STILL in libm (libSystem on mac os x) -extern "C" int isnan (double); -extern "C" int isinf (double); -# endif -# else -// inline int (isinf)(double r) { return isinf(r); } -// inline int (isnan)(double r) { return isnan(r); } -# endif -#endif - -#if defined (__FreeBSD__) -# if __FreeBSD_version < 500000 - extern "C" { - inline int isnan(double r) { return !(r <= 0 || r >= 0); } - } -# endif -#endif - -#if defined (__CYGWIN__) -# include -#endif - -#if defined(__MINGW32__) -# define isnan(x) _isnan(x) -#endif - #include "soundmgr_openal.hxx" #include "sample_group.hxx" +bool isNaN(float *v) { + return (isnan(v[0]) || isnan(v[1]) || isnan(v[2])); +} + SGSampleGroup::SGSampleGroup () : _smgr(NULL), _refname(""), @@ -119,9 +89,17 @@ void SGSampleGroup::update( double dt ) { unsigned int size = _removed_samples.size(); for (unsigned int i=0; iis_valid_source() ) { + if ( sample->is_looping() ) { + sample->no_valid_source(); + _smgr->release_source( sample->get_source() ); + } + else + alGetSourcei( sample->get_source(), AL_SOURCE_STATE, &result ); + } - alGetSourcei( sample->get_source(), AL_SOURCE_STATE, &result ); if ( result == AL_STOPPED ) { ALuint buffer = sample->get_buffer(); alDeleteBuffers( 1, &buffer ); @@ -158,7 +136,7 @@ void SGSampleGroup::update( double dt ) { sample->set_source( source ); update_sample_config( sample ); - ALboolean looping = sample->get_looping() ? AL_TRUE : AL_FALSE; + ALboolean looping = sample->is_looping() ? AL_TRUE : AL_FALSE; alSourcei( source, AL_LOOPING, looping ); alSourcef( source, AL_ROLLOFF_FACTOR, 1.0 ); alSourcei( source, AL_SOURCE_RELATIVE, AL_FALSE ); @@ -178,7 +156,7 @@ void SGSampleGroup::update( double dt ) { sample->stop(); sample->no_valid_source(); _smgr->release_source( sample->get_source() ); - } else { + } else if ( _smgr->has_changed() ) { update_sample_config( sample ); } @@ -195,6 +173,7 @@ void SGSampleGroup::update( double dt ) { sample->no_valid_source(); _smgr->release_source( source ); _smgr->release_buffer( sample ); + remove( sample->get_sample_name() ); } } testForALError("update"); @@ -202,7 +181,7 @@ void SGSampleGroup::update( double dt ) { } // add a sound effect, return true if successful -bool SGSampleGroup::add( SGSoundSample *sound, const string& refname ) { +bool SGSampleGroup::add( SGSharedPtr sound, const string& refname ) { sample_map_iterator sample_it = _samples.find( refname ); if ( sample_it != _samples.end() ) { @@ -329,7 +308,7 @@ bool SGSampleGroup::stop( const string& refname ) { } // set source velocity of all managed sounds -void SGSampleGroup::set_velocity( const SGVec3d &vel ) { +void SGSampleGroup::set_velocity( const SGVec3f &vel ) { if ( isnan(vel[0]) || isnan(vel[1]) || isnan(vel[2]) ) { SG_LOG( SG_GENERAL, SG_ALERT, "NAN's found in SampleGroup velocity"); @@ -389,43 +368,46 @@ void SGSampleGroup::set_volume( float vol ) } void SGSampleGroup::update_sample_config( SGSoundSample *sample ) { - if ( sample->is_valid_source() ) { - unsigned int source = sample->get_source(); - -#if 0 - if ( _tied_to_listener && _smgr->has_changed() ) { - alSourcefv( source, AL_POSITION, _smgr->get_position().data() ); - alSourcefv( source, AL_DIRECTION, _smgr->get_direction().data() ); - alSourcefv( source, AL_VELOCITY, _smgr->get_velocity().data() ); - } else { - alSourcefv( source, AL_POSITION, sample->get_position() ); - alSourcefv( source, AL_DIRECTION, sample->get_orientation() ); - alSourcefv( source, AL_VELOCITY, sample->get_velocity() ); - } -#else - alSourcefv( source, AL_POSITION, SGVec3f::zeros().data() ); - alSourcefv( source, AL_DIRECTION, SGVec3f::zeros().data() ); - alSourcefv( source, AL_VELOCITY, SGVec3f::zeros().data() ); -#endif - testForALError("position and orientation"); - - alSourcef( source, AL_PITCH, sample->get_pitch() ); - alSourcef( source, AL_GAIN, sample->get_volume() ); - testForALError("pitch and gain"); - - if ( sample->has_static_data_changed() ) { -#if 0 - alSourcef( source, AL_CONE_INNER_ANGLE, sample->get_innerangle() ); - alSourcef( source, AL_CONE_OUTER_ANGLE, sample->get_outerangle() ); - alSourcef( source, AL_CONE_OUTER_GAIN, sample->get_outergain() ); -#endif - testForALError("audio cone"); + SGVec3f orientation, velocity; + SGVec3d position; + + if ( _tied_to_listener ) { + orientation = _smgr->get_direction(); + position = _smgr->get_position(); + velocity = _smgr->get_velocity(); + } else { + sample->update_absolute_position(); + orientation = sample->get_orientation(); + position = sample->get_position(); + velocity = sample->get_velocity(); + } - alSourcef( source, AL_MAX_DISTANCE, sample->get_max_dist() ); - alSourcef( source, AL_REFERENCE_DISTANCE, - sample->get_reference_dist() ); - testForALError("distance rolloff"); - } + if (dist(position, _smgr->get_position()) > 10000) + printf("source and listener distance greater than 20km!\n"); + if (isNaN(toVec3f(position).data())) printf("NaN in source position\n"); + if (isNaN(orientation.data())) printf("NaN in source orientation\n"); + if (isNaN(velocity.data())) printf("NaN in source velocity\n"); + + unsigned int source = sample->get_source(); + alSourcefv( source, AL_POSITION, toVec3f(position).data() ); + alSourcefv( source, AL_VELOCITY, velocity.data() ); + alSourcefv( source, AL_DIRECTION, orientation.data() ); + testForALError("position and orientation"); + + alSourcef( source, AL_PITCH, sample->get_pitch() ); + alSourcef( source, AL_GAIN, sample->get_volume() ); + testForALError("pitch and gain"); + + if ( sample->has_static_data_changed() ) { + alSourcef( source, AL_CONE_INNER_ANGLE, sample->get_innerangle() ); + alSourcef( source, AL_CONE_OUTER_ANGLE, sample->get_outerangle() ); + alSourcef( source, AL_CONE_OUTER_GAIN, sample->get_outergain() ); + testForALError("audio cone"); + + alSourcef( source, AL_MAX_DISTANCE, sample->get_max_dist() ); + alSourcef( source, AL_REFERENCE_DISTANCE, + sample->get_reference_dist() ); + testForALError("distance rolloff"); } }