X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fsound%2Fsample_group.cxx;h=1da290593793eefd597196a2ce05e45ed6fce245;hb=47617d6c041cd806ae16944c2ace910c70981fe6;hp=9f486413faee02d7aef4890bb57728828efc872c;hpb=7c693d81076bef2b6e028179774256ab8393d707;p=simgear.git diff --git a/simgear/sound/sample_group.cxx b/simgear/sound/sample_group.cxx index 9f486413..1da29059 100644 --- a/simgear/sound/sample_group.cxx +++ b/simgear/sound/sample_group.cxx @@ -39,6 +39,7 @@ SGSampleGroup::SGSampleGroup () : _active(false), _changed(false), _pause(false), + _volume(1.0), _tied_to_listener(false), _velocity(SGVec3d::zeros()), _orientation(SGQuatd::zeros()) @@ -52,6 +53,7 @@ SGSampleGroup::SGSampleGroup ( SGSoundMgr *smgr, const string &refname ) : _active(false), _changed(false), _pause(false), + _volume(1.0), _tied_to_listener(false), _velocity(SGVec3d::zeros()), _orientation(SGQuatd::zeros()) @@ -242,9 +244,8 @@ SGSoundSample *SGSampleGroup::find( const string &refname ) { } -// stop playing all associated samples void -SGSampleGroup::suspend () +SGSampleGroup::stop () { _pause = true; sample_map_iterator sample_current = _samples.begin(); @@ -252,28 +253,60 @@ SGSampleGroup::suspend () for ( ; sample_current != sample_end; ++sample_current ) { SGSoundSample *sample = sample_current->second; - if ( sample->is_valid_source() && sample->is_playing() ) { - alSourcePause( sample->get_source() ); + if ( sample->is_valid_source() ) { + ALint source = sample->get_source(); + if ( sample->is_playing() ) { + alSourceStop( source ); + alSourcei( source, AL_BUFFER, 0 ); + } + _smgr->release_source( source ); + sample->no_valid_source(); + } + + if (sample->is_valid_buffer() ) { + _smgr->release_buffer( sample ); + sample->no_valid_buffer(); + } + } + testForALError("stop"); +} + +// stop playing all associated samples +void +SGSampleGroup::suspend () +{ + if (_pause == false) { + _pause = true; + sample_map_iterator sample_current = _samples.begin(); + sample_map_iterator sample_end = _samples.end(); + for ( ; sample_current != sample_end; ++sample_current ) { + SGSoundSample *sample = sample_current->second; + + if ( sample->is_valid_source() && sample->is_playing() ) { + alSourcePause( sample->get_source() ); + } } + testForALError("suspend"); } - testForALError("suspend"); } // resume playing all associated samples void SGSampleGroup::resume () { - sample_map_iterator sample_current = _samples.begin(); - sample_map_iterator sample_end = _samples.end(); - for ( ; sample_current != sample_end; ++sample_current ) { - SGSoundSample *sample = sample_current->second; - - if ( sample->is_valid_source() && sample->is_playing() ) { - alSourcePlay( sample->get_source() ); + if (_pause == true) { + sample_map_iterator sample_current = _samples.begin(); + sample_map_iterator sample_end = _samples.end(); + for ( ; sample_current != sample_end; ++sample_current ) { + SGSoundSample *sample = sample_current->second; + + if ( sample->is_valid_source() && sample->is_playing() ) { + alSourcePlay( sample->get_source() ); + } } + testForALError("resume"); + _pause = false; } - testForALError("resume"); - _pause = false; } @@ -315,9 +348,12 @@ bool SGSampleGroup::stop( const string& refname ) { void SGSampleGroup::set_volume( float vol ) { - _volume = vol; - if (_volume < 0.0) _volume = 0.0; - if (_volume > 1.0) _volume = 1.0; + if (vol > _volume*1.01 || vol < _volume*0.99) { + _volume = vol; + if (_volume < 0.0) _volume = 0.0; + if (_volume > 1.0) _volume = 1.0; + _changed = true; + } } // set the source position and orientation of all managed sounds @@ -359,6 +395,10 @@ void SGSampleGroup::update_sample_config( SGSoundSample *sample ) { velocity = sample->get_velocity(); } + if (_smgr->bad_doppler_effect()) { + velocity *= 100.0f; + } + #if 0 if (length(position) > 20000) printf("%s source and listener distance greater than 20km!\n",