aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/sci/sound/music.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp
index 0ed99c154b..8656203736 100644
--- a/engines/sci/sound/music.cpp
+++ b/engines/sci/sound/music.cpp
@@ -442,6 +442,25 @@ void SciMusic::soundPlay(MusicEntry *pSnd) {
if (pSnd->pMidiParser) {
Common::StackLock lock(_mutex);
pSnd->pMidiParser->mainThreadBegin();
+
+ if (pSnd->status != kSoundPaused) {
+ // Stop any in progress music fading, as that will reset the
+ // volume of the sound channels that the faded song occupies..
+ // Fixes bug #3266480 and partially fixes bug #3041738.
+ for (uint i = 0; i < playListCount; i++) {
+ // Is another MIDI song being faded? If yes, stop it
+ // immediately instead
+ if (_playList[i]->fadeStep && _playList[i]->pMidiParser) {
+ _playList[i]->status = kSoundStopped;
+ if (_soundVersion <= SCI_VERSION_0_LATE)
+ _playList[i]->isQueued = false;
+ _playList[i]->pMidiParser->stop();
+ freeChannels(_playList[i]);
+ _playList[i]->fadeStep = 0;
+ }
+ }
+ }
+
pSnd->pMidiParser->tryToOwnChannels();
if (pSnd->status != kSoundPaused)
pSnd->pMidiParser->sendInitCommands();