aboutsummaryrefslogtreecommitdiffstats
path: root/al/buffer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'al/buffer.cpp')
-rw-r--r--al/buffer.cpp204
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