diff options
author | Arnaud Boutonné | 2010-01-03 18:04:52 +0000 |
---|---|---|
committer | Arnaud Boutonné | 2010-01-03 18:04:52 +0000 |
commit | 0cfd6a4d769a8aae2dbd442a0b7e09ff0c94ee7c (patch) | |
tree | 7c04b3446d7c705698d2fac7292d52ae3d9924a6 | |
parent | 6cc4dacf5ee6919cbd41aa6b0e35b16ba424b4c5 (diff) | |
download | scummvm-rg350-0cfd6a4d769a8aae2dbd442a0b7e09ff0c94ee7c.tar.gz scummvm-rg350-0cfd6a4d769a8aae2dbd442a0b7e09ff0c94ee7c.tar.bz2 scummvm-rg350-0cfd6a4d769a8aae2dbd442a0b7e09ff0c94ee7c.zip |
Fix a buffer overflow (thanks to syke) and modify the way the instruments are loaded (bytes instead of uint16). This (sadly) doesn't fix the MDY player.
svn-id: r46936
-rw-r--r-- | engines/gob/sound/adlib.cpp | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/engines/gob/sound/adlib.cpp b/engines/gob/sound/adlib.cpp index 1f1851e387..f925fc5b47 100644 --- a/engines/gob/sound/adlib.cpp +++ b/engines/gob/sound/adlib.cpp @@ -132,7 +132,7 @@ int AdLib::readBuffer(int16 *buffer, const int numSamples) { } void AdLib::writeOPL(byte reg, byte val) { - debugC(6, kDebugSound, "writeOPL(%02X, %02X)", reg, val); + debugC(6, kDebugSound, "AdLib::writeOPL (%02X, %02X)", reg, val); OPLWriteReg(_opl, reg, val); } @@ -243,10 +243,12 @@ void AdLib::setKey(byte voice, byte note, bool on, bool spec) { writeOPL(0xB0 + voice, (freq >> 8) | (octa << 2) | 0x20 * on); if (!freq) - warning("AdLib: Voice %d, note %02X unknown", voice, note); + warning("AdLib::setKey Voice %d, note %02X unknown", voice, note); } void AdLib::setVolume(byte voice, byte volume) { + debugC(6, kDebugSound, "AdLib::setVolume(%d, %d)", voice, volume); + //assert(voice >= 0 && voice <= 9); volume = 0x3F - ((volume * 0x7E) + 0x7F) / 0xFE; writeOPL(0x40 + _volRegNums[voice], volume); } @@ -513,6 +515,8 @@ bool MDYPlayer::loadMDY(Common::SeekableReadStream &stream) { _nrCommand = mdyHeader[46] + (mdyHeader[47] << 8) + (mdyHeader[48] << 16) + (mdyHeader[49] << 24); // _soundMode is either 0 (melodic) or 1 (percussive) _soundMode = mdyHeader[58]; + assert((_soundMode == 0) || (_soundMode == 1)); + _pitchBendRangeStep = 25*mdyHeader[59]; _basicTempo = mdyHeader[60] + (mdyHeader[61] << 8); @@ -597,6 +601,7 @@ void MDYPlayer::interpret() { uint8 ctrlByte1, ctrlByte2; uint8 timbre; +// TODO : Verify the loop for percussive mode (11 ?) if (_first) { for (int i = 0; i < 9; i ++) setVolume(i, 0); @@ -609,7 +614,7 @@ void MDYPlayer::interpret() { } do { instr = *_playPos; -// printf("instr 0x%X\n", instr); + debugC(6, kDebugSound,"MDYPlayer::interpret instr 0x%X", instr); switch (instr) { case 0xF8: _wait = *(_playPos++); @@ -622,6 +627,7 @@ void MDYPlayer::interpret() { _playPos++; ctrlByte1 = *(_playPos++); ctrlByte2 = *(_playPos++); + debugC(6, kDebugSound,"MDYPlayer::interpret ctrlBytes 0x%X 0x%X", ctrlByte1, ctrlByte2); if (ctrlByte1 != 0x7F || ctrlByte2 != 0) { _playPos -= 2; while (*(_playPos++) != 0xF7) @@ -721,11 +727,11 @@ void MDYPlayer::setVoices() { byte *timbrePtr; timbrePtr = _timbres; - debugC(6, kDebugSound, "TBR version: %X.%X", timbrePtr[0], timbrePtr[1]); + debugC(6, kDebugSound, "MDYPlayer::setVoices TBR version: %X.%X", timbrePtr[0], timbrePtr[1]); timbrePtr += 2; _tbrCount = READ_LE_UINT16(timbrePtr); - debugC(6, kDebugSound, "Timbres counter: %d", _tbrCount); + debugC(6, kDebugSound, "MDYPlayer::setVoices Timbres counter: %d", _tbrCount); timbrePtr += 2; _tbrStart = READ_LE_UINT16(timbrePtr); @@ -735,7 +741,8 @@ void MDYPlayer::setVoices() { } void MDYPlayer::setVoice(byte voice, byte instr, bool set) { - uint16 strct[27]; +// uint16 strct[27]; + uint8 strct[27]; byte channel; byte *timbrePtr; char timbreName[10]; @@ -743,7 +750,7 @@ void MDYPlayer::setVoice(byte voice, byte instr, bool set) { timbreName[9] = '\0'; for (int j = 0; j < 9; j++) timbreName[j] = _timbres[6 + j + (instr * 9)]; - debugC(6, kDebugSound, "Loading timbre %s", timbreName); + debugC(6, kDebugSound, "MDYPlayer::setVoice Loading timbre %s", timbreName); // i = 0 : 0 1 2 3 4 5 6 7 8 9 10 11 12 26 // i = 1 : 13 14 15 16 17 18 19 20 21 22 23 24 25 27 @@ -755,8 +762,10 @@ void MDYPlayer::setVoice(byte voice, byte instr, bool set) { (uint32) (timbrePtr - _timbres), _timbresSize); strct[j] = 0; } else - strct[j] = READ_LE_UINT16(timbrePtr); - timbrePtr += 2; + //strct[j] = READ_LE_UINT16(timbrePtr); + strct[j] = timbrePtr[0]; + //timbrePtr += 2; + timbrePtr++; } channel = _operators[voice] + i * 3; writeOPL(0xBD, 0x00); |