diff options
-rw-r--r-- | sword2/driver/d_sound.cpp | 56 | ||||
-rw-r--r-- | sword2/driver/d_sound.h | 4 | ||||
-rw-r--r-- | sword2/function.cpp | 13 |
3 files changed, 62 insertions, 11 deletions
diff --git a/sword2/driver/d_sound.cpp b/sword2/driver/d_sound.cpp index 6dabc572ac..e4020b370b 100644 --- a/sword2/driver/d_sound.cpp +++ b/sword2/driver/d_sound.cpp @@ -308,6 +308,62 @@ int32 Sword2Sound::ReverseStereo(void) { return RD_OK; } +// Save/Restore information about current music so that we can restore it +// after the credits. + +void Sword2Sound::saveMusicState() { + StackLock lock(_mutex); + + int saveStream; + + if (music[0]._streaming && !music[0]._fading) { + saveStream = 0; + } else if (music[1]._streaming && !music[0]._fading) { + saveStream = 1; + } else { + music[2]._streaming = false; + return; + } + + music[2]._streaming = true; + music[2]._fading = 0; + music[2]._looping = music[saveStream]._looping; + music[2]._fileStart = music[saveStream]._fileStart; + music[2]._filePos = music[saveStream]._filePos; + music[2]._fileEnd = music[saveStream]._fileEnd; + music[2]._lastSample = music[saveStream]._lastSample; +} + +void Sword2Sound::restoreMusicState() { + StackLock lock(_mutex); + + int restoreStream; + + if (!music[2]._streaming) + return; + + // Fade out any music that happens to be playing + + for (int i = 0; i < MAXMUS; i++) { + if (music[i]._streaming && !music[i]._fading) + music[i]._fading = FADE_SAMPLES; + } + + if (!music[0]._streaming && !music[0]._fading) { + restoreStream = 0; + } else { + restoreStream = 1; + } + + music[restoreStream]._streaming = true; + music[restoreStream]._fading = 0; + music[restoreStream]._looping = music[2]._looping; + music[restoreStream]._fileStart = music[2]._fileStart; + music[restoreStream]._filePos = music[2]._filePos; + music[restoreStream]._fileEnd = music[2]._fileEnd; + music[restoreStream]._lastSample = music[2]._lastSample; +} + // -------------------------------------------------------------------------- // This function returns the index of the sound effect with the ID passed in. // -------------------------------------------------------------------------- diff --git a/sword2/driver/d_sound.h b/sword2/driver/d_sound.h index 2d59a1d625..520a320446 100644 --- a/sword2/driver/d_sound.h +++ b/sword2/driver/d_sound.h @@ -100,6 +100,8 @@ class Sword2Sound { int32 PauseMusic(void); int32 UnpauseMusic(void); int32 StreamCompMusic(const char *filename, uint32 musicId, bool looping); + void saveMusicState(); + void restoreMusicState(); int32 MusicTimeRemaining(); int32 ReverseStereo(void); uint8 GetFxVolume(void); @@ -129,7 +131,7 @@ class Sword2Sound { RateConverter *_converter; FxHandle fx[MAXFX]; - MusicHandle music[MAXMUS]; + MusicHandle music[MAXMUS + 1]; // We used to have two music volumes - one for each channel - // but they were always set to the same value. diff --git a/sword2/function.cpp b/sword2/function.cpp index aa265ca8de..b2aae47b38 100644 --- a/sword2/function.cpp +++ b/sword2/function.cpp @@ -391,13 +391,12 @@ int32 FN_play_credits(int32 *params) { uint8 oldPal[1024]; uint8 tmpPal[1024]; int32 music_length; - uint32 safe_looping_music_id; int32 pars[2]; // FIXME: We need a better method for saving/restoring the // music state as this one only restarts looping music. - safe_looping_music_id = looping_music_id; + g_sound->saveMusicState(); g_sound->MuteFx(1); g_sound->MuteSpeech(1); @@ -446,14 +445,8 @@ int32 FN_play_credits(int32 *params) { g_system->delay_msecs(30); } - looping_music_id = safe_looping_music_id; - - if (looping_music_id) { - pars[0] = looping_music_id; - pars[1] = FX_LOOP; - FN_play_music(pars); - } else - FN_stop_music(NULL); + FN_stop_music(NULL); + g_sound->restoreMusicState(); BS2_SetPalette(0, 256, oldPal, RDPAL_FADE); FadeUp(0.75); |