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.
7 /* $Header: /cvsroot/sox/sox/libgsm/gsm_decode.c,v 1.1 2007/09/06 16:50:55 cbagwell Exp $ */
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];
22 s
->frame_index
= !s
->frame_index
;
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;
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;
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;
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;
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;
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;
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;
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;
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;
139 sr
|= (uword
)*c
++ << 4; /* 1 */
140 LARc
[0] = sr
& 0x3f; sr
>>= 6;
141 LARc
[1] = sr
& 0x3f; sr
>>= 6;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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
);