AUDIO: Fix Oki ADPCM to work with Mono streams using odd sized buffers.

This commit is contained in:
D G Turner 2012-08-04 18:38:12 +01:00
parent b79221729b
commit 9c47fdae29
2 changed files with 15 additions and 5 deletions

View File

@ -71,13 +71,19 @@ int Oki_ADPCMStream::readBuffer(int16 *buffer, const int numSamples) {
int samples;
byte data;
assert(numSamples % 2 == 0);
for (samples = 0; samples < numSamples && !_stream->eos() && (_stream->pos() < _endpos); samples++) {
if (_decodedSampleCount == 0) {
data = _stream->readByte();
_decodedSamples[0] = decodeOKI((data >> 4) & 0x0f);
_decodedSamples[1] = decodeOKI((data >> 0) & 0x0f);
_decodedSampleCount = 2;
}
for (samples = 0; samples < numSamples && !_stream->eos() && _stream->pos() < _endpos; samples += 2) {
data = _stream->readByte();
buffer[samples] = decodeOKI((data >> 4) & 0x0f);
buffer[samples + 1] = decodeOKI(data & 0x0f);
// (1 - (count - 1)) ensures that _decodedSamples acts as a FIFO of depth 2
buffer[samples] = _decodedSamples[1 - (_decodedSampleCount - 1)];
_decodedSampleCount--;
}
return samples;
}

View File

@ -89,6 +89,10 @@ public:
protected:
int16 decodeOKI(byte);
private:
uint8 _decodedSampleCount;
int16 _decodedSamples[2];
};
class Ima_ADPCMStream : public ADPCMStream {