diff options
author | Johannes Schickel | 2012-09-08 01:03:51 +0200 |
---|---|---|
committer | Johannes Schickel | 2012-09-08 01:16:10 +0200 |
commit | 892710a0a3610d21f7a716f9c48ca8a7702f999c (patch) | |
tree | 64fef3633f33932fe406d0ccbc77d7784bf6503d /engines/cine | |
parent | b48f5b78b759981a0c29b2d7ccbecc7bb0076a1b (diff) | |
download | scummvm-rg350-892710a0a3610d21f7a716f9c48ca8a7702f999c.tar.gz scummvm-rg350-892710a0a3610d21f7a716f9c48ca8a7702f999c.tar.bz2 scummvm-rg350-892710a0a3610d21f7a716f9c48ca8a7702f999c.zip |
CINE: Fix sfx channel use in Amiga and AtariST versions of FW.
This fixes a channel assignment issue in opcode 119. This also implements
opcode 120, which is basically a stereo channel swapped version of 119
(o1_playSample).
This affects the Amiga and AtariST versions. I put a TODO to check the DOS
version here.
Diffstat (limited to 'engines/cine')
-rw-r--r-- | engines/cine/script.h | 1 | ||||
-rw-r--r-- | engines/cine/script_fw.cpp | 55 |
2 files changed, 52 insertions, 4 deletions
diff --git a/engines/cine/script.h b/engines/cine/script.h index 3fc86c585b..a07c8d6cfc 100644 --- a/engines/cine/script.h +++ b/engines/cine/script.h @@ -227,6 +227,7 @@ protected: int o1_op72(); int o1_op73(); int o1_playSample(); + int o1_playSampleSwapped(); int o1_disableSystemMenu(); int o1_loadMask5(); int o1_unloadMask5(); diff --git a/engines/cine/script_fw.cpp b/engines/cine/script_fw.cpp index a4e7314a67..b4fe68c343 100644 --- a/engines/cine/script_fw.cpp +++ b/engines/cine/script_fw.cpp @@ -196,7 +196,7 @@ void FWScript::setupTable() { { 0, 0 }, { &FWScript::o1_playSample, "bbwbww" }, /* 78 */ - { &FWScript::o1_playSample, "bbwbww" }, + { &FWScript::o1_playSampleSwapped, "bbwbww" }, { &FWScript::o1_disableSystemMenu, "b" }, { &FWScript::o1_loadMask5, "b" }, { &FWScript::o1_unloadMask5, "b" } @@ -1828,8 +1828,8 @@ int FWScript::o1_playSample() { channel1 = 0; channel2 = 1; } else { - channel1 = 2; - channel2 = 3; + channel1 = 3; + channel2 = 2; } g_sound->playSound(channel1, freq, data, size, -1, volume, 63, repeat); g_sound->playSound(channel2, freq, data, size, 1, volume, 0, repeat); @@ -1863,6 +1863,53 @@ int FWScript::o1_playSample() { return 0; } +int FWScript::o1_playSampleSwapped() { + // TODO: The DOS version probably does not have any stereo support here + // since the only stereo output it supports should be the Roland MT-32. + // So it probably does the same as o1_playSample here. Checking this will + // be a good idea never the less. + if (g_cine->getPlatform() == Common::kPlatformPC) { + return o1_playSample(); + } + + debugC(5, kCineDebugScript, "Line: %d: playSampleInversed()", _line); + + byte anim = getNextByte(); + byte channel = getNextByte(); + + uint16 freq = getNextWord(); + byte repeat = getNextByte(); + + int16 volume = getNextWord(); + uint16 size = getNextWord(); + + const byte *data = g_cine->_animDataTable[anim].data(); + + if (!data) { + return 0; + } + + if (size == 0xFFFF) { + size = g_cine->_animDataTable[anim]._width * g_cine->_animDataTable[anim]._height; + } else if (size > g_cine->_animDataTable[anim]._width * g_cine->_animDataTable[anim]._height) { + warning("o1_playSampleSwapped: Got invalid sample size %d for sample %d", size, anim); + size = g_cine->_animDataTable[anim]._width * g_cine->_animDataTable[anim]._height; + } + + int channel1, channel2; + if (channel == 0) { + channel1 = 1; + channel2 = 0; + } else { + channel1 = 2; + channel2 = 3; + } + + g_sound->playSound(channel1, freq, data, size, -1, volume, 63, repeat); + g_sound->playSound(channel2, freq, data, size, 1, volume, 0, repeat); + return 0; +} + int FWScript::o1_disableSystemMenu() { byte param = getNextByte(); @@ -2747,7 +2794,7 @@ void decompileScript(const byte *scriptPtr, uint16 scriptSize, uint16 scriptIdx) if (opcode - 1 == 0x77) { sprintf(lineBuffer, "playSample(%d,%d,%d,%d,%d,%d)\n", param1, param2, param3, param4, param5, param6); } else if (opcode - 1 == 0x78) { - sprintf(lineBuffer, "OP_78(%d,%d,%d,%d,%d,%d)\n", param1, param2, param3, param4, param5, param6); + sprintf(lineBuffer, "playSampleSwapped(%d,%d,%d,%d,%d,%d)\n", param1, param2, param3, param4, param5, param6); } break; |