From 4b6fc4dba0f02c228981968121cb338bc3c8a564 Mon Sep 17 00:00:00 2001 From: Cary Sandvig Date: Fri, 30 Mar 2001 21:38:35 +0000 Subject: [PATCH] woo! make a copy of the cursed set to use durring update. so there! --- panda/src/audio/audio_manager.I | 5 ++++- panda/src/audio/audio_manager.cxx | 19 ++++++++++++++++--- panda/src/audio/audio_manager.h | 2 ++ 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/panda/src/audio/audio_manager.I b/panda/src/audio/audio_manager.I index f283164075..baef5e7752 100644 --- a/panda/src/audio/audio_manager.I +++ b/panda/src/audio/audio_manager.I @@ -21,7 +21,10 @@ INLINE void AudioManager::play(AudioSound* sound, float start_time) { INLINE void AudioManager::update(void) { if (!audio_is_active) return; - mutex_lock l(_manager_mutex); + { + mutex_lock l(_manager_mutex); + get_ptr()->copy_loopset(); + } if (_update_func != (UpdateFunc*)0L) (*_update_func)(); get_ptr()->ns_update(); diff --git a/panda/src/audio/audio_manager.cxx b/panda/src/audio/audio_manager.cxx index 0f0deb929c..1aec1f6f21 100644 --- a/panda/src/audio/audio_manager.cxx +++ b/panda/src/audio/audio_manager.cxx @@ -15,6 +15,7 @@ mutex AudioManager::_manager_mutex; bool* AudioManager::_quit = (bool*)0L; thread* AudioManager::_spawned = (thread*)0L; AudioManager::LoopSet* AudioManager::_loopset = (AudioManager::LoopSet*)0L; +AudioManager::LoopSet* AudioManager::_loopcopy = (AudioManager::LoopSet*)0L; //////////////////////////////////////////////////////////////////// // Function: AudioManager::destructor @@ -39,6 +40,19 @@ void AudioManager::set_update_func(AudioManager::UpdateFunc* func) { _update_func = func; } +//////////////////////////////////////////////////////////////////// +// Function: AudioManager::copy_loopset +// Access: Public, Static +// Description: make a copy of the loopset to use for the rest of +// update +//////////////////////////////////////////////////////////////////// +void AudioManager::copy_loopset(void) { + if (_loopcopy == (LoopSet*)0L) + _loopcopy = new LoopSet; + if (_loopset != (LoopSet*)0L) + *_loopcopy = *_loopset; +} + //////////////////////////////////////////////////////////////////// // Function: AudioManager::ns_update // Access: Public, Static @@ -46,10 +60,9 @@ void AudioManager::set_update_func(AudioManager::UpdateFunc* func) { //////////////////////////////////////////////////////////////////// void AudioManager::ns_update(void) { // handle looping - if (_loopset != (LoopSet*)0L) - for (LoopSet::iterator i=_loopset->begin(); i!=_loopset->end();) { + if (_loopcopy != (LoopSet*)0L) + for (LoopSet::iterator i=_loopcopy->begin(); i!=_loopcopy->end(); ++i) { AudioSound* sound = *i; - ++i; // because the sound may be removed from the set durring this if (sound->status() == AudioSound::READY) { if (audio_cat->is_debug()) audio_cat->debug() << "AudioManager::ns_update looping '" diff --git a/panda/src/audio/audio_manager.h b/panda/src/audio/audio_manager.h index e1c2837285..04e73577cf 100644 --- a/panda/src/audio/audio_manager.h +++ b/panda/src/audio/audio_manager.h @@ -18,6 +18,7 @@ class EXPCL_PANDA AudioManager { private: INLINE AudioManager(void); + void copy_loopset(void); void ns_play(AudioSound*, float); void ns_stop(AudioSound*); void ns_set_loop(AudioSound*, bool); @@ -41,6 +42,7 @@ private: static bool* _quit; static thread* _spawned; static LoopSet* _loopset; + static LoopSet* _loopcopy; public: virtual ~AudioManager(void);