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; }