Version 0.1.1 from FTP
[asterisk/asterisk.git] / formats / msgsm.h
1 /* Conversion routines derived from code by guido@sienanet.it */
2
3 #define GSM_MAGIC 0xD
4
5 typedef unsigned char           gsm_byte;
6 typedef unsigned char           wav_byte;
7 typedef unsigned int                    uword;
8
9 #define readGSM_33(c1) { \
10                 gsm_byte *c = (c1); \
11         LARc[0]  = (*c++ & 0xF) << 2;           /* 1 */ \
12         LARc[0] |= (*c >> 6) & 0x3; \
13         LARc[1]  = *c++ & 0x3F; \
14         LARc[2]  = (*c >> 3) & 0x1F; \
15         LARc[3]  = (*c++ & 0x7) << 2; \
16         LARc[3] |= (*c >> 6) & 0x3; \
17         LARc[4]  = (*c >> 2) & 0xF; \
18         LARc[5]  = (*c++ & 0x3) << 2; \
19         LARc[5] |= (*c >> 6) & 0x3; \
20         LARc[6]  = (*c >> 3) & 0x7; \
21         LARc[7]  = *c++ & 0x7; \
22         Nc[0]  = (*c >> 1) & 0x7F; \
23         bc[0]  = (*c++ & 0x1) << 1; \
24         bc[0] |= (*c >> 7) & 0x1; \
25         Mc[0]  = (*c >> 5) & 0x3; \
26         xmaxc[0]  = (*c++ & 0x1F) << 1; \
27         xmaxc[0] |= (*c >> 7) & 0x1; \
28         xmc[0]  = (*c >> 4) & 0x7; \
29         xmc[1]  = (*c >> 1) & 0x7; \
30         xmc[2]  = (*c++ & 0x1) << 2; \
31         xmc[2] |= (*c >> 6) & 0x3; \
32         xmc[3]  = (*c >> 3) & 0x7; \
33         xmc[4]  = *c++ & 0x7; \
34         xmc[5]  = (*c >> 5) & 0x7; \
35         xmc[6]  = (*c >> 2) & 0x7; \
36         xmc[7]  = (*c++ & 0x3) << 1;            /* 10 */ \
37         xmc[7] |= (*c >> 7) & 0x1; \
38         xmc[8]  = (*c >> 4) & 0x7; \
39         xmc[9]  = (*c >> 1) & 0x7; \
40         xmc[10]  = (*c++ & 0x1) << 2; \
41         xmc[10] |= (*c >> 6) & 0x3; \
42         xmc[11]  = (*c >> 3) & 0x7; \
43         xmc[12]  = *c++ & 0x7; \
44         Nc[1]  = (*c >> 1) & 0x7F; \
45         bc[1]  = (*c++ & 0x1) << 1; \
46         bc[1] |= (*c >> 7) & 0x1; \
47         Mc[1]  = (*c >> 5) & 0x3; \
48         xmaxc[1]  = (*c++ & 0x1F) << 1; \
49         xmaxc[1] |= (*c >> 7) & 0x1; \
50         xmc[13]  = (*c >> 4) & 0x7; \
51         xmc[14]  = (*c >> 1) & 0x7; \
52         xmc[15]  = (*c++ & 0x1) << 2; \
53         xmc[15] |= (*c >> 6) & 0x3; \
54         xmc[16]  = (*c >> 3) & 0x7; \
55         xmc[17]  = *c++ & 0x7; \
56         xmc[18]  = (*c >> 5) & 0x7; \
57         xmc[19]  = (*c >> 2) & 0x7; \
58         xmc[20]  = (*c++ & 0x3) << 1; \
59         xmc[20] |= (*c >> 7) & 0x1; \
60         xmc[21]  = (*c >> 4) & 0x7; \
61         xmc[22]  = (*c >> 1) & 0x7; \
62         xmc[23]  = (*c++ & 0x1) << 2; \
63         xmc[23] |= (*c >> 6) & 0x3; \
64         xmc[24]  = (*c >> 3) & 0x7; \
65         xmc[25]  = *c++ & 0x7; \
66         Nc[2]  = (*c >> 1) & 0x7F; \
67         bc[2]  = (*c++ & 0x1) << 1;             /* 20 */ \
68         bc[2] |= (*c >> 7) & 0x1; \
69         Mc[2]  = (*c >> 5) & 0x3; \
70         xmaxc[2]  = (*c++ & 0x1F) << 1; \
71         xmaxc[2] |= (*c >> 7) & 0x1; \
72         xmc[26]  = (*c >> 4) & 0x7; \
73         xmc[27]  = (*c >> 1) & 0x7; \
74         xmc[28]  = (*c++ & 0x1) << 2; \
75         xmc[28] |= (*c >> 6) & 0x3; \
76         xmc[29]  = (*c >> 3) & 0x7; \
77         xmc[30]  = *c++ & 0x7; \
78         xmc[31]  = (*c >> 5) & 0x7; \
79         xmc[32]  = (*c >> 2) & 0x7; \
80         xmc[33]  = (*c++ & 0x3) << 1; \
81         xmc[33] |= (*c >> 7) & 0x1; \
82         xmc[34]  = (*c >> 4) & 0x7; \
83         xmc[35]  = (*c >> 1) & 0x7; \
84         xmc[36]  = (*c++ & 0x1) << 2; \
85         xmc[36] |= (*c >> 6) & 0x3; \
86         xmc[37]  = (*c >> 3) & 0x7; \
87         xmc[38]  = *c++ & 0x7; \
88         Nc[3]  = (*c >> 1) & 0x7F; \
89         bc[3]  = (*c++ & 0x1) << 1; \
90         bc[3] |= (*c >> 7) & 0x1; \
91         Mc[3]  = (*c >> 5) & 0x3; \
92         xmaxc[3]  = (*c++ & 0x1F) << 1; \
93         xmaxc[3] |= (*c >> 7) & 0x1; \
94         xmc[39]  = (*c >> 4) & 0x7; \
95         xmc[40]  = (*c >> 1) & 0x7; \
96         xmc[41]  = (*c++ & 0x1) << 2; \
97         xmc[41] |= (*c >> 6) & 0x3; \
98         xmc[42]  = (*c >> 3) & 0x7; \
99         xmc[43]  = *c++ & 0x7;                  /* 30  */ \
100         xmc[44]  = (*c >> 5) & 0x7; \
101         xmc[45]  = (*c >> 2) & 0x7; \
102         xmc[46]  = (*c++ & 0x3) << 1; \
103         xmc[46] |= (*c >> 7) & 0x1; \
104         xmc[47]  = (*c >> 4) & 0x7; \
105         xmc[48]  = (*c >> 1) & 0x7; \
106         xmc[49]  = (*c++ & 0x1) << 2; \
107         xmc[49] |= (*c >> 6) & 0x3; \
108         xmc[50]  = (*c >> 3) & 0x7; \
109         xmc[51]  = *c & 0x7;                    /* 33 */ \
110 }
111
112 static void conv66(gsm_byte * d, wav_byte * c) {
113         gsm_byte frame_chain;
114     unsigned int sr;
115         unsigned int    LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4];
116         
117         readGSM_33(d);
118         sr = 0;
119         sr = (sr >> 6) | (LARc[0] << 10);
120         sr = (sr >> 6) | (LARc[1] << 10);
121         *c++ = sr >> 4;
122         sr = (sr >> 5) | (LARc[2] << 11);
123         *c++ = sr >> 7;
124         sr = (sr >> 5) | (LARc[3] << 11);
125         sr = (sr >> 4) | (LARc[4] << 12);
126         *c++ = sr >> 6;
127         sr = (sr >> 4) | (LARc[5] << 12);
128         sr = (sr >> 3) | (LARc[6] << 13);
129         *c++ = sr >> 7;
130         sr = (sr >> 3) | (LARc[7] << 13);
131         sr = (sr >> 7) | (Nc[0] << 9);
132         *c++ = sr >> 5;
133         sr = (sr >> 2) | (bc[0] << 14);
134         sr = (sr >> 2) | (Mc[0] << 14);
135         sr = (sr >> 6) | (xmaxc[0] << 10);
136         *c++ = sr >> 3;
137         sr = (sr >> 3 )|( xmc[0] << 13);
138         *c++ = sr >> 8;
139         sr = (sr >> 3 )|( xmc[1] << 13);
140         sr = (sr >> 3 )|( xmc[2] << 13);
141     sr = (sr >> 3 )|( xmc[3] << 13);
142     *c++ = sr >> 7;
143     sr = (sr >> 3 )|( xmc[4] << 13);
144     sr = (sr >> 3 )|( xmc[5] << 13);
145     sr = (sr >> 3 )|( xmc[6] << 13);
146     *c++ = sr >> 6;
147     sr = (sr >> 3 )|( xmc[7] << 13);
148     sr = (sr >> 3 )|( xmc[8] << 13);
149     *c++ = sr >> 8;
150     sr = (sr >> 3 )|( xmc[9] << 13);
151     sr = (sr >> 3 )|( xmc[10] << 13);
152     sr = (sr >> 3 )|( xmc[11] << 13);
153     *c++ = sr >> 7;
154     sr = (sr >> 3 )|( xmc[12] << 13);
155     sr = (sr >> 7 )|( Nc[1] << 9);
156     *c++ = sr >> 5;
157     sr = (sr >> 2 )|( bc[1] << 14);
158     sr = (sr >> 2 )|( Mc[1] << 14);
159     sr = (sr >> 6 )|( xmaxc[1] << 10);
160     *c++ = sr >> 3;
161     sr = (sr >> 3 )|( xmc[13] << 13);
162     *c++ = sr >> 8;
163     sr = (sr >> 3 )|( xmc[14] << 13);
164     sr = (sr >> 3 )|( xmc[15] << 13);
165     sr = (sr >> 3 )|( xmc[16] << 13);
166     *c++ = sr >> 7;
167     sr = (sr >> 3 )|( xmc[17] << 13);
168     sr = (sr >> 3 )|( xmc[18] << 13);
169     sr = (sr >> 3 )|( xmc[19] << 13);
170     *c++ = sr >> 6;
171     sr = (sr >> 3 )|( xmc[20] << 13);
172     sr = (sr >> 3 )|( xmc[21] << 13);
173     *c++ = sr >> 8;
174     sr = (sr >> 3 )|( xmc[22] << 13);
175     sr = (sr >> 3 )|( xmc[23] << 13);
176     sr = (sr >> 3 )|( xmc[24] << 13);
177     *c++ = sr >> 7;
178     sr = (sr >> 3 )|( xmc[25] << 13);
179     sr = (sr >> 7 )|( Nc[2] << 9);
180     *c++ = sr >> 5;
181     sr = (sr >> 2 )|( bc[2] << 14);
182     sr = (sr >> 2 )|( Mc[2] << 14);
183     sr = (sr >> 6 )|( xmaxc[2] << 10);
184     *c++ = sr >> 3;
185     sr = (sr >> 3 )|( xmc[26] << 13);
186     *c++ = sr >> 8;
187     sr = (sr >> 3 )|( xmc[27] << 13);
188     sr = (sr >> 3 )|( xmc[28] << 13);
189     sr = (sr >> 3 )|( xmc[29] << 13);
190     *c++ = sr >> 7;
191     sr = (sr >> 3 )|( xmc[30] << 13);
192     sr = (sr >> 3 )|( xmc[31] << 13);
193     sr = (sr >> 3 )|( xmc[32] << 13);
194     *c++ = sr >> 6;
195     sr = (sr >> 3 )|( xmc[33] << 13);
196     sr = (sr >> 3 )|( xmc[34] << 13);
197     *c++ = sr >> 8;
198     sr = (sr >> 3 )|( xmc[35] << 13);
199     sr = (sr >> 3 )|( xmc[36] << 13);
200     sr = (sr >> 3 )|( xmc[37] << 13);
201     *c++ = sr >> 7;
202     sr = (sr >> 3 )|( xmc[38] << 13);
203     sr = (sr >> 7 )|( Nc[3] << 9);
204     *c++ = sr >> 5;
205     sr = (sr >> 2 )|( bc[3] << 14);
206     sr = (sr >> 2 )|( Mc[3] << 14);
207     sr = (sr >> 6 )|( xmaxc[3] << 10);
208     *c++ = sr >> 3;
209     sr = (sr >> 3 )|( xmc[39] << 13);
210     *c++ = sr >> 8;
211     sr = (sr >> 3 )|( xmc[40] << 13);
212     sr = (sr >> 3 )|( xmc[41] << 13);
213     sr = (sr >> 3 )|( xmc[42] << 13);
214     *c++ = sr >> 7;
215     sr = (sr >> 3 )|( xmc[43] << 13);
216     sr = (sr >> 3 )|( xmc[44] << 13);
217     sr = (sr >> 3 )|( xmc[45] << 13);
218     *c++ = sr >> 6;
219     sr = (sr >> 3 )|( xmc[46] << 13);
220     sr = (sr >> 3 )|( xmc[47] << 13);
221     *c++ = sr >> 8;
222     sr = (sr >> 3 )|( xmc[48] << 13);
223     sr = (sr >> 3 )|( xmc[49] << 13);
224     sr = (sr >> 3 )|( xmc[50] << 13);
225     *c++ = sr >> 7;
226     sr = (sr >> 3 )|( xmc[51] << 13);
227     sr = sr >> 4;
228     *c = sr >> 8;
229     frame_chain = *c;
230     readGSM_33(d+33);// puts all the parameters into LARc etc.
231
232
233     sr = 0;
234 //                      sr = (sr >> 4 )|( s->frame_chain << 12);
235     sr = (sr >> 4 )|( frame_chain << 12);
236
237     sr = (sr >> 6 )|( LARc[0] << 10);
238     *c++ = sr >> 6;
239     sr = (sr >> 6 )|( LARc[1] << 10);
240     *c++ = sr >> 8;
241     sr = (sr >> 5 )|( LARc[2] << 11);
242     sr = (sr >> 5 )|( LARc[3] << 11);
243     *c++ = sr >> 6;
244     sr = (sr >> 4 )|( LARc[4] << 12);
245     sr = (sr >> 4 )|( LARc[5] << 12);
246     *c++ = sr >> 6;
247     sr = (sr >> 3 )|( LARc[6] << 13);
248     sr = (sr >> 3 )|( LARc[7] << 13);
249     *c++ = sr >> 8;
250     sr = (sr >> 7 )|( Nc[0] << 9);
251     sr = (sr >> 2 )|( bc[0] << 14);
252     *c++ = sr >> 7;
253     sr = (sr >> 2 )|( Mc[0] << 14);
254     sr = (sr >> 6 )|( xmaxc[0] << 10);
255     *c++ = sr >> 7;
256     sr = (sr >> 3 )|( xmc[0] << 13);
257     sr = (sr >> 3 )|( xmc[1] << 13);
258     sr = (sr >> 3 )|( xmc[2] << 13);
259     *c++ = sr >> 6;
260     sr = (sr >> 3 )|( xmc[3] << 13);
261     sr = (sr >> 3 )|( xmc[4] << 13);
262     *c++ = sr >> 8;
263     sr = (sr >> 3 )|( xmc[5] << 13);
264     sr = (sr >> 3 )|( xmc[6] << 13);
265     sr = (sr >> 3 )|( xmc[7] << 13);
266     *c++ = sr >> 7;
267     sr = (sr >> 3 )|( xmc[8] << 13);
268     sr = (sr >> 3 )|( xmc[9] << 13);
269     sr = (sr >> 3 )|( xmc[10] << 13);
270     *c++ = sr >> 6;
271     sr = (sr >> 3 )|( xmc[11] << 13);
272     sr = (sr >> 3 )|( xmc[12] << 13);
273     *c++ = sr >> 8;
274     sr = (sr >> 7 )|( Nc[1] << 9);
275     sr = (sr >> 2 )|( bc[1] << 14);
276     *c++ = sr >> 7;
277     sr = (sr >> 2 )|( Mc[1] << 14);
278     sr = (sr >> 6 )|( xmaxc[1] << 10);
279     *c++ = sr >> 7;
280     sr = (sr >> 3 )|( xmc[13] << 13);
281     sr = (sr >> 3 )|( xmc[14] << 13);
282     sr = (sr >> 3 )|( xmc[15] << 13);
283     *c++ = sr >> 6;
284     sr = (sr >> 3 )|( xmc[16] << 13);
285     sr = (sr >> 3 )|( xmc[17] << 13);
286     *c++ = sr >> 8;
287     sr = (sr >> 3 )|( xmc[18] << 13);
288     sr = (sr >> 3 )|( xmc[19] << 13);
289     sr = (sr >> 3 )|( xmc[20] << 13);
290     *c++ = sr >> 7;
291     sr = (sr >> 3 )|( xmc[21] << 13);
292     sr = (sr >> 3 )|( xmc[22] << 13);
293     sr = (sr >> 3 )|( xmc[23] << 13);
294     *c++ = sr >> 6;
295     sr = (sr >> 3 )|( xmc[24] << 13);
296     sr = (sr >> 3 )|( xmc[25] << 13);
297     *c++ = sr >> 8;
298     sr = (sr >> 7 )|( Nc[2] << 9);
299     sr = (sr >> 2 )|( bc[2] << 14);
300     *c++ = sr >> 7;
301     sr = (sr >> 2 )|( Mc[2] << 14);
302     sr = (sr >> 6 )|( xmaxc[2] << 10);
303     *c++ = sr >> 7;
304     sr = (sr >> 3 )|( xmc[26] << 13);
305     sr = (sr >> 3 )|( xmc[27] << 13);
306     sr = (sr >> 3 )|( xmc[28] << 13);
307     *c++ = sr >> 6;
308     sr = (sr >> 3 )|( xmc[29] << 13);
309     sr = (sr >> 3 )|( xmc[30] << 13);
310     *c++ = sr >> 8;
311     sr = (sr >> 3 )|( xmc[31] << 13);
312     sr = (sr >> 3 )|( xmc[32] << 13);
313     sr = (sr >> 3 )|( xmc[33] << 13);
314     *c++ = sr >> 7;
315     sr = (sr >> 3 )|( xmc[34] << 13);
316     sr = (sr >> 3 )|( xmc[35] << 13);
317     sr = (sr >> 3 )|( xmc[36] << 13);
318     *c++ = sr >> 6;
319     sr = (sr >> 3 )|( xmc[37] << 13);
320     sr = (sr >> 3 )|( xmc[38] << 13);
321     *c++ = sr >> 8;
322     sr = (sr >> 7 )|( Nc[3] << 9);
323     sr = (sr >> 2 )|( bc[3] << 14);
324     *c++ = sr >> 7;
325     sr = (sr >> 2 )|( Mc[3] << 14);
326     sr = (sr >> 6 )|( xmaxc[3] << 10);
327     *c++ = sr >> 7;
328     sr = (sr >> 3 )|( xmc[39] << 13);
329     sr = (sr >> 3 )|( xmc[40] << 13);
330     sr = (sr >> 3 )|( xmc[41] << 13);
331     *c++ = sr >> 6;
332     sr = (sr >> 3 )|( xmc[42] << 13);
333     sr = (sr >> 3 )|( xmc[43] << 13);
334     *c++ = sr >> 8;
335     sr = (sr >> 3 )|( xmc[44] << 13);
336     sr = (sr >> 3 )|( xmc[45] << 13);
337     sr = (sr >> 3 )|( xmc[46] << 13);
338     *c++ = sr >> 7;
339     sr = (sr >> 3 )|( xmc[47] << 13);
340     sr = (sr >> 3 )|( xmc[48] << 13);
341     sr = (sr >> 3 )|( xmc[49] << 13);
342     *c++ = sr >> 6;
343     sr = (sr >> 3 )|( xmc[50] << 13);
344     sr = (sr >> 3 )|( xmc[51] << 13);
345     *c++ = sr >> 8;
346
347 }
348
349 #define writeGSM_33(c1) { \
350                                 gsm_byte *c = (c1); \
351                 *c++ =   ((GSM_MAGIC & 0xF) << 4)               /* 1 */ \
352                            | ((LARc[0] >> 2) & 0xF); \
353                 *c++ =   ((LARc[0] & 0x3) << 6) \
354                            | (LARc[1] & 0x3F); \
355                 *c++ =   ((LARc[2] & 0x1F) << 3) \
356                            | ((LARc[3] >> 2) & 0x7); \
357                 *c++ =   ((LARc[3] & 0x3) << 6) \
358                        | ((LARc[4] & 0xF) << 2) \
359                        | ((LARc[5] >> 2) & 0x3); \
360                 *c++ =   ((LARc[5] & 0x3) << 6) \
361                        | ((LARc[6] & 0x7) << 3) \
362                        | (LARc[7] & 0x7);   \
363                 *c++ =   ((Nc[0] & 0x7F) << 1) \
364                        | ((bc[0] >> 1) & 0x1); \
365                 *c++ =   ((bc[0] & 0x1) << 7) \
366                        | ((Mc[0] & 0x3) << 5) \
367                        | ((xmaxc[0] >> 1) & 0x1F); \
368                 *c++ =   ((xmaxc[0] & 0x1) << 7) \
369                        | ((xmc[0] & 0x7) << 4) \
370                        | ((xmc[1] & 0x7) << 1) \
371                            | ((xmc[2] >> 2) & 0x1); \
372                 *c++ =   ((xmc[2] & 0x3) << 6) \
373                        | ((xmc[3] & 0x7) << 3) \
374                        | (xmc[4] & 0x7); \
375                 *c++ =   ((xmc[5] & 0x7) << 5)                  /* 10 */ \
376                        | ((xmc[6] & 0x7) << 2) \
377                        | ((xmc[7] >> 1) & 0x3); \
378                 *c++ =   ((xmc[7] & 0x1) << 7) \
379                        | ((xmc[8] & 0x7) << 4) \
380                        | ((xmc[9] & 0x7) << 1) \
381                        | ((xmc[10] >> 2) & 0x1); \
382                 *c++ =   ((xmc[10] & 0x3) << 6) \
383                        | ((xmc[11] & 0x7) << 3) \
384                        | (xmc[12] & 0x7); \
385                 *c++ =   ((Nc[1] & 0x7F) << 1) \
386                        | ((bc[1] >> 1) & 0x1); \
387                 *c++ =   ((bc[1] & 0x1) << 7) \
388                        | ((Mc[1] & 0x3) << 5) \
389                        | ((xmaxc[1] >> 1) & 0x1F);  \
390                 *c++ =   ((xmaxc[1] & 0x1) << 7) \
391                        | ((xmc[13] & 0x7) << 4) \
392                            | ((xmc[14] & 0x7) << 1) \
393                        | ((xmc[15] >> 2) & 0x1); \
394                 *c++ =   ((xmc[15] & 0x3) << 6) \
395                        | ((xmc[16] & 0x7) << 3) \
396                        | (xmc[17] & 0x7); \
397                 *c++ =   ((xmc[18] & 0x7) << 5) \
398                        | ((xmc[19] & 0x7) << 2) \
399                        | ((xmc[20] >> 1) & 0x3); \
400                 *c++ =   ((xmc[20] & 0x1) << 7) \
401                        | ((xmc[21] & 0x7) << 4) \
402                        | ((xmc[22] & 0x7) << 1) \
403                            | ((xmc[23] >> 2) & 0x1); \
404                 *c++ =   ((xmc[23] & 0x3) << 6) \
405                        | ((xmc[24] & 0x7) << 3) \
406                            | (xmc[25] & 0x7); \
407                 *c++ =   ((Nc[2] & 0x7F) << 1)                  /* 20 */ \
408                        | ((bc[2] >> 1) & 0x1); \
409                 *c++ =   ((bc[2] & 0x1) << 7) \
410                        | ((Mc[2] & 0x3) << 5) \
411                        | ((xmaxc[2] >> 1) & 0x1F); \
412                 *c++ =   ((xmaxc[2] & 0x1) << 7)   \
413                        | ((xmc[26] & 0x7) << 4) \
414                        | ((xmc[27] & 0x7) << 1) \
415                        | ((xmc[28] >> 2) & 0x1); \
416                 *c++ =   ((xmc[28] & 0x3) << 6) \
417                        | ((xmc[29] & 0x7) << 3) \
418                        | (xmc[30] & 0x7); \
419                 *c++ =   ((xmc[31] & 0x7) << 5) \
420                        | ((xmc[32] & 0x7) << 2) \
421                        | ((xmc[33] >> 1) & 0x3); \
422                 *c++ =   ((xmc[33] & 0x1) << 7) \
423                        | ((xmc[34] & 0x7) << 4) \
424                        | ((xmc[35] & 0x7) << 1) \
425                        | ((xmc[36] >> 2) & 0x1); \
426                 *c++ =   ((xmc[36] & 0x3) << 6) \
427                            | ((xmc[37] & 0x7) << 3) \
428                        | (xmc[38] & 0x7); \
429                 *c++ =   ((Nc[3] & 0x7F) << 1) \
430                        | ((bc[3] >> 1) & 0x1); \
431                 *c++ =   ((bc[3] & 0x1) << 7)  \
432                        | ((Mc[3] & 0x3) << 5) \
433                        | ((xmaxc[3] >> 1) & 0x1F); \
434                 *c++ =   ((xmaxc[3] & 0x1) << 7) \
435                        | ((xmc[39] & 0x7) << 4) \
436                        | ((xmc[40] & 0x7) << 1) \
437                        | ((xmc[41] >> 2) & 0x1); \
438                 *c++ =   ((xmc[41] & 0x3) << 6)                 /* 30 */ \
439                        | ((xmc[42] & 0x7) << 3) \
440                        | (xmc[43] & 0x7); \
441                 *c++ =   ((xmc[44] & 0x7) << 5) \
442                        | ((xmc[45] & 0x7) << 2) \
443                        | ((xmc[46] >> 1) & 0x3); \
444                 *c++ =   ((xmc[46] & 0x1) << 7) \
445                        | ((xmc[47] & 0x7) << 4) \
446                        | ((xmc[48] & 0x7) << 1) \
447                        | ((xmc[49] >> 2) & 0x1); \
448                 *c++ =   ((xmc[49] & 0x3) << 6) \
449                        | ((xmc[50] & 0x7) << 3) \
450                            | (xmc[51] & 0x7); \
451 }
452
453 static void conv65( wav_byte * c, gsm_byte * d){
454
455                 unsigned int sr = 0;
456                 unsigned int frame_chain;
457                                 unsigned int    LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4];
458  
459                         sr = *c++;
460                         LARc[0] = sr & 0x3f;  sr >>= 6;
461                         sr |= (uword)*c++ << 2;
462                         LARc[1] = sr & 0x3f;  sr >>= 6;
463                         sr |= (uword)*c++ << 4;
464                         LARc[2] = sr & 0x1f;  sr >>= 5;
465                         LARc[3] = sr & 0x1f;  sr >>= 5;
466                         sr |= (uword)*c++ << 2;
467                         LARc[4] = sr & 0xf;  sr >>= 4;
468                         LARc[5] = sr & 0xf;  sr >>= 4;
469                         sr |= (uword)*c++ << 2;                 /* 5 */
470                         LARc[6] = sr & 0x7;  sr >>= 3;
471                         LARc[7] = sr & 0x7;  sr >>= 3;
472                         sr |= (uword)*c++ << 4;
473                         Nc[0] = sr & 0x7f;  sr >>= 7;
474                         bc[0] = sr & 0x3;  sr >>= 2;
475                         Mc[0] = sr & 0x3;  sr >>= 2;
476                         sr |= (uword)*c++ << 1;
477                         xmaxc[0] = sr & 0x3f;  sr >>= 6;
478                         xmc[0] = sr & 0x7;  sr >>= 3;
479                         sr = *c++;
480                         xmc[1] = sr & 0x7;  sr >>= 3;
481                         xmc[2] = sr & 0x7;  sr >>= 3;
482                         sr |= (uword)*c++ << 2;
483                         xmc[3] = sr & 0x7;  sr >>= 3;
484                         xmc[4] = sr & 0x7;  sr >>= 3;
485                         xmc[5] = sr & 0x7;  sr >>= 3;
486                         sr |= (uword)*c++ << 1;                 /* 10 */
487                         xmc[6] = sr & 0x7;  sr >>= 3;
488                         xmc[7] = sr & 0x7;  sr >>= 3;
489                         xmc[8] = sr & 0x7;  sr >>= 3;
490                         sr = *c++;
491                         xmc[9] = sr & 0x7;  sr >>= 3;
492                         xmc[10] = sr & 0x7;  sr >>= 3;
493                         sr |= (uword)*c++ << 2;
494                         xmc[11] = sr & 0x7;  sr >>= 3;
495                         xmc[12] = sr & 0x7;  sr >>= 3;
496                         sr |= (uword)*c++ << 4;
497                         Nc[1] = sr & 0x7f;  sr >>= 7;
498                         bc[1] = sr & 0x3;  sr >>= 2;
499                         Mc[1] = sr & 0x3;  sr >>= 2;
500                         sr |= (uword)*c++ << 1;
501                         xmaxc[1] = sr & 0x3f;  sr >>= 6;
502                         xmc[13] = sr & 0x7;  sr >>= 3;
503                         sr = *c++;                              /* 15 */
504                         xmc[14] = sr & 0x7;  sr >>= 3;
505                         xmc[15] = sr & 0x7;  sr >>= 3;
506                         sr |= (uword)*c++ << 2;
507                         xmc[16] = sr & 0x7;  sr >>= 3;
508                         xmc[17] = sr & 0x7;  sr >>= 3;
509                         xmc[18] = sr & 0x7;  sr >>= 3;
510                         sr |= (uword)*c++ << 1;
511                         xmc[19] = sr & 0x7;  sr >>= 3;
512                         xmc[20] = sr & 0x7;  sr >>= 3;
513                         xmc[21] = sr & 0x7;  sr >>= 3;
514                         sr = *c++;
515                         xmc[22] = sr & 0x7;  sr >>= 3;
516                         xmc[23] = sr & 0x7;  sr >>= 3;
517                         sr |= (uword)*c++ << 2;
518                         xmc[24] = sr & 0x7;  sr >>= 3;
519                         xmc[25] = sr & 0x7;  sr >>= 3;
520                         sr |= (uword)*c++ << 4;                 /* 20 */
521                         Nc[2] = sr & 0x7f;  sr >>= 7;
522                         bc[2] = sr & 0x3;  sr >>= 2;
523                         Mc[2] = sr & 0x3;  sr >>= 2;
524                         sr |= (uword)*c++ << 1;
525                         xmaxc[2] = sr & 0x3f;  sr >>= 6;
526                         xmc[26] = sr & 0x7;  sr >>= 3;
527                         sr = *c++;
528                         xmc[27] = sr & 0x7;  sr >>= 3;
529                         xmc[28] = sr & 0x7;  sr >>= 3;
530                         sr |= (uword)*c++ << 2;
531                         xmc[29] = sr & 0x7;  sr >>= 3;
532                         xmc[30] = sr & 0x7;  sr >>= 3;
533                         xmc[31] = sr & 0x7;  sr >>= 3;
534                         sr |= (uword)*c++ << 1;
535                         xmc[32] = sr & 0x7;  sr >>= 3;
536                         xmc[33] = sr & 0x7;  sr >>= 3;
537                         xmc[34] = sr & 0x7;  sr >>= 3;
538                         sr = *c++;                              /* 25 */
539                         xmc[35] = sr & 0x7;  sr >>= 3;
540                         xmc[36] = sr & 0x7;  sr >>= 3;
541                         sr |= (uword)*c++ << 2;
542                         xmc[37] = sr & 0x7;  sr >>= 3;
543                         xmc[38] = sr & 0x7;  sr >>= 3;
544                         sr |= (uword)*c++ << 4;
545                         Nc[3] = sr & 0x7f;  sr >>= 7;
546                         bc[3] = sr & 0x3;  sr >>= 2;
547                         Mc[3] = sr & 0x3;  sr >>= 2;
548                         sr |= (uword)*c++ << 1;
549                         xmaxc[3] = sr & 0x3f;  sr >>= 6;
550                         xmc[39] = sr & 0x7;  sr >>= 3;
551                         sr = *c++;
552                         xmc[40] = sr & 0x7;  sr >>= 3;
553                         xmc[41] = sr & 0x7;  sr >>= 3;
554                         sr |= (uword)*c++ << 2;                 /* 30 */
555                         xmc[42] = sr & 0x7;  sr >>= 3;
556                         xmc[43] = sr & 0x7;  sr >>= 3;
557                         xmc[44] = sr & 0x7;  sr >>= 3;
558                         sr |= (uword)*c++ << 1;
559                         xmc[45] = sr & 0x7;  sr >>= 3;
560                         xmc[46] = sr & 0x7;  sr >>= 3;
561                         xmc[47] = sr & 0x7;  sr >>= 3;
562                         sr = *c++;
563                         xmc[49] = sr & 0x7;  sr >>= 3;
564                         sr |= (uword)*c++ << 2;
565                         xmc[50] = sr & 0x7;  sr >>= 3;
566                         xmc[51] = sr & 0x7;  sr >>= 3;
567
568                         frame_chain = sr & 0xf;
569
570
571                         writeGSM_33(d);// LARc etc. -> array of 33 GSM bytes
572
573
574                         sr = frame_chain;
575                         sr |= (uword)*c++ << 4;                 /* 1 */
576                         LARc[0] = sr & 0x3f;  sr >>= 6;
577                         LARc[1] = sr & 0x3f;  sr >>= 6;
578                         sr = *c++;
579                         LARc[2] = sr & 0x1f;  sr >>= 5;
580                         sr |= (uword)*c++ << 3;
581                         LARc[3] = sr & 0x1f;  sr >>= 5;
582                         LARc[4] = sr & 0xf;  sr >>= 4;
583                         sr |= (uword)*c++ << 2;
584                         LARc[5] = sr & 0xf;  sr >>= 4;
585                         LARc[6] = sr & 0x7;  sr >>= 3;
586                         LARc[7] = sr & 0x7;  sr >>= 3;
587                         sr = *c++;                              /* 5 */
588                         Nc[0] = sr & 0x7f;  sr >>= 7;
589                         sr |= (uword)*c++ << 1;
590                         bc[0] = sr & 0x3;  sr >>= 2;
591                         Mc[0] = sr & 0x3;  sr >>= 2;
592                         sr |= (uword)*c++ << 5;
593                         xmaxc[0] = sr & 0x3f;  sr >>= 6;
594                         xmc[0] = sr & 0x7;  sr >>= 3;
595                         xmc[1] = sr & 0x7;  sr >>= 3;
596                         sr |= (uword)*c++ << 1;
597                         xmc[2] = sr & 0x7;  sr >>= 3;
598                         xmc[3] = sr & 0x7;  sr >>= 3;
599                         xmc[4] = sr & 0x7;  sr >>= 3;
600                         sr = *c++;
601                         xmc[5] = sr & 0x7;  sr >>= 3;
602                         xmc[6] = sr & 0x7;  sr >>= 3;
603                         sr |= (uword)*c++ << 2;                 /* 10 */
604                         xmc[7] = sr & 0x7;  sr >>= 3;
605                         xmc[8] = sr & 0x7;  sr >>= 3;
606                         xmc[9] = sr & 0x7;  sr >>= 3;
607                         sr |= (uword)*c++ << 1;
608                         xmc[10] = sr & 0x7;  sr >>= 3;
609                         xmc[11] = sr & 0x7;  sr >>= 3;
610                         xmc[12] = sr & 0x7;  sr >>= 3;
611                         sr = *c++;
612                         Nc[1] = sr & 0x7f;  sr >>= 7;
613                         sr |= (uword)*c++ << 1;
614                         bc[1] = sr & 0x3;  sr >>= 2;
615                         Mc[1] = sr & 0x3;  sr >>= 2;
616                         sr |= (uword)*c++ << 5;
617                         xmaxc[1] = sr & 0x3f;  sr >>= 6;
618                         xmc[13] = sr & 0x7;  sr >>= 3;
619                         xmc[14] = sr & 0x7;  sr >>= 3;
620                         sr |= (uword)*c++ << 1;                 /* 15 */
621                         xmc[15] = sr & 0x7;  sr >>= 3;
622                         xmc[16] = sr & 0x7;  sr >>= 3;
623                         xmc[17] = sr & 0x7;  sr >>= 3;
624                         sr = *c++;
625                         xmc[18] = sr & 0x7;  sr >>= 3;
626                         xmc[19] = sr & 0x7;  sr >>= 3;
627                         sr |= (uword)*c++ << 2;
628                         xmc[20] = sr & 0x7;  sr >>= 3;
629                         xmc[21] = sr & 0x7;  sr >>= 3;
630                         xmc[22] = sr & 0x7;  sr >>= 3;
631                         sr |= (uword)*c++ << 1;
632                         xmc[23] = sr & 0x7;  sr >>= 3;
633                         xmc[24] = sr & 0x7;  sr >>= 3;
634                         xmc[25] = sr & 0x7;  sr >>= 3;
635                         sr = *c++;
636                         Nc[2] = sr & 0x7f;  sr >>= 7;
637                         sr |= (uword)*c++ << 1;                 /* 20 */
638                         bc[2] = sr & 0x3;  sr >>= 2;
639                         Mc[2] = sr & 0x3;  sr >>= 2;
640                         sr |= (uword)*c++ << 5;
641                         xmaxc[2] = sr & 0x3f;  sr >>= 6;
642                         xmc[26] = sr & 0x7;  sr >>= 3;
643                         xmc[27] = sr & 0x7;  sr >>= 3;
644                         sr |= (uword)*c++ << 1;
645                         xmc[28] = sr & 0x7;  sr >>= 3;
646                         xmc[29] = sr & 0x7;  sr >>= 3;
647                         xmc[30] = sr & 0x7;  sr >>= 3;
648                         sr = *c++;
649                         xmc[31] = sr & 0x7;  sr >>= 3;
650                         xmc[32] = sr & 0x7;  sr >>= 3;
651                         sr |= (uword)*c++ << 2;
652                         xmc[33] = sr & 0x7;  sr >>= 3;
653                         xmc[34] = sr & 0x7;  sr >>= 3;
654                         xmc[35] = sr & 0x7;  sr >>= 3;
655                         sr |= (uword)*c++ << 1;                 /* 25 */
656                         xmc[36] = sr & 0x7;  sr >>= 3;
657                         xmc[37] = sr & 0x7;  sr >>= 3;
658                         xmc[38] = sr & 0x7;  sr >>= 3;
659                         sr = *c++;
660                         Nc[3] = sr & 0x7f;  sr >>= 7;
661                         sr |= (uword)*c++ << 1;
662                         bc[3] = sr & 0x3;  sr >>= 2;
663                         Mc[3] = sr & 0x3;  sr >>= 2;
664                         sr |= (uword)*c++ << 5;
665                         xmaxc[3] = sr & 0x3f;  sr >>= 6;
666                         xmc[39] = sr & 0x7;  sr >>= 3;
667                         xmc[40] = sr & 0x7;  sr >>= 3;
668                         sr |= (uword)*c++ << 1;
669                         xmc[41] = sr & 0x7;  sr >>= 3;
670                         xmc[42] = sr & 0x7;  sr >>= 3;
671                         xmc[43] = sr & 0x7;  sr >>= 3;
672                         sr = *c++;                              /* 30 */
673                         xmc[44] = sr & 0x7;  sr >>= 3;
674                         xmc[45] = sr & 0x7;  sr >>= 3;
675                         sr |= (uword)*c++ << 2;
676                         xmc[46] = sr & 0x7;  sr >>= 3;
677                         xmc[47] = sr & 0x7;  sr >>= 3;
678                         xmc[48] = sr & 0x7;  sr >>= 3;
679                         sr |= (uword)*c++ << 1;
680                         xmc[49] = sr & 0x7;  sr >>= 3;
681                         xmc[50] = sr & 0x7;  sr >>= 3;
682                         xmc[51] = sr & 0x7;  sr >>= 3;
683                         writeGSM_33(d+33);
684
685 }