diff options
-rw-r--r-- | engines/sci/sound/midiparser_sci.cpp | 10 | ||||
-rw-r--r-- | engines/sci/sound/soundcmd.cpp | 15 |
2 files changed, 14 insertions, 11 deletions
diff --git a/engines/sci/sound/midiparser_sci.cpp b/engines/sci/sound/midiparser_sci.cpp index 4e54797960..0e5672460d 100644 --- a/engines/sci/sound/midiparser_sci.cpp +++ b/engines/sci/sound/midiparser_sci.cpp @@ -475,7 +475,13 @@ void MidiParser_SCI::parseNextEvent(EventInfo &info) { case 0xC: info.basic.param1 = *(_position._playPos++); info.basic.param2 = 0; - if (info.channel() == 0xF) {// SCI special case + // Normally, song signalling events are sent through the special SCI + // channel 15. There are some songs where that special channel is + // missing completely, and the signals are sent through the other + // channels. Such a case is the Windows version of KQ5CD, songs 1840, + // 1843 and 1849 (bug #3605269). Therefore, we check if channel 15 is + // present, and if not, we accept signals from all other channels. + if (info.channel() == 0xF || !_channelUsed[15]) { // SCI special channel if (info.basic.param1 != kSetSignalLoop) { // At least in kq5/french&mac the first scene in the intro has // a song that sets signal to 4 immediately on tick 0. Signal @@ -491,6 +497,8 @@ void MidiParser_SCI::parseNextEvent(EventInfo &info) { _position._playTick || info.delta) { _signalSet = true; _signalToSet = info.basic.param1; + debugC(kDebugLevelSound, "Setting signal of song %d to %d from channel %d", + _pSnd->resourceId, _signalToSet, info.channel()); } } else { _loopTick = _position._playTick + info.delta; diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index 9450e7796d..db357054d4 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -177,16 +177,11 @@ void SoundCommandParser::processPlaySound(reg_t obj) { writeSelectorValue(_segMan, obj, SELECTOR(state), kSoundPlaying); } - // WORKAROUND: Songs 1840, 1843 and 1849 in the Windows version of KQ5CD - // are all missing their channel 15 (all played during its ending - // sequences, when fighting with Mordack). This makes the game scripts - // wait indefinitely for the missing signals in these songs. In the - // original interpreter, this bug manifests as an "Out of heap" error. We - // signal the game scripts to stop waiting forever by setting the song's - // dataInc selector to something other than 0. This causes Mordack's - // appearing animation to occur a bit earlier than expected, but at least - // the game doesn't freeze at that point. Fixes bug #3605269. - if (g_sci->getGameId() == GID_KQ5 && (resourceId == 1840 || resourceId == 1843 || resourceId == 1849)) + // WORKAROUND: Song 1849 in the Windows version of KQ5CD does not have + // correct signalling data, causing the game scripts to wait indefinitely + // for the missing signal. We signal the game scripts to stop waiting + // forever by setting the song's dataInc selector to something other than 0 + if (g_sci->getGameId() == GID_KQ5 && resourceId == 1849) writeSelectorValue(_segMan, obj, SELECTOR(dataInc), 1); musicSlot->loop = readSelectorValue(_segMan, obj, SELECTOR(loop)); |