diff options
Diffstat (limited to 'al')
-rw-r--r-- | al/buffer.cpp | 204 |
1 files changed, 2 insertions, 202 deletions
diff --git a/al/buffer.cpp b/al/buffer.cpp index e4b97c7e..8534fa54 100644 --- a/al/buffer.cpp +++ b/al/buffer.cpp @@ -64,191 +64,6 @@ namespace { -constexpr int MaxAdpcmChannels{2}; - -/* IMA ADPCM Stepsize table */ -constexpr int IMAStep_size[89] = { - 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, - 21, 23, 25, 28, 31, 34, 37, 41, 45, 50, 55, - 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, - 173, 190, 209, 230, 253, 279, 307, 337, 371, 408, 449, - 494, 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282, - 1411, 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327, 3660, - 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493,10442, - 11487,12635,13899,15289,16818,18500,20350,22358,24633,27086,29794, - 32767 -}; - -/* IMA4 ADPCM Codeword decode table */ -constexpr int IMA4Codeword[16] = { - 1, 3, 5, 7, 9, 11, 13, 15, - -1,-3,-5,-7,-9,-11,-13,-15, -}; - -/* IMA4 ADPCM Step index adjust decode table */ -constexpr int IMA4Index_adjust[16] = { - -1,-1,-1,-1, 2, 4, 6, 8, - -1,-1,-1,-1, 2, 4, 6, 8 -}; - - -/* MSADPCM Adaption table */ -constexpr int MSADPCMAdaption[16] = { - 230, 230, 230, 230, 307, 409, 512, 614, - 768, 614, 512, 409, 307, 230, 230, 230 -}; - -/* MSADPCM Adaption Coefficient tables */ -constexpr int MSADPCMAdaptionCoeff[7][2] = { - { 256, 0 }, - { 512, -256 }, - { 0, 0 }, - { 192, 64 }, - { 240, 0 }, - { 460, -208 }, - { 392, -232 } -}; - - -void DecodeIMA4Block(int16_t *dst, const al::byte *src, size_t numchans, size_t align) -{ - int sample[MaxAdpcmChannels]{}; - int index[MaxAdpcmChannels]{}; - ALuint code[MaxAdpcmChannels]{}; - - for(size_t c{0};c < numchans;c++) - { - sample[c] = src[0] | (src[1]<<8); - sample[c] = (sample[c]^0x8000) - 32768; - src += 2; - index[c] = src[0] | (src[1]<<8); - index[c] = clampi((index[c]^0x8000) - 32768, 0, 88); - src += 2; - - *(dst++) = static_cast<int16_t>(sample[c]); - } - - for(size_t i{1};i < align;i++) - { - if((i&7) == 1) - { - for(size_t c{0};c < numchans;c++) - { - code[c] = ALuint{src[0]} | (ALuint{src[1]}<< 8) | (ALuint{src[2]}<<16) - | (ALuint{src[3]}<<24); - src += 4; - } - } - - for(size_t c{0};c < numchans;c++) - { - const ALuint nibble{code[c]&0xf}; - code[c] >>= 4; - - sample[c] += IMA4Codeword[nibble] * IMAStep_size[index[c]] / 8; - sample[c] = clampi(sample[c], -32768, 32767); - - index[c] += IMA4Index_adjust[nibble]; - index[c] = clampi(index[c], 0, 88); - - *(dst++) = static_cast<int16_t>(sample[c]); - } - } -} - -void DecodeMSADPCMBlock(int16_t *dst, const al::byte *src, size_t numchans, size_t align) -{ - uint8_t blockpred[MaxAdpcmChannels]{}; - int delta[MaxAdpcmChannels]{}; - int16_t samples[MaxAdpcmChannels][2]{}; - - for(size_t c{0};c < numchans;c++) - { - blockpred[c] = std::min<ALubyte>(src[0], 6); - ++src; - } - for(size_t c{0};c < numchans;c++) - { - delta[c] = src[0] | (src[1]<<8); - delta[c] = (delta[c]^0x8000) - 32768; - src += 2; - } - for(size_t c{0};c < numchans;c++) - { - samples[c][0] = static_cast<ALshort>(src[0] | (src[1]<<8)); - src += 2; - } - for(size_t c{0};c < numchans;c++) - { - samples[c][1] = static_cast<ALshort>(src[0] | (src[1]<<8)); - src += 2; - } - - /* Second sample is written first. */ - for(size_t c{0};c < numchans;c++) - *(dst++) = samples[c][1]; - for(size_t c{0};c < numchans;c++) - *(dst++) = samples[c][0]; - - int num{0}; - for(size_t i{2};i < align;i++) - { - for(size_t c{0};c < numchans;c++) - { - /* Read the nibble (first is in the upper bits). */ - al::byte nibble; - if(!(num++ & 1)) - nibble = *src >> 4; - else - nibble = *(src++) & 0x0f; - - int pred{(samples[c][0]*MSADPCMAdaptionCoeff[blockpred[c]][0] + - samples[c][1]*MSADPCMAdaptionCoeff[blockpred[c]][1]) / 256}; - pred += ((nibble^0x08) - 0x08) * delta[c]; - pred = clampi(pred, -32768, 32767); - - samples[c][1] = samples[c][0]; - samples[c][0] = static_cast<int16_t>(pred); - - delta[c] = (MSADPCMAdaption[nibble] * delta[c]) / 256; - delta[c] = maxi(16, delta[c]); - - *(dst++) = static_cast<int16_t>(pred); - } - } -} - -void Convert_int16_ima4(int16_t *dst, const al::byte *src, size_t numchans, size_t len, - size_t align) -{ - assert(numchans <= MaxAdpcmChannels); - const size_t byte_align{((align-1)/2 + 4) * numchans}; - - len /= align; - while(len--) - { - DecodeIMA4Block(dst, src, numchans, align); - src += byte_align; - dst += align*numchans; - } -} - -void Convert_int16_msadpcm(int16_t *dst, const al::byte *src, size_t numchans, size_t len, - size_t align) -{ - assert(numchans <= MaxAdpcmChannels); - const size_t byte_align{((align-2)/2 + 7) * numchans}; - - len /= align; - while(len--) - { - DecodeMSADPCMBlock(dst, src, numchans, align); - src += byte_align; - dst += align*numchans; - } -} - - ALuint BytesFromUserFmt(UserFmtType type) noexcept { switch(type) @@ -1108,23 +923,8 @@ START_API_FUNC "Sub-range length %d is not a multiple of frame size %d (%d unpack alignment)", length, byte_align, align); - const size_t samplen{static_cast<ALuint>(length)/byte_align * align}; - void *dst = albuf->mData.data() + offset; - if(usrfmt->type == UserFmtIMA4 && albuf->mType == FmtShort) - { - Convert_int16_ima4(static_cast<int16_t*>(dst), static_cast<const al::byte*>(data), - num_chans, samplen, align); - } - else if(usrfmt->type == UserFmtMSADPCM && albuf->mType == FmtShort) - { - Convert_int16_msadpcm(static_cast<int16_t*>(dst), - static_cast<const al::byte*>(data), num_chans, samplen, align); - } - else - { - assert(al::to_underlying(usrfmt->type) == al::to_underlying(albuf->mType)); - memcpy(dst, data, static_cast<ALuint>(length)); - } + assert(al::to_underlying(usrfmt->type) == al::to_underlying(albuf->mType)); + memcpy(albuf->mData.data()+offset, data, static_cast<ALuint>(length)); } END_API_FUNC |