diff options
| author | jacqueline <me@jacqueline.id.au> | 2023-08-04 20:07:44 +1000 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2023-08-04 20:07:44 +1000 |
| commit | 60f767713227b5405b855e6e6e2a0475ecd96bcc (patch) | |
| tree | fe55b7048e9e7f1f587f465a1845aef9d3b7b731 /src/codecs/sample.cpp | |
| parent | 3b240d1cd5c52caf189ca036a1a841f7e6d84ccd (diff) | |
| download | tangara-fw-60f767713227b5405b855e6e6e2a0475ecd96bcc.tar.gz | |
Do our own resampling
Diffstat (limited to 'src/codecs/sample.cpp')
| -rw-r--r-- | src/codecs/sample.cpp | 275 |
1 files changed, 275 insertions, 0 deletions
diff --git a/src/codecs/sample.cpp b/src/codecs/sample.cpp new file mode 100644 index 00000000..7bf14197 --- /dev/null +++ b/src/codecs/sample.cpp @@ -0,0 +1,275 @@ +#include "sample.hpp" + +namespace audio { + +namespace sample { + +void siconv(int* dst, uint8_t* src, int bits, int skip, int count) { + int i, v, s, b; + + b = (bits + 7) / 8; + s = sizeof(int) * 8 - bits; + while (count--) { + v = 0; + i = b; + switch (b) { + case 4: + v = src[--i]; + case 3: + v = (v << 8) | src[--i]; + case 2: + v = (v << 8) | src[--i]; + case 1: + v = (v << 8) | src[--i]; + } + *dst++ = v << s; + src += skip; + } +} + +void Siconv(int* dst, uint8_t* src, int bits, int skip, int count) { + int i, v, s, b; + + b = (bits + 7) / 8; + s = sizeof(int) * 8 - bits; + while (count--) { + v = 0; + i = 0; + switch (b) { + case 4: + v = src[i++]; + case 3: + v = (v << 8) | src[i++]; + case 2: + v = (v << 8) | src[i++]; + case 1: + v = (v << 8) | src[i]; + } + *dst++ = v << s; + src += skip; + } +} + +void uiconv(int* dst, uint8_t* src, int bits, int skip, int count) { + int i, s, b; + uint32_t v; + + b = (bits + 7) / 8; + s = sizeof(uint32_t) * 8 - bits; + while (count--) { + v = 0; + i = b; + switch (b) { + case 4: + v = src[--i]; + case 3: + v = (v << 8) | src[--i]; + case 2: + v = (v << 8) | src[--i]; + case 1: + v = (v << 8) | src[--i]; + } + *dst++ = (v << s) - (~0UL >> 1); + src += skip; + } +} + +void Uiconv(int* dst, uint8_t* src, int bits, int skip, int count) { + int i, s, b; + uint32_t v; + + b = (bits + 7) / 8; + s = sizeof(uint32_t) * 8 - bits; + while (count--) { + v = 0; + i = 0; + switch (b) { + case 4: + v = src[i++]; + case 3: + v = (v << 8) | src[i++]; + case 2: + v = (v << 8) | src[i++]; + case 1: + v = (v << 8) | src[i]; + } + *dst++ = (v << s) - (~0UL >> 1); + src += skip; + } +} + +void ficonv(int* dst, uint8_t* src, int bits, int skip, int count) { + if (bits == 32) { + while (count--) { + float f; + + f = *((float*)src), src += skip; + if (f > 1.0) + *dst++ = INT32_MAX; + else if (f < -1.0) + *dst++ = INT32_MIN; + else + *dst++ = f * ((float)INT32_MAX); + } + } else { + while (count--) { + double d; + + d = *((double*)src), src += skip; + if (d > 1.0) + *dst++ = INT32_MAX; + else if (d < -1.0) + *dst++ = INT32_MIN; + else + *dst++ = d * ((double)INT32_MAX); + } + } +} + +void aiconv(int* dst, uint8_t* src, int, int skip, int count) { + int t, seg; + uint8_t a; + + while (count--) { + a = *src, src += skip; + a ^= 0x55; + t = (a & 0xf) << 4; + seg = (a & 0x70) >> 4; + switch (seg) { + case 0: + t += 8; + break; + case 1: + t += 0x108; + break; + default: + t += 0x108; + t <<= seg - 1; + } + t = (a & 0x80) ? t : -t; + *dst++ = t << (sizeof(int) * 8 - 16); + } +} + +void µiconv(int* dst, uint8_t* src, int, int skip, int count) { + int t; + uint8_t u; + + while (count--) { + u = *src, src += skip; + u = ~u; + t = ((u & 0xf) << 3) + 0x84; + t <<= (u & 0x70) >> 4; + t = u & 0x80 ? 0x84 - t : t - 0x84; + *dst++ = t << (sizeof(int) * 8 - 16); + } +} + +void soconv(int* src, uint8_t* dst, int bits, int skip, int count) { + int i, v, s, b; + + b = (bits + 7) / 8; + s = sizeof(int) * 8 - bits; + while (count--) { + v = *src++ >> s; + i = 0; + switch (b) { + case 4: + dst[i++] = v, v >>= 8; + case 3: + dst[i++] = v, v >>= 8; + case 2: + dst[i++] = v, v >>= 8; + case 1: + dst[i] = v; + } + dst += skip; + } +} + +void Soconv(int* src, uint8_t* dst, int bits, int skip, int count) { + int i, v, s, b; + + b = (bits + 7) / 8; + s = sizeof(int) * 8 - bits; + while (count--) { + v = *src++ >> s; + i = b; + switch (b) { + case 4: + dst[--i] = v, v >>= 8; + case 3: + dst[--i] = v, v >>= 8; + case 2: + dst[--i] = v, v >>= 8; + case 1: + dst[--i] = v; + } + dst += skip; + } +} + +void uoconv(int* src, uint8_t* dst, int bits, int skip, int count) { + int i, s, b; + uint32_t v; + + b = (bits + 7) / 8; + s = sizeof(uint32_t) * 8 - bits; + while (count--) { + v = ((~0UL >> 1) + *src++) >> s; + i = 0; + switch (b) { + case 4: + dst[i++] = v, v >>= 8; + case 3: + dst[i++] = v, v >>= 8; + case 2: + dst[i++] = v, v >>= 8; + case 1: + dst[i] = v; + } + dst += skip; + } +} + +void Uoconv(int* src, uint8_t* dst, int bits, int skip, int count) { + int i, s, b; + uint32_t v; + + b = (bits + 7) / 8; + s = sizeof(uint32_t) * 8 - bits; + while (count--) { + v = ((~0UL >> 1) + *src++) >> s; + i = b; + switch (b) { + case 4: + dst[--i] = v, v >>= 8; + case 3: + dst[--i] = v, v >>= 8; + case 2: + dst[--i] = v, v >>= 8; + case 1: + dst[--i] = v; + } + dst += skip; + } +} + +void foconv(int* src, uint8_t* dst, int bits, int skip, int count) { + if (bits == 32) { + while (count--) { + *((float*)dst) = *src++ / ((float)INT32_MAX); + dst += skip; + } + } else { + while (count--) { + *((double*)dst) = *src++ / ((double)INT32_MAX); + dst += skip; + } + } +} + + + } + +} |
