diff options
author | Eugene Sandulenko | 2010-10-18 19:10:57 +0000 |
---|---|---|
committer | Eugene Sandulenko | 2010-10-18 19:10:57 +0000 |
commit | c92d2bc234f2f73a9629b3622cd5e66c57439cda (patch) | |
tree | 3dd962bf27f0467b8356e81845d71d64abacd53a /sound/decoders | |
parent | 05b3f2a0711df91230bf39587c9eed4da36e1afa (diff) | |
download | scummvm-rg350-c92d2bc234f2f73a9629b3622cd5e66c57439cda.tar.gz scummvm-rg350-c92d2bc234f2f73a9629b3622cd5e66c57439cda.tar.bz2 scummvm-rg350-c92d2bc234f2f73a9629b3622cd5e66c57439cda.zip |
SOUND: Add support for LastExpress version of IMA ADPCM sound.
Patch by littleboy.
svn-id: r53578
Diffstat (limited to 'sound/decoders')
-rw-r--r-- | sound/decoders/adpcm.cpp | 13 | ||||
-rw-r--r-- | sound/decoders/adpcm.h | 17 |
2 files changed, 18 insertions, 12 deletions
diff --git a/sound/decoders/adpcm.cpp b/sound/decoders/adpcm.cpp index c8a907d13e..8a27658e4b 100644 --- a/sound/decoders/adpcm.cpp +++ b/sound/decoders/adpcm.cpp @@ -290,8 +290,8 @@ int Apple_ADPCMStream::readBuffer(int16 *buffer, const int numSamples) { class MSIma_ADPCMStream : public Ima_ADPCMStream { public: - MSIma_ADPCMStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse, uint32 size, int rate, int channels, uint32 blockAlign) - : Ima_ADPCMStream(stream, disposeAfterUse, size, rate, channels, blockAlign) { + MSIma_ADPCMStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse, uint32 size, int rate, int channels, uint32 blockAlign, bool invertSamples = false) + : Ima_ADPCMStream(stream, disposeAfterUse, size, rate, channels, blockAlign), _invertSamples(invertSamples) { if (blockAlign == 0) error("ADPCMStream(): blockAlign isn't specified for MS IMA ADPCM"); } @@ -305,6 +305,9 @@ public: int readBufferMSIMA1(int16 *buffer, const int numSamples); int readBufferMSIMA2(int16 *buffer, const int numSamples); + +private: + bool _invertSamples; // Some implementations invert the way samples are decoded }; int MSIma_ADPCMStream::readBufferMSIMA1(int16 *buffer, const int numSamples) { @@ -324,8 +327,8 @@ int MSIma_ADPCMStream::readBufferMSIMA1(int16 *buffer, const int numSamples) { for (; samples < numSamples && _blockPos[0] < _blockAlign && !_stream->eos() && _stream->pos() < _endpos; samples += 2) { data = _stream->readByte(); _blockPos[0]++; - buffer[samples] = decodeIMA(data & 0x0f); - buffer[samples + 1] = decodeIMA((data >> 4) & 0x0f); + buffer[samples] = decodeIMA(_invertSamples ? (data >> 4) & 0x0f : data & 0x0f); + buffer[samples + 1] = decodeIMA(_invertSamples ? data & 0x0f : (data >> 4) & 0x0f); } } return samples; @@ -733,6 +736,8 @@ RewindableAudioStream *makeADPCMStream(Common::SeekableReadStream *stream, Dispo return new Oki_ADPCMStream(stream, disposeAfterUse, size, rate, channels, blockAlign); case kADPCMMSIma: return new MSIma_ADPCMStream(stream, disposeAfterUse, size, rate, channels, blockAlign); + case kADPCMMSImaLastExpress: + return new MSIma_ADPCMStream(stream, disposeAfterUse, size, rate, channels, blockAlign, true); case kADPCMMS: return new MS_ADPCMStream(stream, disposeAfterUse, size, rate, channels, blockAlign); case kADPCMTinsel4: diff --git a/sound/decoders/adpcm.h b/sound/decoders/adpcm.h index 04dbb1a521..edcdc01ce9 100644 --- a/sound/decoders/adpcm.h +++ b/sound/decoders/adpcm.h @@ -50,14 +50,15 @@ class RewindableAudioStream; // Usually, if the audio stream we're trying to play has the FourCC header // string intact, it's easy to discern which encoding is used enum typesADPCM { - kADPCMOki, // Dialogic/Oki ADPCM (aka VOX) - kADPCMMSIma, // Microsoft IMA ADPCM - kADPCMMS, // Microsoft ADPCM - kADPCMTinsel4, // 4-bit ADPCM used by the Tinsel engine - kADPCMTinsel6, // 6-bit ADPCM used by the Tinsel engine - kADPCMTinsel8, // 8-bit ADPCM used by the Tinsel engine - kADPCMIma, // Standard IMA ADPCM - kADPCMApple // Apple QuickTime IMA ADPCM + kADPCMOki, // Dialogic/Oki ADPCM (aka VOX) + kADPCMMSIma, // Microsoft IMA ADPCM + kADPCMMSImaLastExpress, // Microsoft IMA ADPCM (with inverted samples) + kADPCMMS, // Microsoft ADPCM + kADPCMTinsel4, // 4-bit ADPCM used by the Tinsel engine + kADPCMTinsel6, // 6-bit ADPCM used by the Tinsel engine + kADPCMTinsel8, // 8-bit ADPCM used by the Tinsel engine + kADPCMIma, // Standard IMA ADPCM + kADPCMApple // Apple QuickTime IMA ADPCM }; /** |