X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fsound%2Fsample_group.cxx;h=1610d088fbfabb3871d290ad5670866ee36e81fa;hb=bcb320b537b6f7e5e3724e8a30d309322171eb43;hp=e2a2b2c73188894f89daeca7316ebd5946ff5910;hpb=5d5906e980fa5468a7bfbbcc3bfae0f0e48979e2;p=simgear.git diff --git a/simgear/sound/sample_group.cxx b/simgear/sound/sample_group.cxx index e2a2b2c7..1610d088 100644 --- a/simgear/sound/sample_group.cxx +++ b/simgear/sound/sample_group.cxx @@ -103,9 +103,12 @@ void SGSampleGroup::update( double dt ) { } if ( result == AL_STOPPED ) { - ALuint buffer = sample->get_buffer(); - alDeleteBuffers( 1, &buffer ); - testForALError("buffer remove"); + sample->stop(); + if ( !sample->is_queue() ) { + ALuint buffer = sample->get_buffer(); + alDeleteBuffers( 1, &buffer ); + testForALError("buffer remove"); + } _removed_samples.erase( _removed_samples.begin()+i ); size--; continue; @@ -128,44 +131,44 @@ void SGSampleGroup::update( double dt ) { // // a request to start playing a sound has been filed. // - if ( _smgr->request_buffer(sample) == SGSoundMgr::NO_BUFFER ) - continue; - - // start playing the sample - ALuint buffer = sample->get_buffer(); ALuint source = _smgr->request_source(); - if (alIsSource(source) == AL_TRUE && alIsBuffer(buffer) == AL_TRUE) + if (alIsSource(source) == AL_TRUE ) { - sample->set_source( source ); - - alSourcei( source, AL_BUFFER, buffer ); - testForALError("assign buffer to source"); - - sample->set_source( source ); - update_sample_config( sample ); - ALboolean looping = sample->is_looping() ? AL_TRUE : AL_FALSE; - alSourcei( source, AL_LOOPING, looping ); - alSourcef( source, AL_ROLLOFF_FACTOR, 0.3 ); - alSourcei( source, AL_SOURCE_RELATIVE, AL_FALSE ); - alSourcePlay( source ); - testForALError("sample play"); - } else { - if (alIsBuffer(buffer) == AL_FALSE) - SG_LOG( SG_GENERAL, SG_ALERT, "No such buffer!\n"); - // sample->no_valid_source(); - // sadly, no free source available at this time - } - - } else if ( sample->is_valid_source() && sample->has_changed() ) { - if ( !sample->is_playing() ) { - // a request to stop playing the sound has been filed. - - sample->stop(); - sample->no_valid_source(); - _smgr->release_source( sample->get_source() ); - } else if ( _smgr->has_changed() ) { - update_sample_config( sample ); + if ( sample->is_queue() ) + { + sample->set_source( source ); + update_sample_config( sample ); + + alSourcef( source, AL_ROLLOFF_FACTOR, 0.3 ); + alSourcei( source, AL_LOOPING, looping ); + alSourcei( source, AL_SOURCE_RELATIVE, AL_FALSE ); + alSourcePlay( source ); + testForALError("sample play"); + } + else + { + if (_smgr->request_buffer(sample) == SGSoundMgr::NO_BUFFER) + continue; + + // start playing the sample + ALuint buffer = sample->get_buffer(); + if ( alIsBuffer(buffer) == AL_TRUE ) + { + alSourcei( source, AL_BUFFER, buffer ); + testForALError("assign buffer to source"); + + sample->set_source( source ); + update_sample_config( sample ); + + alSourcei( source, AL_LOOPING, looping ); + alSourcef( source, AL_ROLLOFF_FACTOR, 0.3 ); + alSourcei( source, AL_SOURCE_RELATIVE, AL_FALSE ); + alSourcePlay( source ); + testForALError("sample play"); + } else + SG_LOG( SG_GENERAL, SG_ALERT, "No such buffer!\n"); + } } } else if ( sample->is_valid_source() ) { @@ -183,6 +186,18 @@ void SGSampleGroup::update( double dt ) { _smgr->release_buffer( sample ); remove( sample->get_sample_name() ); } + else + if ( sample->has_changed() ) { + if ( !sample->is_playing() ) { + // a request to stop playing the sound has been filed. + sample->stop(); + sample->no_valid_source(); + _smgr->release_source( sample->get_source() ); + } else if ( _smgr->has_changed() ) { + update_sample_config( sample ); + } + } + } testForALError("update"); } @@ -213,6 +228,7 @@ bool SGSampleGroup::remove( const string &refname ) { if ( sample_it->second->is_valid_buffer() ) _removed_samples.push_back( sample_it->second ); + _samples.erase( sample_it ); return true; @@ -257,13 +273,12 @@ SGSampleGroup::stop () 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() ) { + if ( sample->is_valid_buffer() ) { _smgr->release_buffer( sample ); sample->no_valid_buffer(); }