From 6ac1d7c44997e1caf472c0511650c249e54c9bad Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Mon, 30 Aug 2004 04:03:39 +0000 Subject: [PATCH] avoid holding GameSoundManager lock while stopping sounds --- stepmania/src/GameSoundManager.cpp | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/stepmania/src/GameSoundManager.cpp b/stepmania/src/GameSoundManager.cpp index 721adbb79c..311ba90812 100644 --- a/stepmania/src/GameSoundManager.cpp +++ b/stepmania/src/GameSoundManager.cpp @@ -93,9 +93,12 @@ CHECKPOINT; CHECKPOINT; if( ToPlay.file.empty() ) { - if( g_Playing->m_Music->IsPlaying() ) - g_Playing->m_Music->StopPlaying(); - g_Playing->m_Music->Unload(); + /* StopPlaying() can take a while, so don't hold the lock while we stop. */ + MusicPlaying *pOldPlaying = g_Playing; + g_Playing = new MusicPlaying( new RageSound ); + L.Unlock(); + + delete pOldPlaying; return; } CHECKPOINT; @@ -105,6 +108,7 @@ CHECKPOINT; CHECKPOINT; /* See if we can find timing data, if it's not already loaded. */ + /* XXX: don't IsAFile while holding g_Mutex */ if( !ToPlay.HasTiming && IsAFile(ToPlay.timing_file) ) { LOG->Trace("Found '%s'", ToPlay.timing_file.c_str()); @@ -282,10 +286,13 @@ static void StartQueuedSounds() else { CHECKPOINT; - LockMutex L( *g_Mutex ); - if( g_Playing->m_Music->IsPlaying() ) - g_Playing->m_Music->StopPlaying(); - g_Playing->m_Music->Unload(); + /* StopPlaying() can take a while, so don't hold the lock while we stop. */ + g_Mutex->Lock(); + MusicPlaying *pOldPlaying = g_Playing; + g_Playing = new MusicPlaying( new RageSound ); + g_Mutex->Unlock(); + + delete pOldPlaying; } delete pMusic; }