diff options
author | Willem Jan Palenstijn | 2015-07-19 20:24:49 +0200 |
---|---|---|
committer | Willem Jan Palenstijn | 2015-07-19 20:26:50 +0200 |
commit | 1a4f477d61704f85a235228f9f2d12077b369930 (patch) | |
tree | 220ba4c662dd39fe341da47c27ef59d5ef31384a /engines/made/sound.cpp | |
parent | b52d48e0da709e6b78bf08a3cf4b2df3e100b500 (diff) | |
download | scummvm-rg350-1a4f477d61704f85a235228f9f2d12077b369930.tar.gz scummvm-rg350-1a4f477d61704f85a235228f9f2d12077b369930.tar.bz2 scummvm-rg350-1a4f477d61704f85a235228f9f2d12077b369930.zip |
MADE: Fix movie audio glitches caused by reset of audio decoder
The sound buffer used in decompressSound() is now stored so that
it can be re-used in the next call of decompressSound, specifically
in chunk type 1.
This caused some clicking/static in the intro of Return to Zork.
Thanks to eriktorbjorn for noticing the glitch and writing most of the patch.
Diffstat (limited to 'engines/made/sound.cpp')
-rw-r--r-- | engines/made/sound.cpp | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/engines/made/sound.cpp b/engines/made/sound.cpp index 91e855cbf5..cf602a92bf 100644 --- a/engines/made/sound.cpp +++ b/engines/made/sound.cpp @@ -133,10 +133,10 @@ void ManholeEgaSoundDecompressor::update3() { _sample2 += _sample1; } -void decompressSound(byte *source, byte *dest, uint16 chunkSize, uint16 chunkCount, SoundEnergyArray *soundEnergyArray) { +void decompressSound(byte *source, byte *dest, uint16 chunkSize, uint16 chunkCount, SoundEnergyArray *soundEnergyArray, SoundDecoderData *soundDecoderData) { - int16 prevSample = 0, workSample = 0; - byte soundBuffer[1025]; + int16 prevSample, workSample; + byte* soundBuffer; byte deltaSoundBuffer[1024]; int16 soundBuffer2[16]; byte deltaType, type; @@ -159,6 +159,15 @@ void decompressSound(byte *source, byte *dest, uint16 chunkSize, uint16 chunkCou if (soundEnergyArray) soundEnergyArray->clear(); + if (soundDecoderData) { + soundBuffer = soundDecoderData->_soundBuffer; + prevSample = soundDecoderData->_prevSample; + } else { + soundBuffer = new byte[1025]; + memset(soundBuffer, 0x80, 1025); + prevSample = 0; + } + while (chunkCount--) { deltaType = (*source) >> 6; workChunkSize = chunkSize; @@ -255,9 +264,13 @@ void decompressSound(byte *source, byte *dest, uint16 chunkSize, uint16 chunkCou prevSample = workSample; memcpy(dest, soundBuffer, chunkSize); dest += chunkSize; - } + if (soundDecoderData) { + soundDecoderData->_prevSample = prevSample; + } else { + delete[] soundBuffer; + } } } // End of namespace Made |