diff options
-rw-r--r-- | engines/sci/sound/drivers/pc9801.cpp | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/engines/sci/sound/drivers/pc9801.cpp b/engines/sci/sound/drivers/pc9801.cpp index 8a1521a0e2..2b99d6b2a2 100644 --- a/engines/sci/sound/drivers/pc9801.cpp +++ b/engines/sci/sound/drivers/pc9801.cpp @@ -111,7 +111,7 @@ protected: private: virtual void programChange(uint8 program) = 0; - virtual void prepareFrequencyAndVolume(bool updateVolume); + virtual bool prepareFrequencyAndVolume(bool updateVolume); virtual void sendSoundOnOff(bool noteOn) = 0; virtual void sendFrequency() = 0; virtual void sendVolume() = 0; @@ -156,7 +156,7 @@ public: private: void programChange(uint8 program); - void prepareFrequencyAndVolume(bool updateVolume); + bool prepareFrequencyAndVolume(bool updateVolume); void processSounds(); void sendSoundOnOff(bool noteOn); void sendVolume(); @@ -406,7 +406,9 @@ void SoundChannel_PC9801::processNoteEvent(uint8 note, bool noteOn) { _flags |= kChanVbrRestartEnv; } - prepareFrequencyAndVolume(noteOn); + if (!prepareFrequencyAndVolume(noteOn)) + noteOn = false; + sendSoundOnOff(noteOn); } @@ -480,6 +482,8 @@ int SoundChannel_PC9801::recalculateFrequency(uint16 note, uint16 modifier, uint if (_type != 2) res |= (block << 11); + else if (block == 0) + return -1; if (pb) res += (((pb * pitchVbrMultiplier) & 0x0FF0) >> 8); @@ -591,12 +595,15 @@ void SoundChannel_PC9801::writeReg(uint8 part, uint8 reg, uint8 val) { _pc98a->writeReg(part, reg, val); } -void SoundChannel_PC9801::prepareFrequencyAndVolume(bool updateVolume) { +bool SoundChannel_PC9801::prepareFrequencyAndVolume(bool updateVolume) { if (recalculateFrequency(_note, 0, &_frequencyBlock, &_frequencyCourse, &_frequencyNoteModifier) == -1) - return; + return false; + sendFrequency(); if (updateVolume) sendVolume(); + + return true; } SoundChannel_PC9801_FM4OP::SoundChannel_PC9801_FM4OP(uint8 id, PC98AudioCore *pc98a, MidiPart_PC9801 **parts, SciVersion version, SciSpan<const uint8> instrumentData, uint8 patchSize, bool &soundOn) @@ -736,14 +743,17 @@ void SoundChannel_PC9801_FM2OP::programChange(uint8 program) { writeReg(_regPrt, i, data[pos++]); } -void SoundChannel_PC9801_FM2OP::prepareFrequencyAndVolume(bool updateVolume) { +bool SoundChannel_PC9801_FM2OP::prepareFrequencyAndVolume(bool updateVolume) { if (recalculateFrequency(_note, _opFreqOffset[_operatorFrqIndex[0]], 0, &_frequencyCourse, &_frequencyNoteModifier) == -1) - return; + return false; if (recalculateFrequency(_note, _opFreqOffset[_operatorFrqIndex[1]], 0, &_frequencyCourse2, &_frequencyNoteModifier2) == -1) - return; + return false; + sendFrequency(); if (updateVolume) sendVolume(); + + return true; } void SoundChannel_PC9801_FM2OP::sendSoundOnOff(bool noteOn) { |