aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
Diffstat (limited to 'engines')
-rw-r--r--engines/sci/sound/drivers/pc9801.cpp26
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) {