From: ehofman Date: Mon, 30 Nov 2009 14:22:40 +0000 (+0000) Subject: Updates to allow runtime chaning of the sound device X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=bc85767f197d8e039333202199fc2a2cc4d6e1b1;p=simgear.git Updates to allow runtime chaning of the sound device --- diff --git a/simgear/sound/sample_group.cxx b/simgear/sound/sample_group.cxx index 3cd0d9ae..de173dbd 100644 --- a/simgear/sound/sample_group.cxx +++ b/simgear/sound/sample_group.cxx @@ -261,6 +261,29 @@ SGSampleGroup::suspend () testForALError("suspend"); } +void +SGSampleGroup::stop () +{ + _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() ) { + if ( sample->is_playing() ) { + alSourcePause( sample->get_source() ); + } + _smgr->release_source( sample->get_source() ); + sample->no_valid_source(); + + _smgr->release_buffer( sample ); + sample->no_valid_buffer(); + } + } + testForALError("suspend"); +} + // resume playing all associated samples void SGSampleGroup::resume () diff --git a/simgear/sound/sample_group.hxx b/simgear/sound/sample_group.hxx index c0b0fdc6..d2d47394 100644 --- a/simgear/sound/sample_group.hxx +++ b/simgear/sound/sample_group.hxx @@ -128,6 +128,11 @@ public: */ SGSoundSample *find( const string& refname ); + /** + * Stop all playing samples and set the source id to invalid. + */ + void stop(); + /** * Request to stop playing all audio samples until further notice. */ diff --git a/simgear/sound/soundmgr_openal.cxx b/simgear/sound/soundmgr_openal.cxx index 2ccbcf55..6ead4d19 100644 --- a/simgear/sound/soundmgr_openal.cxx +++ b/simgear/sound/soundmgr_openal.cxx @@ -200,10 +200,18 @@ void SGSoundMgr::stop() { } _buffers.clear(); + sample_group_map_iterator sample_grp_current = _sample_groups.begin(); + sample_group_map_iterator sample_grp_end = _sample_groups.end(); + for ( ; sample_grp_current != sample_grp_end; ++sample_grp_current ) { + SGSampleGroup *sgrp = sample_grp_current->second; + sgrp->stop(); + } + _context = alcGetCurrentContext(); _device = alcGetContextsDevice(_context); alcDestroyContext(_context); alcCloseDevice(_device); + _context = NULL; } } @@ -213,7 +221,7 @@ void SGSoundMgr::suspend() { sample_group_map_iterator sample_grp_end = _sample_groups.end(); for ( ; sample_grp_current != sample_grp_end; ++sample_grp_current ) { SGSampleGroup *sgrp = sample_grp_current->second; - sgrp->suspend(); + sgrp->stop(); } _active = false; }