diff options
-rw-r--r-- | engines/made/pmvplayer.cpp | 5 | ||||
-rw-r--r-- | engines/made/sound.cpp | 21 | ||||
-rw-r--r-- | engines/made/sound.h | 17 |
3 files changed, 37 insertions, 6 deletions
diff --git a/engines/made/pmvplayer.cpp b/engines/made/pmvplayer.cpp index 6ea0dc24d0..453e2a4872 100644 --- a/engines/made/pmvplayer.cpp +++ b/engines/made/pmvplayer.cpp @@ -118,6 +118,8 @@ bool PmvPlayer::play(const char *filename) { // get it to work well? _audioStream = Audio::makeQueuingAudioStream(soundFreq, false); + SoundDecoderData *soundDecoderData = new SoundDecoderData(); + while (!_vm->shouldQuit() && !_aborted && !_fd->eos() && frameNumber < frameCount) { int32 frameTime = _vm->_system->getMillis(); @@ -153,7 +155,7 @@ bool PmvPlayer::play(const char *filename) { soundSize = chunkCount * chunkSize; soundData = (byte *)malloc(soundSize); - decompressSound(audioData + 8, soundData, chunkSize, chunkCount); + decompressSound(audioData + 8, soundData, chunkSize, chunkCount, NULL, soundDecoderData); _audioStream->queueBuffer(soundData, soundSize, DisposeAfterUse::YES, Audio::FLAG_UNSIGNED); } @@ -213,6 +215,7 @@ bool PmvPlayer::play(const char *filename) { } + delete soundDecoderData; delete[] frameData; _audioStream->finish(); 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 diff --git a/engines/made/sound.h b/engines/made/sound.h index 6ffca13aaa..72537322f9 100644 --- a/engines/made/sound.h +++ b/engines/made/sound.h @@ -53,7 +53,22 @@ struct SoundEnergyItem { typedef Common::Array<SoundEnergyItem> SoundEnergyArray; -void decompressSound(byte *source, byte *dest, uint16 chunkSize, uint16 chunkCount, SoundEnergyArray *soundEnergyArray = NULL); + +// Persistent data for decompressSound(). When calling decompressSound() +// repeatedly (for the same stream), pass the same SoundDecoderData object to +// ensure decoding properly resumes. +class SoundDecoderData { +public: + SoundDecoderData() { + memset(_soundBuffer, 0x80, sizeof(_soundBuffer)); + _prevSample = 0; + } + + byte _soundBuffer[1025]; + int16 _prevSample; +}; + +void decompressSound(byte *source, byte *dest, uint16 chunkSize, uint16 chunkCount, SoundEnergyArray *soundEnergyArray = NULL, SoundDecoderData *decoderData = NULL); } // End of namespace Made |