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