diff options
author | Johannes Schickel | 2006-02-28 17:02:14 +0000 |
---|---|---|
committer | Johannes Schickel | 2006-02-28 17:02:14 +0000 |
commit | 1e2aa59bcbc5d913eb3db92c4026a1f6618b2228 (patch) | |
tree | 9da71f830daf17abb115f70ce0b9b8244fe30815 | |
parent | 6ee443f316992fc7c784311360e582185be55ae6 (diff) | |
download | scummvm-rg350-1e2aa59bcbc5d913eb3db92c4026a1f6618b2228.tar.gz scummvm-rg350-1e2aa59bcbc5d913eb3db92c4026a1f6618b2228.tar.bz2 scummvm-rg350-1e2aa59bcbc5d913eb3db92c4026a1f6618b2228.zip |
Added lock() and unlock() again to readBuffer.
Implemented stateCallback1_1.
Fix some small bugs here and there (can't say what the fixed but it should be correct now)
Also set's the correct timer call value (with the other the music was too fast)
svn-id: r20973
-rw-r--r-- | engines/kyra/sound_adlib.cpp | 117 |
1 files changed, 89 insertions, 28 deletions
diff --git a/engines/kyra/sound_adlib.cpp b/engines/kyra/sound_adlib.cpp index 077245bb98..c9d3b25a88 100644 --- a/engines/kyra/sound_adlib.cpp +++ b/engines/kyra/sound_adlib.cpp @@ -53,7 +53,9 @@ public: // AudioStream API int readBuffer(int16 *buffer, const int numSamples) { memset(buffer, 0, sizeof(int16)*numSamples); + lock(); YM3812UpdateOne(_adlib, buffer, numSamples); + unlock(); return numSamples; } @@ -336,7 +338,7 @@ AdlibDriver::AdlibDriver(Audio::Mixer *mixer) { _mixer->setupPremix(this); // the interval should be around 13000 to 20000 - Common::g_timer->installTimerProc(&AdlibTimerCall, 17000, this); + Common::g_timer->installTimerProc(&AdlibTimerCall, 19000, this); } AdlibDriver::~AdlibDriver() { @@ -529,8 +531,7 @@ void AdlibDriver::callbackOutput() { uint8 *ptr = _soundData; ptr += READ_LE_UINT16(&ptr[_soundIdTable[_lastProcessed] << 1]); - uint8 index = *ptr++; // set nullvar - + uint8 index = *ptr++; OutputState &table = _outputTables[index]; int8 unk2 = *ptr++; @@ -564,7 +565,6 @@ void AdlibDriver::callbackProcess() { table.unk1 = _unkTableByte1; } - // TODO: check that table.unk4 += table.unk1; if (table.unk4 < 0) { if (--table.unk5) { @@ -581,7 +581,6 @@ void AdlibDriver::callbackProcess() { opcode = command & 0x7F; if (opcode > 0x4A) opcode = 0x4A; - //debug("'%s' (%d) (%d)", _parserOpcodeTable[opcode].name, opcode, _curTable); opcode = (this->*(_parserOpcodeTable[opcode].function))(table.dataptr, table, (command & 0xFF00) >> 8); --opcode; if (opcode >= 0) @@ -642,11 +641,7 @@ void AdlibDriver::waitLoops(int count) { } void AdlibDriver::initTable(OutputState &table) { - uint8 unk27BackUp = table.unk27; - - memset(&table, 0, sizeof(OutputState)); - - table.unk27 = unk27BackUp; + memset(&table.dataptr, 0, sizeof(OutputState) - ((char*)&table.dataptr - (char*)&table)); table.unk1 = -1; table.unk2 = 0; @@ -700,19 +695,19 @@ uint16 AdlibDriver::updateUnk6Value() { _unk6 += 0x9248; uint16 lowBits = _unk6 & 7; _unk6 >>= 3; - _unk6 |= lowBits << 12; + _unk6 |= lowBits << 13; return _unk6; } void AdlibDriver::update1(uint8 unk1, OutputState &state) { _continueFlag = unk1; if (state.unk11) { - state.unk5 = (updateUnk6Value() & 0xFF) + (unk1 & state.unk11); + state.unk5 = unk1 + (updateUnk6Value() & state.unk11); return; } uint8 value = unk1; if (state.unk12) { - uint8 value2 = value; + uint8 value2 = 0; uint8 add = value >> 3; int loops = state.unk12; while (loops--) { @@ -746,7 +741,7 @@ void AdlibDriver::updateAndOutput1(uint8 unk1, OutputState &state) { value = (value & 0xFF) | (unk2 << 8); if (state.unk16 != 0) { - if (state.unk16 >= 0) { + if (state.unk16 > 0) { const uint8 *table = _unkTables[(state.unk13 & 0x0F) + 2]; value += table[state.unk16]; } else { @@ -824,9 +819,41 @@ void AdlibDriver::output1(OutputState &state) { void AdlibDriver::stateCallback1_1(OutputState &state) { state.unk31 += state.unk29; - if ((int8)state.unk31 < 0) + if ((int8)state.unk31 >= 0) return; - warning("stateCallback1_1 unimplemented"); + uint16 unk1 = ((state.unkOutputValue1 & 3) << 8) | state.unk17; + uint16 unk2 = ((state.unkOutputValue1 & 0x20) << 8) | (state.unkOutputValue1 & 0x1C); + int16 unk3 = (int16)state.unk30; + + if (unk3 >= 0) { + unk1 += unk3; + if (unk1 >= 734) { + unk1 >>= 1; + if (!(unk1 & 0x3FF)) + ++unk1; + unk2 += 4; + unk2 &= 0xFF1C; + } + } else { + unk1 += unk3; + if (unk1 < 388) { + unk1 <<= 1; + if (!(unk1 & 0x3FF)) + --unk1; + unk2 -= 4; + unk2 &= 0xFF1C; + } + } + unk1 &= 0x3FF; + + output0x388(((0xA0 + _curTable) << 8) | (unk1 & 0xFF)); + state.unk17 = unk1 & 0xFF; + + uint8 value = unk1 >> 8; + value |= (unk2 >> 8) & 0xFF; + value |= unk2 & 0xFF; + output0x388(((0xB0 + _curTable) << 8) | value); + state.unkOutputValue1 = value; } void AdlibDriver::stateCallback1_2(OutputState &state) { @@ -878,11 +905,9 @@ uint8 AdlibDriver::calculateLowByte1(OutputState &state) { } if (value > 0x3F) { - if (value < 0) - value = 0; - else - value = 0x3F; - } + value = 0x3F; + } else if (value < 0) + value = 0; return value | (state.unk24 & 0xC0); } @@ -894,11 +919,9 @@ uint8 AdlibDriver::calculateLowByte2(OutputState &state) { value += state.unk28; if (value > 0x3F) { - if (value < 0) - value = 0; - else - value = 0x3F; - } + value = 0x3F; + } else if (value < 0) + value = 0; return value | (state.unk25 & 0xC0); } @@ -1018,7 +1041,7 @@ int AdlibDriver::updateCallback14(uint8 *&dataptr, OutputState &state, uint8 val } int AdlibDriver::updateCallback15(uint8 *&dataptr, OutputState &state, uint8 value) { - OutputState &state2 = _outputTables[_curTable]; + OutputState &state2 = _outputTables[value]; state2.unk5 = 0; state2.unk2 = 0; state2.dataptr = 0; @@ -1038,7 +1061,7 @@ int AdlibDriver::updateCallback16(uint8 *&dataptr, OutputState &state, uint8 val int AdlibDriver::updateCallback17(uint8 *&dataptr, OutputState &state, uint8 value) { uint8 *ptr = _soundData; - ptr += READ_LE_UINT16(_soundData + value * 2 + 0x1F4); + ptr += READ_LE_UINT16(_soundData + (value << 1) + 0x1F4); updateAndOutput2(_unkOutputByte1, ptr, state); return 0; } @@ -1641,78 +1664,115 @@ const AdlibDriver::OpcodeEntry AdlibDriver::_opcodeList[] = { }; const AdlibDriver::ParserOpcode AdlibDriver::_parserOpcodeTable[] = { + // 0 COMMAND(updateCallback1), COMMAND(updateCallback2), COMMAND(updateCallback3), COMMAND(updateCallback4), + + // 4 COMMAND(updateCallback5), COMMAND(updateCallbackPushDataPtr), COMMAND(updateCallbackPopDataPtr), COMMAND(updateCallback8), + + // 8 COMMAND(updateCallback9), COMMAND(updateCallback10), COMMAND(updateCallback11), COMMAND(updateCallback12), + + // 12 COMMAND(updateCallback13), COMMAND(updateCallback14), COMMAND(updateCallback15), COMMAND(updateCallback16), + + // 16 COMMAND(updateCallback17), COMMAND(updateCallback18), COMMAND(updateCallback19), COMMAND(updateCallback20), + + // 20 COMMAND(updateCallback9), COMMAND(updateCallback21), COMMAND(updateCallback9), COMMAND(updateCallback9), + + // 24 COMMAND(updateCallback9), COMMAND(updateCallback9), COMMAND(updateCallback22), COMMAND(updateCallback9), + + // 28 COMMAND(updateCallback23), COMMAND(updateCallback24), COMMAND(updateCallback25), COMMAND(updateCallback9), + + // 32 COMMAND(updateCallback26), COMMAND(updateCallback27), COMMAND(updateCallback9), COMMAND(updateCallback9), + + // 36 COMMAND(updateCallback28), COMMAND(updateCallback9), COMMAND(updateCallback29), COMMAND(updateCallback30), + + // 40 COMMAND(updateCallback9), COMMAND(updateCallback31), COMMAND(updateCallback9), COMMAND(updateCallback32), + + // 44 COMMAND(updateCallback33), COMMAND(updateCallback34), COMMAND(updateCallback35), COMMAND(updateCallback36), + + // 48 COMMAND(updateCallback37), COMMAND(updateCallback9), COMMAND(updateCallback9), COMMAND(updateCallback38), + + // 52 COMMAND(updateCallback9), COMMAND(updateCallback39), COMMAND(updateCallback40), COMMAND(updateCallback9), + + // 56 COMMAND(updateCallback9), COMMAND(updateCallback41), COMMAND(updateCallback42), COMMAND(updateCallback43), + + // 60 COMMAND(updateCallback44), COMMAND(updateCallback45), COMMAND(updateCallback9), COMMAND(updateCallback46), + + // 64 COMMAND(updateCallback47), COMMAND(updateCallback48), COMMAND(updateCallback49), COMMAND(updateCallback50), + + // 68 COMMAND(updateCallback51), COMMAND(updateCallback52), COMMAND(updateCallback53), COMMAND(updateCallback54), + + // 72 COMMAND(updateCallback55), COMMAND(updateCallback56), COMMAND(updateCallback9) @@ -1910,6 +1970,7 @@ void SoundAdlibPC::playTrack(uint8 track, bool looping) { } void SoundAdlibPC::haltTrack() { + playSoundEffect(0); } void SoundAdlibPC::startTrack() { |