wav: use lsx_read_fields
[sox.git] / libgsm / gsm_decode.c
blob5ea637beeb1756c4b39a9820540630070e1da656
1 /*
2 * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
3 * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
4 * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
5 */
7 /* $Header: /cvsroot/sox/sox/libgsm/gsm_decode.c,v 1.1 2007/09/06 16:50:55 cbagwell Exp $ */
9 #include "private.h"
11 #include "gsm.h"
13 int gsm_decode (gsm s, gsm_byte * c, gsm_signal * target)
15 word LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4];
17 #ifdef WAV49
18 if (s->wav_fmt) {
20 uword sr = 0;
22 s->frame_index = !s->frame_index;
23 if (s->frame_index) {
25 sr = *c++;
26 LARc[0] = sr & 0x3f; sr >>= 6;
27 sr |= (uword)*c++ << 2;
28 LARc[1] = sr & 0x3f; sr >>= 6;
29 sr |= (uword)*c++ << 4;
30 LARc[2] = sr & 0x1f; sr >>= 5;
31 LARc[3] = sr & 0x1f; sr >>= 5;
32 sr |= (uword)*c++ << 2;
33 LARc[4] = sr & 0xf; sr >>= 4;
34 LARc[5] = sr & 0xf; sr >>= 4;
35 sr |= (uword)*c++ << 2; /* 5 */
36 LARc[6] = sr & 0x7; sr >>= 3;
37 LARc[7] = sr & 0x7; sr >>= 3;
38 sr |= (uword)*c++ << 4;
39 Nc[0] = sr & 0x7f; sr >>= 7;
40 bc[0] = sr & 0x3; sr >>= 2;
41 Mc[0] = sr & 0x3; sr >>= 2;
42 sr |= (uword)*c++ << 1;
43 xmaxc[0] = sr & 0x3f; sr >>= 6;
44 xmc[0] = sr & 0x7; sr >>= 3;
45 sr = *c++;
46 xmc[1] = sr & 0x7; sr >>= 3;
47 xmc[2] = sr & 0x7; sr >>= 3;
48 sr |= (uword)*c++ << 2;
49 xmc[3] = sr & 0x7; sr >>= 3;
50 xmc[4] = sr & 0x7; sr >>= 3;
51 xmc[5] = sr & 0x7; sr >>= 3;
52 sr |= (uword)*c++ << 1; /* 10 */
53 xmc[6] = sr & 0x7; sr >>= 3;
54 xmc[7] = sr & 0x7; sr >>= 3;
55 xmc[8] = sr & 0x7; sr >>= 3;
56 sr = *c++;
57 xmc[9] = sr & 0x7; sr >>= 3;
58 xmc[10] = sr & 0x7; sr >>= 3;
59 sr |= (uword)*c++ << 2;
60 xmc[11] = sr & 0x7; sr >>= 3;
61 xmc[12] = sr & 0x7; sr >>= 3;
62 sr |= (uword)*c++ << 4;
63 Nc[1] = sr & 0x7f; sr >>= 7;
64 bc[1] = sr & 0x3; sr >>= 2;
65 Mc[1] = sr & 0x3; sr >>= 2;
66 sr |= (uword)*c++ << 1;
67 xmaxc[1] = sr & 0x3f; sr >>= 6;
68 xmc[13] = sr & 0x7; sr >>= 3;
69 sr = *c++; /* 15 */
70 xmc[14] = sr & 0x7; sr >>= 3;
71 xmc[15] = sr & 0x7; sr >>= 3;
72 sr |= (uword)*c++ << 2;
73 xmc[16] = sr & 0x7; sr >>= 3;
74 xmc[17] = sr & 0x7; sr >>= 3;
75 xmc[18] = sr & 0x7; sr >>= 3;
76 sr |= (uword)*c++ << 1;
77 xmc[19] = sr & 0x7; sr >>= 3;
78 xmc[20] = sr & 0x7; sr >>= 3;
79 xmc[21] = sr & 0x7; sr >>= 3;
80 sr = *c++;
81 xmc[22] = sr & 0x7; sr >>= 3;
82 xmc[23] = sr & 0x7; sr >>= 3;
83 sr |= (uword)*c++ << 2;
84 xmc[24] = sr & 0x7; sr >>= 3;
85 xmc[25] = sr & 0x7; sr >>= 3;
86 sr |= (uword)*c++ << 4; /* 20 */
87 Nc[2] = sr & 0x7f; sr >>= 7;
88 bc[2] = sr & 0x3; sr >>= 2;
89 Mc[2] = sr & 0x3; sr >>= 2;
90 sr |= (uword)*c++ << 1;
91 xmaxc[2] = sr & 0x3f; sr >>= 6;
92 xmc[26] = sr & 0x7; sr >>= 3;
93 sr = *c++;
94 xmc[27] = sr & 0x7; sr >>= 3;
95 xmc[28] = sr & 0x7; sr >>= 3;
96 sr |= (uword)*c++ << 2;
97 xmc[29] = sr & 0x7; sr >>= 3;
98 xmc[30] = sr & 0x7; sr >>= 3;
99 xmc[31] = sr & 0x7; sr >>= 3;
100 sr |= (uword)*c++ << 1;
101 xmc[32] = sr & 0x7; sr >>= 3;
102 xmc[33] = sr & 0x7; sr >>= 3;
103 xmc[34] = sr & 0x7; sr >>= 3;
104 sr = *c++; /* 25 */
105 xmc[35] = sr & 0x7; sr >>= 3;
106 xmc[36] = sr & 0x7; sr >>= 3;
107 sr |= (uword)*c++ << 2;
108 xmc[37] = sr & 0x7; sr >>= 3;
109 xmc[38] = sr & 0x7; sr >>= 3;
110 sr |= (uword)*c++ << 4;
111 Nc[3] = sr & 0x7f; sr >>= 7;
112 bc[3] = sr & 0x3; sr >>= 2;
113 Mc[3] = sr & 0x3; sr >>= 2;
114 sr |= (uword)*c++ << 1;
115 xmaxc[3] = sr & 0x3f; sr >>= 6;
116 xmc[39] = sr & 0x7; sr >>= 3;
117 sr = *c++;
118 xmc[40] = sr & 0x7; sr >>= 3;
119 xmc[41] = sr & 0x7; sr >>= 3;
120 sr |= (uword)*c++ << 2; /* 30 */
121 xmc[42] = sr & 0x7; sr >>= 3;
122 xmc[43] = sr & 0x7; sr >>= 3;
123 xmc[44] = sr & 0x7; sr >>= 3;
124 sr |= (uword)*c++ << 1;
125 xmc[45] = sr & 0x7; sr >>= 3;
126 xmc[46] = sr & 0x7; sr >>= 3;
127 xmc[47] = sr & 0x7; sr >>= 3;
128 sr = *c++;
129 xmc[48] = sr & 0x7; sr >>= 3;
130 xmc[49] = sr & 0x7; sr >>= 3;
131 sr |= (uword)*c++ << 2;
132 xmc[50] = sr & 0x7; sr >>= 3;
133 xmc[51] = sr & 0x7; sr >>= 3;
135 s->frame_chain = sr & 0xf;
137 else {
138 sr = s->frame_chain;
139 sr |= (uword)*c++ << 4; /* 1 */
140 LARc[0] = sr & 0x3f; sr >>= 6;
141 LARc[1] = sr & 0x3f; sr >>= 6;
142 sr = *c++;
143 LARc[2] = sr & 0x1f; sr >>= 5;
144 sr |= (uword)*c++ << 3;
145 LARc[3] = sr & 0x1f; sr >>= 5;
146 LARc[4] = sr & 0xf; sr >>= 4;
147 sr |= (uword)*c++ << 2;
148 LARc[5] = sr & 0xf; sr >>= 4;
149 LARc[6] = sr & 0x7; sr >>= 3;
150 LARc[7] = sr & 0x7; sr >>= 3;
151 sr = *c++; /* 5 */
152 Nc[0] = sr & 0x7f; sr >>= 7;
153 sr |= (uword)*c++ << 1;
154 bc[0] = sr & 0x3; sr >>= 2;
155 Mc[0] = sr & 0x3; sr >>= 2;
156 sr |= (uword)*c++ << 5;
157 xmaxc[0] = sr & 0x3f; sr >>= 6;
158 xmc[0] = sr & 0x7; sr >>= 3;
159 xmc[1] = sr & 0x7; sr >>= 3;
160 sr |= (uword)*c++ << 1;
161 xmc[2] = sr & 0x7; sr >>= 3;
162 xmc[3] = sr & 0x7; sr >>= 3;
163 xmc[4] = sr & 0x7; sr >>= 3;
164 sr = *c++;
165 xmc[5] = sr & 0x7; sr >>= 3;
166 xmc[6] = sr & 0x7; sr >>= 3;
167 sr |= (uword)*c++ << 2; /* 10 */
168 xmc[7] = sr & 0x7; sr >>= 3;
169 xmc[8] = sr & 0x7; sr >>= 3;
170 xmc[9] = sr & 0x7; sr >>= 3;
171 sr |= (uword)*c++ << 1;
172 xmc[10] = sr & 0x7; sr >>= 3;
173 xmc[11] = sr & 0x7; sr >>= 3;
174 xmc[12] = sr & 0x7; sr >>= 3;
175 sr = *c++;
176 Nc[1] = sr & 0x7f; sr >>= 7;
177 sr |= (uword)*c++ << 1;
178 bc[1] = sr & 0x3; sr >>= 2;
179 Mc[1] = sr & 0x3; sr >>= 2;
180 sr |= (uword)*c++ << 5;
181 xmaxc[1] = sr & 0x3f; sr >>= 6;
182 xmc[13] = sr & 0x7; sr >>= 3;
183 xmc[14] = sr & 0x7; sr >>= 3;
184 sr |= (uword)*c++ << 1; /* 15 */
185 xmc[15] = sr & 0x7; sr >>= 3;
186 xmc[16] = sr & 0x7; sr >>= 3;
187 xmc[17] = sr & 0x7; sr >>= 3;
188 sr = *c++;
189 xmc[18] = sr & 0x7; sr >>= 3;
190 xmc[19] = sr & 0x7; sr >>= 3;
191 sr |= (uword)*c++ << 2;
192 xmc[20] = sr & 0x7; sr >>= 3;
193 xmc[21] = sr & 0x7; sr >>= 3;
194 xmc[22] = sr & 0x7; sr >>= 3;
195 sr |= (uword)*c++ << 1;
196 xmc[23] = sr & 0x7; sr >>= 3;
197 xmc[24] = sr & 0x7; sr >>= 3;
198 xmc[25] = sr & 0x7; sr >>= 3;
199 sr = *c++;
200 Nc[2] = sr & 0x7f; sr >>= 7;
201 sr |= (uword)*c++ << 1; /* 20 */
202 bc[2] = sr & 0x3; sr >>= 2;
203 Mc[2] = sr & 0x3; sr >>= 2;
204 sr |= (uword)*c++ << 5;
205 xmaxc[2] = sr & 0x3f; sr >>= 6;
206 xmc[26] = sr & 0x7; sr >>= 3;
207 xmc[27] = sr & 0x7; sr >>= 3;
208 sr |= (uword)*c++ << 1;
209 xmc[28] = sr & 0x7; sr >>= 3;
210 xmc[29] = sr & 0x7; sr >>= 3;
211 xmc[30] = sr & 0x7; sr >>= 3;
212 sr = *c++;
213 xmc[31] = sr & 0x7; sr >>= 3;
214 xmc[32] = sr & 0x7; sr >>= 3;
215 sr |= (uword)*c++ << 2;
216 xmc[33] = sr & 0x7; sr >>= 3;
217 xmc[34] = sr & 0x7; sr >>= 3;
218 xmc[35] = sr & 0x7; sr >>= 3;
219 sr |= (uword)*c++ << 1; /* 25 */
220 xmc[36] = sr & 0x7; sr >>= 3;
221 xmc[37] = sr & 0x7; sr >>= 3;
222 xmc[38] = sr & 0x7; sr >>= 3;
223 sr = *c++;
224 Nc[3] = sr & 0x7f; sr >>= 7;
225 sr |= (uword)*c++ << 1;
226 bc[3] = sr & 0x3; sr >>= 2;
227 Mc[3] = sr & 0x3; sr >>= 2;
228 sr |= (uword)*c++ << 5;
229 xmaxc[3] = sr & 0x3f; sr >>= 6;
230 xmc[39] = sr & 0x7; sr >>= 3;
231 xmc[40] = sr & 0x7; sr >>= 3;
232 sr |= (uword)*c++ << 1;
233 xmc[41] = sr & 0x7; sr >>= 3;
234 xmc[42] = sr & 0x7; sr >>= 3;
235 xmc[43] = sr & 0x7; sr >>= 3;
236 sr = *c++; /* 30 */
237 xmc[44] = sr & 0x7; sr >>= 3;
238 xmc[45] = sr & 0x7; sr >>= 3;
239 sr |= (uword)*c++ << 2;
240 xmc[46] = sr & 0x7; sr >>= 3;
241 xmc[47] = sr & 0x7; sr >>= 3;
242 xmc[48] = sr & 0x7; sr >>= 3;
243 sr |= (uword)*c++ << 1;
244 xmc[49] = sr & 0x7; sr >>= 3;
245 xmc[50] = sr & 0x7; sr >>= 3;
246 xmc[51] = sr & 0x7; sr >>= 3;
249 else
250 #endif
252 /* GSM_MAGIC = (*c >> 4) & 0xF; */
254 if (((*c >> 4) & 0x0F) != GSM_MAGIC) return -1;
256 LARc[0] = (*c++ & 0xF) << 2; /* 1 */
257 LARc[0] |= (*c >> 6) & 0x3;
258 LARc[1] = *c++ & 0x3F;
259 LARc[2] = (*c >> 3) & 0x1F;
260 LARc[3] = (*c++ & 0x7) << 2;
261 LARc[3] |= (*c >> 6) & 0x3;
262 LARc[4] = (*c >> 2) & 0xF;
263 LARc[5] = (*c++ & 0x3) << 2;
264 LARc[5] |= (*c >> 6) & 0x3;
265 LARc[6] = (*c >> 3) & 0x7;
266 LARc[7] = *c++ & 0x7;
267 Nc[0] = (*c >> 1) & 0x7F;
268 bc[0] = (*c++ & 0x1) << 1;
269 bc[0] |= (*c >> 7) & 0x1;
270 Mc[0] = (*c >> 5) & 0x3;
271 xmaxc[0] = (*c++ & 0x1F) << 1;
272 xmaxc[0] |= (*c >> 7) & 0x1;
273 xmc[0] = (*c >> 4) & 0x7;
274 xmc[1] = (*c >> 1) & 0x7;
275 xmc[2] = (*c++ & 0x1) << 2;
276 xmc[2] |= (*c >> 6) & 0x3;
277 xmc[3] = (*c >> 3) & 0x7;
278 xmc[4] = *c++ & 0x7;
279 xmc[5] = (*c >> 5) & 0x7;
280 xmc[6] = (*c >> 2) & 0x7;
281 xmc[7] = (*c++ & 0x3) << 1; /* 10 */
282 xmc[7] |= (*c >> 7) & 0x1;
283 xmc[8] = (*c >> 4) & 0x7;
284 xmc[9] = (*c >> 1) & 0x7;
285 xmc[10] = (*c++ & 0x1) << 2;
286 xmc[10] |= (*c >> 6) & 0x3;
287 xmc[11] = (*c >> 3) & 0x7;
288 xmc[12] = *c++ & 0x7;
289 Nc[1] = (*c >> 1) & 0x7F;
290 bc[1] = (*c++ & 0x1) << 1;
291 bc[1] |= (*c >> 7) & 0x1;
292 Mc[1] = (*c >> 5) & 0x3;
293 xmaxc[1] = (*c++ & 0x1F) << 1;
294 xmaxc[1] |= (*c >> 7) & 0x1;
295 xmc[13] = (*c >> 4) & 0x7;
296 xmc[14] = (*c >> 1) & 0x7;
297 xmc[15] = (*c++ & 0x1) << 2;
298 xmc[15] |= (*c >> 6) & 0x3;
299 xmc[16] = (*c >> 3) & 0x7;
300 xmc[17] = *c++ & 0x7;
301 xmc[18] = (*c >> 5) & 0x7;
302 xmc[19] = (*c >> 2) & 0x7;
303 xmc[20] = (*c++ & 0x3) << 1;
304 xmc[20] |= (*c >> 7) & 0x1;
305 xmc[21] = (*c >> 4) & 0x7;
306 xmc[22] = (*c >> 1) & 0x7;
307 xmc[23] = (*c++ & 0x1) << 2;
308 xmc[23] |= (*c >> 6) & 0x3;
309 xmc[24] = (*c >> 3) & 0x7;
310 xmc[25] = *c++ & 0x7;
311 Nc[2] = (*c >> 1) & 0x7F;
312 bc[2] = (*c++ & 0x1) << 1; /* 20 */
313 bc[2] |= (*c >> 7) & 0x1;
314 Mc[2] = (*c >> 5) & 0x3;
315 xmaxc[2] = (*c++ & 0x1F) << 1;
316 xmaxc[2] |= (*c >> 7) & 0x1;
317 xmc[26] = (*c >> 4) & 0x7;
318 xmc[27] = (*c >> 1) & 0x7;
319 xmc[28] = (*c++ & 0x1) << 2;
320 xmc[28] |= (*c >> 6) & 0x3;
321 xmc[29] = (*c >> 3) & 0x7;
322 xmc[30] = *c++ & 0x7;
323 xmc[31] = (*c >> 5) & 0x7;
324 xmc[32] = (*c >> 2) & 0x7;
325 xmc[33] = (*c++ & 0x3) << 1;
326 xmc[33] |= (*c >> 7) & 0x1;
327 xmc[34] = (*c >> 4) & 0x7;
328 xmc[35] = (*c >> 1) & 0x7;
329 xmc[36] = (*c++ & 0x1) << 2;
330 xmc[36] |= (*c >> 6) & 0x3;
331 xmc[37] = (*c >> 3) & 0x7;
332 xmc[38] = *c++ & 0x7;
333 Nc[3] = (*c >> 1) & 0x7F;
334 bc[3] = (*c++ & 0x1) << 1;
335 bc[3] |= (*c >> 7) & 0x1;
336 Mc[3] = (*c >> 5) & 0x3;
337 xmaxc[3] = (*c++ & 0x1F) << 1;
338 xmaxc[3] |= (*c >> 7) & 0x1;
339 xmc[39] = (*c >> 4) & 0x7;
340 xmc[40] = (*c >> 1) & 0x7;
341 xmc[41] = (*c++ & 0x1) << 2;
342 xmc[41] |= (*c >> 6) & 0x3;
343 xmc[42] = (*c >> 3) & 0x7;
344 xmc[43] = *c++ & 0x7; /* 30 */
345 xmc[44] = (*c >> 5) & 0x7;
346 xmc[45] = (*c >> 2) & 0x7;
347 xmc[46] = (*c++ & 0x3) << 1;
348 xmc[46] |= (*c >> 7) & 0x1;
349 xmc[47] = (*c >> 4) & 0x7;
350 xmc[48] = (*c >> 1) & 0x7;
351 xmc[49] = (*c++ & 0x1) << 2;
352 xmc[49] |= (*c >> 6) & 0x3;
353 xmc[50] = (*c >> 3) & 0x7;
354 xmc[51] = *c & 0x7; /* 33 */
357 Gsm_Decoder(s, LARc, Nc, bc, Mc, xmaxc, xmc, target);
359 return 0;