4 #include "sample_cvt.h"
11 /* IMA ADPCM Stepsize table */
12 static const int IMAStep_size
[89] = {
13 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19,
14 21, 23, 25, 28, 31, 34, 37, 41, 45, 50, 55,
15 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157,
16 173, 190, 209, 230, 253, 279, 307, 337, 371, 408, 449,
17 494, 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282,
18 1411, 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327, 3660,
19 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493,10442,
20 11487,12635,13899,15289,16818,18500,20350,22358,24633,27086,29794,
24 /* IMA4 ADPCM Codeword decode table */
25 static const int IMA4Codeword
[16] = {
26 1, 3, 5, 7, 9, 11, 13, 15,
27 -1,-3,-5,-7,-9,-11,-13,-15,
30 /* IMA4 ADPCM Step index adjust decode table */
31 static const int IMA4Index_adjust
[16] = {
32 -1,-1,-1,-1, 2, 4, 6, 8,
33 -1,-1,-1,-1, 2, 4, 6, 8
37 /* MSADPCM Adaption table */
38 static const int MSADPCMAdaption
[16] = {
39 230, 230, 230, 230, 307, 409, 512, 614,
40 768, 614, 512, 409, 307, 230, 230, 230
43 /* MSADPCM Adaption Coefficient tables */
44 static const int MSADPCMAdaptionCoeff
[7][2] = {
55 /* A quick'n'dirty lookup table to decode a muLaw-encoded byte sample into a
56 * signed 16-bit sample */
57 const ALshort muLawDecompressionTable
[256] = {
58 -32124,-31100,-30076,-29052,-28028,-27004,-25980,-24956,
59 -23932,-22908,-21884,-20860,-19836,-18812,-17788,-16764,
60 -15996,-15484,-14972,-14460,-13948,-13436,-12924,-12412,
61 -11900,-11388,-10876,-10364, -9852, -9340, -8828, -8316,
62 -7932, -7676, -7420, -7164, -6908, -6652, -6396, -6140,
63 -5884, -5628, -5372, -5116, -4860, -4604, -4348, -4092,
64 -3900, -3772, -3644, -3516, -3388, -3260, -3132, -3004,
65 -2876, -2748, -2620, -2492, -2364, -2236, -2108, -1980,
66 -1884, -1820, -1756, -1692, -1628, -1564, -1500, -1436,
67 -1372, -1308, -1244, -1180, -1116, -1052, -988, -924,
68 -876, -844, -812, -780, -748, -716, -684, -652,
69 -620, -588, -556, -524, -492, -460, -428, -396,
70 -372, -356, -340, -324, -308, -292, -276, -260,
71 -244, -228, -212, -196, -180, -164, -148, -132,
72 -120, -112, -104, -96, -88, -80, -72, -64,
73 -56, -48, -40, -32, -24, -16, -8, 0,
74 32124, 31100, 30076, 29052, 28028, 27004, 25980, 24956,
75 23932, 22908, 21884, 20860, 19836, 18812, 17788, 16764,
76 15996, 15484, 14972, 14460, 13948, 13436, 12924, 12412,
77 11900, 11388, 10876, 10364, 9852, 9340, 8828, 8316,
78 7932, 7676, 7420, 7164, 6908, 6652, 6396, 6140,
79 5884, 5628, 5372, 5116, 4860, 4604, 4348, 4092,
80 3900, 3772, 3644, 3516, 3388, 3260, 3132, 3004,
81 2876, 2748, 2620, 2492, 2364, 2236, 2108, 1980,
82 1884, 1820, 1756, 1692, 1628, 1564, 1500, 1436,
83 1372, 1308, 1244, 1180, 1116, 1052, 988, 924,
84 876, 844, 812, 780, 748, 716, 684, 652,
85 620, 588, 556, 524, 492, 460, 428, 396,
86 372, 356, 340, 324, 308, 292, 276, 260,
87 244, 228, 212, 196, 180, 164, 148, 132,
88 120, 112, 104, 96, 88, 80, 72, 64,
89 56, 48, 40, 32, 24, 16, 8, 0
93 /* A quick'n'dirty lookup table to decode an aLaw-encoded byte sample into a
94 * signed 16-bit sample */
95 const ALshort aLawDecompressionTable
[256] = {
96 -5504, -5248, -6016, -5760, -4480, -4224, -4992, -4736,
97 -7552, -7296, -8064, -7808, -6528, -6272, -7040, -6784,
98 -2752, -2624, -3008, -2880, -2240, -2112, -2496, -2368,
99 -3776, -3648, -4032, -3904, -3264, -3136, -3520, -3392,
100 -22016,-20992,-24064,-23040,-17920,-16896,-19968,-18944,
101 -30208,-29184,-32256,-31232,-26112,-25088,-28160,-27136,
102 -11008,-10496,-12032,-11520, -8960, -8448, -9984, -9472,
103 -15104,-14592,-16128,-15616,-13056,-12544,-14080,-13568,
104 -344, -328, -376, -360, -280, -264, -312, -296,
105 -472, -456, -504, -488, -408, -392, -440, -424,
106 -88, -72, -120, -104, -24, -8, -56, -40,
107 -216, -200, -248, -232, -152, -136, -184, -168,
108 -1376, -1312, -1504, -1440, -1120, -1056, -1248, -1184,
109 -1888, -1824, -2016, -1952, -1632, -1568, -1760, -1696,
110 -688, -656, -752, -720, -560, -528, -624, -592,
111 -944, -912, -1008, -976, -816, -784, -880, -848,
112 5504, 5248, 6016, 5760, 4480, 4224, 4992, 4736,
113 7552, 7296, 8064, 7808, 6528, 6272, 7040, 6784,
114 2752, 2624, 3008, 2880, 2240, 2112, 2496, 2368,
115 3776, 3648, 4032, 3904, 3264, 3136, 3520, 3392,
116 22016, 20992, 24064, 23040, 17920, 16896, 19968, 18944,
117 30208, 29184, 32256, 31232, 26112, 25088, 28160, 27136,
118 11008, 10496, 12032, 11520, 8960, 8448, 9984, 9472,
119 15104, 14592, 16128, 15616, 13056, 12544, 14080, 13568,
120 344, 328, 376, 360, 280, 264, 312, 296,
121 472, 456, 504, 488, 408, 392, 440, 424,
122 88, 72, 120, 104, 24, 8, 56, 40,
123 216, 200, 248, 232, 152, 136, 184, 168,
124 1376, 1312, 1504, 1440, 1120, 1056, 1248, 1184,
125 1888, 1824, 2016, 1952, 1632, 1568, 1760, 1696,
126 688, 656, 752, 720, 560, 528, 624, 592,
127 944, 912, 1008, 976, 816, 784, 880, 848
131 static void DecodeIMA4Block(ALshort
*dst
, const ALubyte
*src
, ALint numchans
, ALsizei align
)
133 ALint sample
[MAX_INPUT_CHANNELS
] = { 0 };
134 ALint index
[MAX_INPUT_CHANNELS
] = { 0 };
135 ALuint code
[MAX_INPUT_CHANNELS
] = { 0 };
138 for(c
= 0;c
< numchans
;c
++)
140 sample
[c
] = *(src
++);
141 sample
[c
] |= *(src
++) << 8;
142 sample
[c
] = (sample
[c
]^0x8000) - 32768;
144 index
[c
] |= *(src
++) << 8;
145 index
[c
] = (index
[c
]^0x8000) - 32768;
147 index
[c
] = clampi(index
[c
], 0, 88);
152 for(i
= 1;i
< align
;i
++)
156 for(c
= 0;c
< numchans
;c
++)
159 code
[c
] |= *(src
++) << 8;
160 code
[c
] |= *(src
++) << 16;
161 code
[c
] |= *(src
++) << 24;
165 for(c
= 0;c
< numchans
;c
++)
167 int nibble
= code
[c
]&0xf;
170 sample
[c
] += IMA4Codeword
[nibble
] * IMAStep_size
[index
[c
]] / 8;
171 sample
[c
] = clampi(sample
[c
], -32768, 32767);
173 index
[c
] += IMA4Index_adjust
[nibble
];
174 index
[c
] = clampi(index
[c
], 0, 88);
176 *(dst
++) = sample
[c
];
181 static void DecodeMSADPCMBlock(ALshort
*dst
, const ALubyte
*src
, ALint numchans
, ALsizei align
)
183 ALubyte blockpred
[MAX_INPUT_CHANNELS
] = { 0 };
184 ALint delta
[MAX_INPUT_CHANNELS
] = { 0 };
185 ALshort samples
[MAX_INPUT_CHANNELS
][2] = { { 0, 0 } };
188 for(c
= 0;c
< numchans
;c
++)
190 blockpred
[c
] = *(src
++);
191 blockpred
[c
] = minu(blockpred
[c
], 6);
193 for(c
= 0;c
< numchans
;c
++)
196 delta
[c
] |= *(src
++) << 8;
197 delta
[c
] = (delta
[c
]^0x8000) - 32768;
199 for(c
= 0;c
< numchans
;c
++)
201 samples
[c
][0] = *(src
++);
202 samples
[c
][0] |= *(src
++) << 8;
203 samples
[c
][0] = (samples
[c
][0]^0x8000) - 32768;
205 for(c
= 0;c
< numchans
;c
++)
207 samples
[c
][1] = *(src
++);
208 samples
[c
][1] |= *(src
++) << 8;
209 samples
[c
][1] = (samples
[c
][1]^0x8000) - 0x8000;
212 /* Second sample is written first. */
213 for(c
= 0;c
< numchans
;c
++)
214 *(dst
++) = samples
[c
][1];
215 for(c
= 0;c
< numchans
;c
++)
216 *(dst
++) = samples
[c
][0];
218 for(i
= 2;i
< align
;i
++)
220 for(c
= 0;c
< numchans
;c
++)
222 const ALint num
= (i
*numchans
) + c
;
225 /* Read the nibble (first is in the upper bits). */
227 nibble
= (*src
>>4)&0x0f;
229 nibble
= (*(src
++))&0x0f;
231 pred
= (samples
[c
][0]*MSADPCMAdaptionCoeff
[blockpred
[c
]][0] +
232 samples
[c
][1]*MSADPCMAdaptionCoeff
[blockpred
[c
]][1]) / 256;
233 pred
+= ((nibble
^0x08) - 0x08) * delta
[c
];
234 pred
= clampi(pred
, -32768, 32767);
236 samples
[c
][1] = samples
[c
][0];
237 samples
[c
][0] = pred
;
239 delta
[c
] = (MSADPCMAdaption
[nibble
] * delta
[c
]) / 256;
240 delta
[c
] = maxi(16, delta
[c
]);
248 void Convert_ALshort_ALima4(ALshort
*dst
, const ALubyte
*src
, ALsizei numchans
, ALsizei len
,
251 ALsizei byte_align
= ((align
-1)/2 + 4) * numchans
;
254 assert(align
> 0 && (len
%align
) == 0);
255 for(i
= 0;i
< len
;i
+= align
)
257 DecodeIMA4Block(dst
, src
, numchans
, align
);
259 dst
+= align
*numchans
;
263 void Convert_ALshort_ALmsadpcm(ALshort
*dst
, const ALubyte
*src
, ALsizei numchans
, ALsizei len
,
266 ALsizei byte_align
= ((align
-2)/2 + 7) * numchans
;
269 assert(align
> 1 && (len
%align
) == 0);
270 for(i
= 0;i
< len
;i
+= align
)
272 DecodeMSADPCMBlock(dst
, src
, numchans
, align
);
274 dst
+= align
*numchans
;