aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/sci/resource.cpp100
1 files changed, 48 insertions, 52 deletions
diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp
index 9afcba13e4..61c5ca92dd 100644
--- a/engines/sci/resource.cpp
+++ b/engines/sci/resource.cpp
@@ -2080,64 +2080,60 @@ SoundResource::Track *SoundResource::getDigitalTrack() {
int SoundResource::getChannelFilterMask(int hardwareMask, bool wantsRhythm) {
byte *data = _innerResource->data;
int channelMask = 0;
- int reverseHardwareMask = 0;
- switch (_soundVersion) {
- case SCI_VERSION_0_EARLY:
- // TODO: MT32 driver uses no hardware mask at all and uses all channels
- switch (hardwareMask) {
- case 0x01: // AdLib needs an additional reverse check against bit 3
- reverseHardwareMask = 0x08;
- break;
- }
- data++; // Skip over digital sample flag
- // Now all 16 channels follow. Each one is specified by a single byte
- // Upper 4 bits of the byte is a voices count
- // Lower 4 bits -> bit 0 means use as AdLib driver
- // bit 1 means use as PCjr driver
- // bit 3 means is control channel (bit 0 needs to be unset)
- for (int channelNr = 0; channelNr < 16; channelNr++) {
- channelMask = channelMask >> 1;
- if (*data & hardwareMask) {
- if ((reverseHardwareMask == 0) || ((*data & reverseHardwareMask) == 0)) {
- // This Channel is supposed to get played for hardware
- channelMask |= 0x8000;
- }
- }
- if ((*data & 0x08) && ((*data & 0x01) == 0)) {
- // This channel is control channel, so don't filter it
- channelMask |= 0x8000;
- // TODO: We need to accept this channel in parseNextEvent() for events
- }
- data++;
- }
- break;
+ if (_soundVersion > SCI_VERSION_0_LATE)
+ return 0;
- case SCI_VERSION_0_LATE:
- data++; // Skip over digital sample flag
- // Now all 16 channels follow. Each one is specified by 2 bytes
- // 1st byte is voices count
- // 2nd byte is play mask, which specifies if the channel is supposed to be played
- // by the corresponding hardware
- for (int channelNr = 0; channelNr < 16; channelNr++) {
- data++;
- channelMask = channelMask >> 1;
- if (*data & hardwareMask) {
- // This Channel is supposed to be played by the hardware
- channelMask |= 0x8000;
- }
+ data++; // Skip over digital sample flag
+
+ for (int channelNr = 0; channelNr < 16; channelNr++) {
+ channelMask = channelMask >> 1;
+
+ byte flags;
+
+ if (_soundVersion == SCI_VERSION_0_EARLY) {
+ // Each channel is specified by a single byte
+ // Upper 4 bits of the byte is a voices count
+ // Lower 4 bits -> bit 0 set: use for AdLib
+ // bit 1 set: use for PCjr
+ // bit 2 set: use for PC speaker
+ // bit 3 set and bit 0 clear: control channel (15)
+ // bit 3 set and bit 0 set: rhythm channel (9)
+ flags = *data++;
+
+ // Get device bits
+ flags &= 0x7;
+ } else {
+ // Each channel is specified by 2 bytes
+ // 1st byte is voices count
+ // 2nd byte is play mask, which specifies if the channel is supposed to be played
+ // by the corresponding hardware
+
+ // Skip voice count
data++;
+
+ flags = *data++;
}
- // Play channel 15 at all times (control channel)
- channelMask |= 0x8000;
- channelMask &= ~(1 << 9);
- if (wantsRhythm)
- channelMask |= (1 << 9);
+ bool play;
+ switch (channelNr) {
+ case 15:
+ // Always play control channel
+ play = true;
+ break;
+ case 9:
+ // Play rhythm channel when requested
+ play = wantsRhythm;
+ break;
+ default:
+ // Otherwise check for flag
+ play = flags & hardwareMask;
+ }
- break;
- default:
- break;
+ if (play) {
+ // This Channel is supposed to be played by the hardware
+ channelMask |= 0x8000;
+ }
}
return channelMask;