Sat Aug 6 00:39:30 2011

Asterisk developer's documentation


msgsm.h

Go to the documentation of this file.
00001 /* Conversion routines derived from code by guido@sienanet.it */
00002 
00003 #define GSM_MAGIC 0xD
00004 
00005 #ifndef GSM_H
00006 typedef unsigned char           gsm_byte;
00007 #endif
00008 typedef unsigned char           wav_byte;
00009 typedef unsigned int       uword;
00010 
00011 #define readGSM_33(c1) { \
00012       gsm_byte *c = (c1); \
00013         LARc[0]  = (*c++ & 0xF) << 2;           /* 1 */ \
00014         LARc[0] |= (*c >> 6) & 0x3; \
00015         LARc[1]  = *c++ & 0x3F; \
00016         LARc[2]  = (*c >> 3) & 0x1F; \
00017         LARc[3]  = (*c++ & 0x7) << 2; \
00018         LARc[3] |= (*c >> 6) & 0x3; \
00019         LARc[4]  = (*c >> 2) & 0xF; \
00020         LARc[5]  = (*c++ & 0x3) << 2; \
00021         LARc[5] |= (*c >> 6) & 0x3; \
00022         LARc[6]  = (*c >> 3) & 0x7; \
00023         LARc[7]  = *c++ & 0x7; \
00024         Nc[0]  = (*c >> 1) & 0x7F; \
00025         bc[0]  = (*c++ & 0x1) << 1; \
00026         bc[0] |= (*c >> 7) & 0x1; \
00027         Mc[0]  = (*c >> 5) & 0x3; \
00028         xmaxc[0]  = (*c++ & 0x1F) << 1; \
00029         xmaxc[0] |= (*c >> 7) & 0x1; \
00030         xmc[0]  = (*c >> 4) & 0x7; \
00031         xmc[1]  = (*c >> 1) & 0x7; \
00032         xmc[2]  = (*c++ & 0x1) << 2; \
00033         xmc[2] |= (*c >> 6) & 0x3; \
00034         xmc[3]  = (*c >> 3) & 0x7; \
00035         xmc[4]  = *c++ & 0x7; \
00036         xmc[5]  = (*c >> 5) & 0x7; \
00037         xmc[6]  = (*c >> 2) & 0x7; \
00038         xmc[7]  = (*c++ & 0x3) << 1;            /* 10 */ \
00039         xmc[7] |= (*c >> 7) & 0x1; \
00040         xmc[8]  = (*c >> 4) & 0x7; \
00041         xmc[9]  = (*c >> 1) & 0x7; \
00042         xmc[10]  = (*c++ & 0x1) << 2; \
00043         xmc[10] |= (*c >> 6) & 0x3; \
00044         xmc[11]  = (*c >> 3) & 0x7; \
00045         xmc[12]  = *c++ & 0x7; \
00046         Nc[1]  = (*c >> 1) & 0x7F; \
00047         bc[1]  = (*c++ & 0x1) << 1; \
00048         bc[1] |= (*c >> 7) & 0x1; \
00049         Mc[1]  = (*c >> 5) & 0x3; \
00050         xmaxc[1]  = (*c++ & 0x1F) << 1; \
00051         xmaxc[1] |= (*c >> 7) & 0x1; \
00052         xmc[13]  = (*c >> 4) & 0x7; \
00053         xmc[14]  = (*c >> 1) & 0x7; \
00054         xmc[15]  = (*c++ & 0x1) << 2; \
00055         xmc[15] |= (*c >> 6) & 0x3; \
00056         xmc[16]  = (*c >> 3) & 0x7; \
00057         xmc[17]  = *c++ & 0x7; \
00058         xmc[18]  = (*c >> 5) & 0x7; \
00059         xmc[19]  = (*c >> 2) & 0x7; \
00060         xmc[20]  = (*c++ & 0x3) << 1; \
00061         xmc[20] |= (*c >> 7) & 0x1; \
00062         xmc[21]  = (*c >> 4) & 0x7; \
00063         xmc[22]  = (*c >> 1) & 0x7; \
00064         xmc[23]  = (*c++ & 0x1) << 2; \
00065         xmc[23] |= (*c >> 6) & 0x3; \
00066         xmc[24]  = (*c >> 3) & 0x7; \
00067         xmc[25]  = *c++ & 0x7; \
00068         Nc[2]  = (*c >> 1) & 0x7F; \
00069         bc[2]  = (*c++ & 0x1) << 1;             /* 20 */ \
00070         bc[2] |= (*c >> 7) & 0x1; \
00071         Mc[2]  = (*c >> 5) & 0x3; \
00072         xmaxc[2]  = (*c++ & 0x1F) << 1; \
00073         xmaxc[2] |= (*c >> 7) & 0x1; \
00074         xmc[26]  = (*c >> 4) & 0x7; \
00075         xmc[27]  = (*c >> 1) & 0x7; \
00076         xmc[28]  = (*c++ & 0x1) << 2; \
00077         xmc[28] |= (*c >> 6) & 0x3; \
00078         xmc[29]  = (*c >> 3) & 0x7; \
00079         xmc[30]  = *c++ & 0x7; \
00080         xmc[31]  = (*c >> 5) & 0x7; \
00081         xmc[32]  = (*c >> 2) & 0x7; \
00082         xmc[33]  = (*c++ & 0x3) << 1; \
00083         xmc[33] |= (*c >> 7) & 0x1; \
00084         xmc[34]  = (*c >> 4) & 0x7; \
00085         xmc[35]  = (*c >> 1) & 0x7; \
00086         xmc[36]  = (*c++ & 0x1) << 2; \
00087         xmc[36] |= (*c >> 6) & 0x3; \
00088         xmc[37]  = (*c >> 3) & 0x7; \
00089         xmc[38]  = *c++ & 0x7; \
00090         Nc[3]  = (*c >> 1) & 0x7F; \
00091         bc[3]  = (*c++ & 0x1) << 1; \
00092         bc[3] |= (*c >> 7) & 0x1; \
00093         Mc[3]  = (*c >> 5) & 0x3; \
00094         xmaxc[3]  = (*c++ & 0x1F) << 1; \
00095         xmaxc[3] |= (*c >> 7) & 0x1; \
00096         xmc[39]  = (*c >> 4) & 0x7; \
00097         xmc[40]  = (*c >> 1) & 0x7; \
00098         xmc[41]  = (*c++ & 0x1) << 2; \
00099         xmc[41] |= (*c >> 6) & 0x3; \
00100         xmc[42]  = (*c >> 3) & 0x7; \
00101         xmc[43]  = *c++ & 0x7;                  /* 30  */ \
00102         xmc[44]  = (*c >> 5) & 0x7; \
00103         xmc[45]  = (*c >> 2) & 0x7; \
00104         xmc[46]  = (*c++ & 0x3) << 1; \
00105         xmc[46] |= (*c >> 7) & 0x1; \
00106         xmc[47]  = (*c >> 4) & 0x7; \
00107         xmc[48]  = (*c >> 1) & 0x7; \
00108         xmc[49]  = (*c++ & 0x1) << 2; \
00109         xmc[49] |= (*c >> 6) & 0x3; \
00110         xmc[50]  = (*c >> 3) & 0x7; \
00111         xmc[51]  = *c & 0x7;                    /* 33 */ \
00112 }
00113 
00114 static inline void conv66(gsm_byte * d, wav_byte * c) {
00115    gsm_byte frame_chain;
00116     unsigned int sr;
00117    unsigned int    LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4];
00118    
00119    readGSM_33(d);
00120    sr = 0;
00121    sr = (sr >> 6) | (LARc[0] << 10);
00122    sr = (sr >> 6) | (LARc[1] << 10);
00123    *c++ = sr >> 4;
00124    sr = (sr >> 5) | (LARc[2] << 11);
00125    *c++ = sr >> 7;
00126    sr = (sr >> 5) | (LARc[3] << 11);
00127    sr = (sr >> 4) | (LARc[4] << 12);
00128    *c++ = sr >> 6;
00129    sr = (sr >> 4) | (LARc[5] << 12);
00130    sr = (sr >> 3) | (LARc[6] << 13);
00131    *c++ = sr >> 7;
00132    sr = (sr >> 3) | (LARc[7] << 13);
00133    sr = (sr >> 7) | (Nc[0] << 9);
00134    *c++ = sr >> 5;
00135    sr = (sr >> 2) | (bc[0] << 14);
00136    sr = (sr >> 2) | (Mc[0] << 14);
00137    sr = (sr >> 6) | (xmaxc[0] << 10);
00138    *c++ = sr >> 3;
00139    sr = (sr >> 3 )|( xmc[0] << 13);
00140    *c++ = sr >> 8;
00141    sr = (sr >> 3 )|( xmc[1] << 13);
00142    sr = (sr >> 3 )|( xmc[2] << 13);
00143     sr = (sr >> 3 )|( xmc[3] << 13);
00144     *c++ = sr >> 7;
00145     sr = (sr >> 3 )|( xmc[4] << 13);
00146     sr = (sr >> 3 )|( xmc[5] << 13);
00147     sr = (sr >> 3 )|( xmc[6] << 13);
00148     *c++ = sr >> 6;
00149     sr = (sr >> 3 )|( xmc[7] << 13);
00150     sr = (sr >> 3 )|( xmc[8] << 13);
00151     *c++ = sr >> 8;
00152     sr = (sr >> 3 )|( xmc[9] << 13);
00153     sr = (sr >> 3 )|( xmc[10] << 13);
00154     sr = (sr >> 3 )|( xmc[11] << 13);
00155     *c++ = sr >> 7;
00156     sr = (sr >> 3 )|( xmc[12] << 13);
00157     sr = (sr >> 7 )|( Nc[1] << 9);
00158     *c++ = sr >> 5;
00159     sr = (sr >> 2 )|( bc[1] << 14);
00160     sr = (sr >> 2 )|( Mc[1] << 14);
00161     sr = (sr >> 6 )|( xmaxc[1] << 10);
00162     *c++ = sr >> 3;
00163     sr = (sr >> 3 )|( xmc[13] << 13);
00164     *c++ = sr >> 8;
00165     sr = (sr >> 3 )|( xmc[14] << 13);
00166     sr = (sr >> 3 )|( xmc[15] << 13);
00167     sr = (sr >> 3 )|( xmc[16] << 13);
00168     *c++ = sr >> 7;
00169     sr = (sr >> 3 )|( xmc[17] << 13);
00170     sr = (sr >> 3 )|( xmc[18] << 13);
00171     sr = (sr >> 3 )|( xmc[19] << 13);
00172     *c++ = sr >> 6;
00173     sr = (sr >> 3 )|( xmc[20] << 13);
00174     sr = (sr >> 3 )|( xmc[21] << 13);
00175     *c++ = sr >> 8;
00176     sr = (sr >> 3 )|( xmc[22] << 13);
00177     sr = (sr >> 3 )|( xmc[23] << 13);
00178     sr = (sr >> 3 )|( xmc[24] << 13);
00179     *c++ = sr >> 7;
00180     sr = (sr >> 3 )|( xmc[25] << 13);
00181     sr = (sr >> 7 )|( Nc[2] << 9);
00182     *c++ = sr >> 5;
00183     sr = (sr >> 2 )|( bc[2] << 14);
00184     sr = (sr >> 2 )|( Mc[2] << 14);
00185     sr = (sr >> 6 )|( xmaxc[2] << 10);
00186     *c++ = sr >> 3;
00187     sr = (sr >> 3 )|( xmc[26] << 13);
00188     *c++ = sr >> 8;
00189     sr = (sr >> 3 )|( xmc[27] << 13);
00190     sr = (sr >> 3 )|( xmc[28] << 13);
00191     sr = (sr >> 3 )|( xmc[29] << 13);
00192     *c++ = sr >> 7;
00193     sr = (sr >> 3 )|( xmc[30] << 13);
00194     sr = (sr >> 3 )|( xmc[31] << 13);
00195     sr = (sr >> 3 )|( xmc[32] << 13);
00196     *c++ = sr >> 6;
00197     sr = (sr >> 3 )|( xmc[33] << 13);
00198     sr = (sr >> 3 )|( xmc[34] << 13);
00199     *c++ = sr >> 8;
00200     sr = (sr >> 3 )|( xmc[35] << 13);
00201     sr = (sr >> 3 )|( xmc[36] << 13);
00202     sr = (sr >> 3 )|( xmc[37] << 13);
00203     *c++ = sr >> 7;
00204     sr = (sr >> 3 )|( xmc[38] << 13);
00205     sr = (sr >> 7 )|( Nc[3] << 9);
00206     *c++ = sr >> 5;
00207     sr = (sr >> 2 )|( bc[3] << 14);
00208     sr = (sr >> 2 )|( Mc[3] << 14);
00209     sr = (sr >> 6 )|( xmaxc[3] << 10);
00210     *c++ = sr >> 3;
00211     sr = (sr >> 3 )|( xmc[39] << 13);
00212     *c++ = sr >> 8;
00213     sr = (sr >> 3 )|( xmc[40] << 13);
00214     sr = (sr >> 3 )|( xmc[41] << 13);
00215     sr = (sr >> 3 )|( xmc[42] << 13);
00216     *c++ = sr >> 7;
00217     sr = (sr >> 3 )|( xmc[43] << 13);
00218     sr = (sr >> 3 )|( xmc[44] << 13);
00219     sr = (sr >> 3 )|( xmc[45] << 13);
00220     *c++ = sr >> 6;
00221     sr = (sr >> 3 )|( xmc[46] << 13);
00222     sr = (sr >> 3 )|( xmc[47] << 13);
00223     *c++ = sr >> 8;
00224     sr = (sr >> 3 )|( xmc[48] << 13);
00225     sr = (sr >> 3 )|( xmc[49] << 13);
00226     sr = (sr >> 3 )|( xmc[50] << 13);
00227     *c++ = sr >> 7;
00228     sr = (sr >> 3 )|( xmc[51] << 13);
00229     sr = sr >> 4;
00230     *c = sr >> 8;
00231     frame_chain = *c;
00232     readGSM_33(d+33); /* puts all the parameters into LARc etc. */
00233 
00234 
00235     sr = 0;
00236 /*                       sr = (sr >> 4 )|( s->frame_chain << 12); */
00237     sr = (sr >> 4 )|( frame_chain << 12);
00238 
00239     sr = (sr >> 6 )|( LARc[0] << 10);
00240     *c++ = sr >> 6;
00241     sr = (sr >> 6 )|( LARc[1] << 10);
00242     *c++ = sr >> 8;
00243     sr = (sr >> 5 )|( LARc[2] << 11);
00244     sr = (sr >> 5 )|( LARc[3] << 11);
00245     *c++ = sr >> 6;
00246     sr = (sr >> 4 )|( LARc[4] << 12);
00247     sr = (sr >> 4 )|( LARc[5] << 12);
00248     *c++ = sr >> 6;
00249     sr = (sr >> 3 )|( LARc[6] << 13);
00250     sr = (sr >> 3 )|( LARc[7] << 13);
00251     *c++ = sr >> 8;
00252     sr = (sr >> 7 )|( Nc[0] << 9);
00253     sr = (sr >> 2 )|( bc[0] << 14);
00254     *c++ = sr >> 7;
00255     sr = (sr >> 2 )|( Mc[0] << 14);
00256     sr = (sr >> 6 )|( xmaxc[0] << 10);
00257     *c++ = sr >> 7;
00258     sr = (sr >> 3 )|( xmc[0] << 13);
00259     sr = (sr >> 3 )|( xmc[1] << 13);
00260     sr = (sr >> 3 )|( xmc[2] << 13);
00261     *c++ = sr >> 6;
00262     sr = (sr >> 3 )|( xmc[3] << 13);
00263     sr = (sr >> 3 )|( xmc[4] << 13);
00264     *c++ = sr >> 8;
00265     sr = (sr >> 3 )|( xmc[5] << 13);
00266     sr = (sr >> 3 )|( xmc[6] << 13);
00267     sr = (sr >> 3 )|( xmc[7] << 13);
00268     *c++ = sr >> 7;
00269     sr = (sr >> 3 )|( xmc[8] << 13);
00270     sr = (sr >> 3 )|( xmc[9] << 13);
00271     sr = (sr >> 3 )|( xmc[10] << 13);
00272     *c++ = sr >> 6;
00273     sr = (sr >> 3 )|( xmc[11] << 13);
00274     sr = (sr >> 3 )|( xmc[12] << 13);
00275     *c++ = sr >> 8;
00276     sr = (sr >> 7 )|( Nc[1] << 9);
00277     sr = (sr >> 2 )|( bc[1] << 14);
00278     *c++ = sr >> 7;
00279     sr = (sr >> 2 )|( Mc[1] << 14);
00280     sr = (sr >> 6 )|( xmaxc[1] << 10);
00281     *c++ = sr >> 7;
00282     sr = (sr >> 3 )|( xmc[13] << 13);
00283     sr = (sr >> 3 )|( xmc[14] << 13);
00284     sr = (sr >> 3 )|( xmc[15] << 13);
00285     *c++ = sr >> 6;
00286     sr = (sr >> 3 )|( xmc[16] << 13);
00287     sr = (sr >> 3 )|( xmc[17] << 13);
00288     *c++ = sr >> 8;
00289     sr = (sr >> 3 )|( xmc[18] << 13);
00290     sr = (sr >> 3 )|( xmc[19] << 13);
00291     sr = (sr >> 3 )|( xmc[20] << 13);
00292     *c++ = sr >> 7;
00293     sr = (sr >> 3 )|( xmc[21] << 13);
00294     sr = (sr >> 3 )|( xmc[22] << 13);
00295     sr = (sr >> 3 )|( xmc[23] << 13);
00296     *c++ = sr >> 6;
00297     sr = (sr >> 3 )|( xmc[24] << 13);
00298     sr = (sr >> 3 )|( xmc[25] << 13);
00299     *c++ = sr >> 8;
00300     sr = (sr >> 7 )|( Nc[2] << 9);
00301     sr = (sr >> 2 )|( bc[2] << 14);
00302     *c++ = sr >> 7;
00303     sr = (sr >> 2 )|( Mc[2] << 14);
00304     sr = (sr >> 6 )|( xmaxc[2] << 10);
00305     *c++ = sr >> 7;
00306     sr = (sr >> 3 )|( xmc[26] << 13);
00307     sr = (sr >> 3 )|( xmc[27] << 13);
00308     sr = (sr >> 3 )|( xmc[28] << 13);
00309     *c++ = sr >> 6;
00310     sr = (sr >> 3 )|( xmc[29] << 13);
00311     sr = (sr >> 3 )|( xmc[30] << 13);
00312     *c++ = sr >> 8;
00313     sr = (sr >> 3 )|( xmc[31] << 13);
00314     sr = (sr >> 3 )|( xmc[32] << 13);
00315     sr = (sr >> 3 )|( xmc[33] << 13);
00316     *c++ = sr >> 7;
00317     sr = (sr >> 3 )|( xmc[34] << 13);
00318     sr = (sr >> 3 )|( xmc[35] << 13);
00319     sr = (sr >> 3 )|( xmc[36] << 13);
00320     *c++ = sr >> 6;
00321     sr = (sr >> 3 )|( xmc[37] << 13);
00322     sr = (sr >> 3 )|( xmc[38] << 13);
00323     *c++ = sr >> 8;
00324     sr = (sr >> 7 )|( Nc[3] << 9);
00325     sr = (sr >> 2 )|( bc[3] << 14);
00326     *c++ = sr >> 7;
00327     sr = (sr >> 2 )|( Mc[3] << 14);
00328     sr = (sr >> 6 )|( xmaxc[3] << 10);
00329     *c++ = sr >> 7;
00330     sr = (sr >> 3 )|( xmc[39] << 13);
00331     sr = (sr >> 3 )|( xmc[40] << 13);
00332     sr = (sr >> 3 )|( xmc[41] << 13);
00333     *c++ = sr >> 6;
00334     sr = (sr >> 3 )|( xmc[42] << 13);
00335     sr = (sr >> 3 )|( xmc[43] << 13);
00336     *c++ = sr >> 8;
00337     sr = (sr >> 3 )|( xmc[44] << 13);
00338     sr = (sr >> 3 )|( xmc[45] << 13);
00339     sr = (sr >> 3 )|( xmc[46] << 13);
00340     *c++ = sr >> 7;
00341     sr = (sr >> 3 )|( xmc[47] << 13);
00342     sr = (sr >> 3 )|( xmc[48] << 13);
00343     sr = (sr >> 3 )|( xmc[49] << 13);
00344     *c++ = sr >> 6;
00345     sr = (sr >> 3 )|( xmc[50] << 13);
00346     sr = (sr >> 3 )|( xmc[51] << 13);
00347     *c++ = sr >> 8;
00348 
00349 }
00350 
00351 #define writeGSM_33(c1) { \
00352             gsm_byte *c = (c1); \
00353                 *c++ =   ((GSM_MAGIC & 0xF) << 4)               /* 1 */ \
00354                            | ((LARc[0] >> 2) & 0xF); \
00355                 *c++ =   ((LARc[0] & 0x3) << 6) \
00356                            | (LARc[1] & 0x3F); \
00357                 *c++ =   ((LARc[2] & 0x1F) << 3) \
00358                            | ((LARc[3] >> 2) & 0x7); \
00359                 *c++ =   ((LARc[3] & 0x3) << 6) \
00360                        | ((LARc[4] & 0xF) << 2) \
00361                        | ((LARc[5] >> 2) & 0x3); \
00362                 *c++ =   ((LARc[5] & 0x3) << 6) \
00363                        | ((LARc[6] & 0x7) << 3) \
00364                        | (LARc[7] & 0x7);   \
00365                 *c++ =   ((Nc[0] & 0x7F) << 1) \
00366                        | ((bc[0] >> 1) & 0x1); \
00367                 *c++ =   ((bc[0] & 0x1) << 7) \
00368                        | ((Mc[0] & 0x3) << 5) \
00369                        | ((xmaxc[0] >> 1) & 0x1F); \
00370                 *c++ =   ((xmaxc[0] & 0x1) << 7) \
00371                        | ((xmc[0] & 0x7) << 4) \
00372                        | ((xmc[1] & 0x7) << 1) \
00373                            | ((xmc[2] >> 2) & 0x1); \
00374                 *c++ =   ((xmc[2] & 0x3) << 6) \
00375                        | ((xmc[3] & 0x7) << 3) \
00376                        | (xmc[4] & 0x7); \
00377                 *c++ =   ((xmc[5] & 0x7) << 5)                  /* 10 */ \
00378                        | ((xmc[6] & 0x7) << 2) \
00379                        | ((xmc[7] >> 1) & 0x3); \
00380                 *c++ =   ((xmc[7] & 0x1) << 7) \
00381                        | ((xmc[8] & 0x7) << 4) \
00382                        | ((xmc[9] & 0x7) << 1) \
00383                        | ((xmc[10] >> 2) & 0x1); \
00384                 *c++ =   ((xmc[10] & 0x3) << 6) \
00385                        | ((xmc[11] & 0x7) << 3) \
00386                        | (xmc[12] & 0x7); \
00387                 *c++ =   ((Nc[1] & 0x7F) << 1) \
00388                        | ((bc[1] >> 1) & 0x1); \
00389                 *c++ =   ((bc[1] & 0x1) << 7) \
00390                        | ((Mc[1] & 0x3) << 5) \
00391                        | ((xmaxc[1] >> 1) & 0x1F);  \
00392                 *c++ =   ((xmaxc[1] & 0x1) << 7) \
00393                        | ((xmc[13] & 0x7) << 4) \
00394                            | ((xmc[14] & 0x7) << 1) \
00395                        | ((xmc[15] >> 2) & 0x1); \
00396                 *c++ =   ((xmc[15] & 0x3) << 6) \
00397                        | ((xmc[16] & 0x7) << 3) \
00398                        | (xmc[17] & 0x7); \
00399                 *c++ =   ((xmc[18] & 0x7) << 5) \
00400                        | ((xmc[19] & 0x7) << 2) \
00401                        | ((xmc[20] >> 1) & 0x3); \
00402                 *c++ =   ((xmc[20] & 0x1) << 7) \
00403                        | ((xmc[21] & 0x7) << 4) \
00404                        | ((xmc[22] & 0x7) << 1) \
00405                            | ((xmc[23] >> 2) & 0x1); \
00406                 *c++ =   ((xmc[23] & 0x3) << 6) \
00407                        | ((xmc[24] & 0x7) << 3) \
00408                            | (xmc[25] & 0x7); \
00409                 *c++ =   ((Nc[2] & 0x7F) << 1)                  /* 20 */ \
00410                        | ((bc[2] >> 1) & 0x1); \
00411                 *c++ =   ((bc[2] & 0x1) << 7) \
00412                        | ((Mc[2] & 0x3) << 5) \
00413                        | ((xmaxc[2] >> 1) & 0x1F); \
00414                 *c++ =   ((xmaxc[2] & 0x1) << 7)   \
00415                        | ((xmc[26] & 0x7) << 4) \
00416                        | ((xmc[27] & 0x7) << 1) \
00417                        | ((xmc[28] >> 2) & 0x1); \
00418                 *c++ =   ((xmc[28] & 0x3) << 6) \
00419                        | ((xmc[29] & 0x7) << 3) \
00420                        | (xmc[30] & 0x7); \
00421                 *c++ =   ((xmc[31] & 0x7) << 5) \
00422                        | ((xmc[32] & 0x7) << 2) \
00423                        | ((xmc[33] >> 1) & 0x3); \
00424                 *c++ =   ((xmc[33] & 0x1) << 7) \
00425                        | ((xmc[34] & 0x7) << 4) \
00426                        | ((xmc[35] & 0x7) << 1) \
00427                        | ((xmc[36] >> 2) & 0x1); \
00428                 *c++ =   ((xmc[36] & 0x3) << 6) \
00429                            | ((xmc[37] & 0x7) << 3) \
00430                        | (xmc[38] & 0x7); \
00431                 *c++ =   ((Nc[3] & 0x7F) << 1) \
00432                        | ((bc[3] >> 1) & 0x1); \
00433                 *c++ =   ((bc[3] & 0x1) << 7)  \
00434                        | ((Mc[3] & 0x3) << 5) \
00435                        | ((xmaxc[3] >> 1) & 0x1F); \
00436                 *c++ =   ((xmaxc[3] & 0x1) << 7) \
00437                        | ((xmc[39] & 0x7) << 4) \
00438                        | ((xmc[40] & 0x7) << 1) \
00439                        | ((xmc[41] >> 2) & 0x1); \
00440                 *c++ =   ((xmc[41] & 0x3) << 6)                 /* 30 */ \
00441                        | ((xmc[42] & 0x7) << 3) \
00442                        | (xmc[43] & 0x7); \
00443                 *c++ =   ((xmc[44] & 0x7) << 5) \
00444                        | ((xmc[45] & 0x7) << 2) \
00445                        | ((xmc[46] >> 1) & 0x3); \
00446                 *c++ =   ((xmc[46] & 0x1) << 7) \
00447                        | ((xmc[47] & 0x7) << 4) \
00448                        | ((xmc[48] & 0x7) << 1) \
00449                        | ((xmc[49] >> 2) & 0x1); \
00450                 *c++ =   ((xmc[49] & 0x3) << 6) \
00451                        | ((xmc[50] & 0x7) << 3) \
00452                            | (xmc[51] & 0x7); \
00453 }
00454 
00455 static inline void conv65( wav_byte * c, gsm_byte * d){
00456 
00457                 unsigned int sr = 0;
00458                 unsigned int frame_chain;
00459       unsigned int LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4];
00460       /* silence bogus compiler warning */
00461       unsigned int xmc[13*4] = { 0, };
00462  
00463                         sr = *c++;
00464                         LARc[0] = sr & 0x3f;  sr >>= 6;
00465                         sr |= (uword)*c++ << 2;
00466                         LARc[1] = sr & 0x3f;  sr >>= 6;
00467                         sr |= (uword)*c++ << 4;
00468                         LARc[2] = sr & 0x1f;  sr >>= 5;
00469                         LARc[3] = sr & 0x1f;  sr >>= 5;
00470                         sr |= (uword)*c++ << 2;
00471                         LARc[4] = sr & 0xf;  sr >>= 4;
00472                         LARc[5] = sr & 0xf;  sr >>= 4;
00473                         sr |= (uword)*c++ << 2;                 /* 5 */
00474                         LARc[6] = sr & 0x7;  sr >>= 3;
00475                         LARc[7] = sr & 0x7;  sr >>= 3;
00476                         sr |= (uword)*c++ << 4;
00477                         Nc[0] = sr & 0x7f;  sr >>= 7;
00478                         bc[0] = sr & 0x3;  sr >>= 2;
00479                         Mc[0] = sr & 0x3;  sr >>= 2;
00480                         sr |= (uword)*c++ << 1;
00481                         xmaxc[0] = sr & 0x3f;  sr >>= 6;
00482                         xmc[0] = sr & 0x7;  sr >>= 3;
00483                         sr = *c++;
00484                         xmc[1] = sr & 0x7;  sr >>= 3;
00485                         xmc[2] = sr & 0x7;  sr >>= 3;
00486                         sr |= (uword)*c++ << 2;
00487                         xmc[3] = sr & 0x7;  sr >>= 3;
00488                         xmc[4] = sr & 0x7;  sr >>= 3;
00489                         xmc[5] = sr & 0x7;  sr >>= 3;
00490                         sr |= (uword)*c++ << 1;                 /* 10 */
00491                         xmc[6] = sr & 0x7;  sr >>= 3;
00492                         xmc[7] = sr & 0x7;  sr >>= 3;
00493                         xmc[8] = sr & 0x7;  sr >>= 3;
00494                         sr = *c++;
00495                         xmc[9] = sr & 0x7;  sr >>= 3;
00496                         xmc[10] = sr & 0x7;  sr >>= 3;
00497                         sr |= (uword)*c++ << 2;
00498                         xmc[11] = sr & 0x7;  sr >>= 3;
00499                         xmc[12] = sr & 0x7;  sr >>= 3;
00500                         sr |= (uword)*c++ << 4;
00501                         Nc[1] = sr & 0x7f;  sr >>= 7;
00502                         bc[1] = sr & 0x3;  sr >>= 2;
00503                         Mc[1] = sr & 0x3;  sr >>= 2;
00504                         sr |= (uword)*c++ << 1;
00505                         xmaxc[1] = sr & 0x3f;  sr >>= 6;
00506                         xmc[13] = sr & 0x7;  sr >>= 3;
00507                         sr = *c++;                              /* 15 */
00508                         xmc[14] = sr & 0x7;  sr >>= 3;
00509                         xmc[15] = sr & 0x7;  sr >>= 3;
00510                         sr |= (uword)*c++ << 2;
00511                         xmc[16] = sr & 0x7;  sr >>= 3;
00512                         xmc[17] = sr & 0x7;  sr >>= 3;
00513                         xmc[18] = sr & 0x7;  sr >>= 3;
00514                         sr |= (uword)*c++ << 1;
00515                         xmc[19] = sr & 0x7;  sr >>= 3;
00516                         xmc[20] = sr & 0x7;  sr >>= 3;
00517                         xmc[21] = sr & 0x7;  sr >>= 3;
00518                         sr = *c++;
00519                         xmc[22] = sr & 0x7;  sr >>= 3;
00520                         xmc[23] = sr & 0x7;  sr >>= 3;
00521                         sr |= (uword)*c++ << 2;
00522                         xmc[24] = sr & 0x7;  sr >>= 3;
00523                         xmc[25] = sr & 0x7;  sr >>= 3;
00524                         sr |= (uword)*c++ << 4;                 /* 20 */
00525                         Nc[2] = sr & 0x7f;  sr >>= 7;
00526                         bc[2] = sr & 0x3;  sr >>= 2;
00527                         Mc[2] = sr & 0x3;  sr >>= 2;
00528                         sr |= (uword)*c++ << 1;
00529                         xmaxc[2] = sr & 0x3f;  sr >>= 6;
00530                         xmc[26] = sr & 0x7;  sr >>= 3;
00531                         sr = *c++;
00532                         xmc[27] = sr & 0x7;  sr >>= 3;
00533                         xmc[28] = sr & 0x7;  sr >>= 3;
00534                         sr |= (uword)*c++ << 2;
00535                         xmc[29] = sr & 0x7;  sr >>= 3;
00536                         xmc[30] = sr & 0x7;  sr >>= 3;
00537                         xmc[31] = sr & 0x7;  sr >>= 3;
00538                         sr |= (uword)*c++ << 1;
00539                         xmc[32] = sr & 0x7;  sr >>= 3;
00540                         xmc[33] = sr & 0x7;  sr >>= 3;
00541                         xmc[34] = sr & 0x7;  sr >>= 3;
00542                         sr = *c++;                              /* 25 */
00543                         xmc[35] = sr & 0x7;  sr >>= 3;
00544                         xmc[36] = sr & 0x7;  sr >>= 3;
00545                         sr |= (uword)*c++ << 2;
00546                         xmc[37] = sr & 0x7;  sr >>= 3;
00547                         xmc[38] = sr & 0x7;  sr >>= 3;
00548                         sr |= (uword)*c++ << 4;
00549                         Nc[3] = sr & 0x7f;  sr >>= 7;
00550                         bc[3] = sr & 0x3;  sr >>= 2;
00551                         Mc[3] = sr & 0x3;  sr >>= 2;
00552                         sr |= (uword)*c++ << 1;
00553                         xmaxc[3] = sr & 0x3f;  sr >>= 6;
00554                         xmc[39] = sr & 0x7;  sr >>= 3;
00555                         sr = *c++;
00556                         xmc[40] = sr & 0x7;  sr >>= 3;
00557                         xmc[41] = sr & 0x7;  sr >>= 3;
00558                         sr |= (uword)*c++ << 2;                 /* 30 */
00559                         xmc[42] = sr & 0x7;  sr >>= 3;
00560                         xmc[43] = sr & 0x7;  sr >>= 3;
00561                         xmc[44] = sr & 0x7;  sr >>= 3;
00562                         sr |= (uword)*c++ << 1;
00563                         xmc[45] = sr & 0x7;  sr >>= 3;
00564                         xmc[46] = sr & 0x7;  sr >>= 3;
00565                         xmc[47] = sr & 0x7;  sr >>= 3;
00566                         sr = *c++;
00567                         xmc[49] = sr & 0x7;  sr >>= 3;
00568                         sr |= (uword)*c++ << 2;
00569                         xmc[50] = sr & 0x7;  sr >>= 3;
00570                         xmc[51] = sr & 0x7;  sr >>= 3;
00571 
00572                         frame_chain = sr & 0xf;
00573 
00574 
00575                         writeGSM_33(d);/* LARc etc. -> array of 33 GSM bytes */
00576 
00577 
00578                         sr = frame_chain;
00579                         sr |= (uword)*c++ << 4;                 /* 1 */
00580                         LARc[0] = sr & 0x3f;  sr >>= 6;
00581                         LARc[1] = sr & 0x3f;  sr >>= 6;
00582                         sr = *c++;
00583                         LARc[2] = sr & 0x1f;  sr >>= 5;
00584                         sr |= (uword)*c++ << 3;
00585                         LARc[3] = sr & 0x1f;  sr >>= 5;
00586                         LARc[4] = sr & 0xf;  sr >>= 4;
00587                         sr |= (uword)*c++ << 2;
00588                         LARc[5] = sr & 0xf;  sr >>= 4;
00589                         LARc[6] = sr & 0x7;  sr >>= 3;
00590                         LARc[7] = sr & 0x7;  sr >>= 3;
00591                         sr = *c++;                              /* 5 */
00592                         Nc[0] = sr & 0x7f;  sr >>= 7;
00593                         sr |= (uword)*c++ << 1;
00594                         bc[0] = sr & 0x3;  sr >>= 2;
00595                         Mc[0] = sr & 0x3;  sr >>= 2;
00596                         sr |= (uword)*c++ << 5;
00597                         xmaxc[0] = sr & 0x3f;  sr >>= 6;
00598                         xmc[0] = sr & 0x7;  sr >>= 3;
00599                         xmc[1] = sr & 0x7;  sr >>= 3;
00600                         sr |= (uword)*c++ << 1;
00601                         xmc[2] = sr & 0x7;  sr >>= 3;
00602                         xmc[3] = sr & 0x7;  sr >>= 3;
00603                         xmc[4] = sr & 0x7;  sr >>= 3;
00604                         sr = *c++;
00605                         xmc[5] = sr & 0x7;  sr >>= 3;
00606                         xmc[6] = sr & 0x7;  sr >>= 3;
00607                         sr |= (uword)*c++ << 2;                 /* 10 */
00608                         xmc[7] = sr & 0x7;  sr >>= 3;
00609                         xmc[8] = sr & 0x7;  sr >>= 3;
00610                         xmc[9] = sr & 0x7;  sr >>= 3;
00611                         sr |= (uword)*c++ << 1;
00612                         xmc[10] = sr & 0x7;  sr >>= 3;
00613                         xmc[11] = sr & 0x7;  sr >>= 3;
00614                         xmc[12] = sr & 0x7;  sr >>= 3;
00615                         sr = *c++;
00616                         Nc[1] = sr & 0x7f;  sr >>= 7;
00617                         sr |= (uword)*c++ << 1;
00618                         bc[1] = sr & 0x3;  sr >>= 2;
00619                         Mc[1] = sr & 0x3;  sr >>= 2;
00620                         sr |= (uword)*c++ << 5;
00621                         xmaxc[1] = sr & 0x3f;  sr >>= 6;
00622                         xmc[13] = sr & 0x7;  sr >>= 3;
00623                         xmc[14] = sr & 0x7;  sr >>= 3;
00624                         sr |= (uword)*c++ << 1;                 /* 15 */
00625                         xmc[15] = sr & 0x7;  sr >>= 3;
00626                         xmc[16] = sr & 0x7;  sr >>= 3;
00627                         xmc[17] = sr & 0x7;  sr >>= 3;
00628                         sr = *c++;
00629                         xmc[18] = sr & 0x7;  sr >>= 3;
00630                         xmc[19] = sr & 0x7;  sr >>= 3;
00631                         sr |= (uword)*c++ << 2;
00632                         xmc[20] = sr & 0x7;  sr >>= 3;
00633                         xmc[21] = sr & 0x7;  sr >>= 3;
00634                         xmc[22] = sr & 0x7;  sr >>= 3;
00635                         sr |= (uword)*c++ << 1;
00636                         xmc[23] = sr & 0x7;  sr >>= 3;
00637                         xmc[24] = sr & 0x7;  sr >>= 3;
00638                         xmc[25] = sr & 0x7;  sr >>= 3;
00639                         sr = *c++;
00640                         Nc[2] = sr & 0x7f;  sr >>= 7;
00641                         sr |= (uword)*c++ << 1;                 /* 20 */
00642                         bc[2] = sr & 0x3;  sr >>= 2;
00643                         Mc[2] = sr & 0x3;  sr >>= 2;
00644                         sr |= (uword)*c++ << 5;
00645                         xmaxc[2] = sr & 0x3f;  sr >>= 6;
00646                         xmc[26] = sr & 0x7;  sr >>= 3;
00647                         xmc[27] = sr & 0x7;  sr >>= 3;
00648                         sr |= (uword)*c++ << 1;
00649                         xmc[28] = sr & 0x7;  sr >>= 3;
00650                         xmc[29] = sr & 0x7;  sr >>= 3;
00651                         xmc[30] = sr & 0x7;  sr >>= 3;
00652                         sr = *c++;
00653                         xmc[31] = sr & 0x7;  sr >>= 3;
00654                         xmc[32] = sr & 0x7;  sr >>= 3;
00655                         sr |= (uword)*c++ << 2;
00656                         xmc[33] = sr & 0x7;  sr >>= 3;
00657                         xmc[34] = sr & 0x7;  sr >>= 3;
00658                         xmc[35] = sr & 0x7;  sr >>= 3;
00659                         sr |= (uword)*c++ << 1;                 /* 25 */
00660                         xmc[36] = sr & 0x7;  sr >>= 3;
00661                         xmc[37] = sr & 0x7;  sr >>= 3;
00662                         xmc[38] = sr & 0x7;  sr >>= 3;
00663                         sr = *c++;
00664                         Nc[3] = sr & 0x7f;  sr >>= 7;
00665                         sr |= (uword)*c++ << 1;
00666                         bc[3] = sr & 0x3;  sr >>= 2;
00667                         Mc[3] = sr & 0x3;  sr >>= 2;
00668                         sr |= (uword)*c++ << 5;
00669                         xmaxc[3] = sr & 0x3f;  sr >>= 6;
00670                         xmc[39] = sr & 0x7;  sr >>= 3;
00671                         xmc[40] = sr & 0x7;  sr >>= 3;
00672                         sr |= (uword)*c++ << 1;
00673                         xmc[41] = sr & 0x7;  sr >>= 3;
00674                         xmc[42] = sr & 0x7;  sr >>= 3;
00675                         xmc[43] = sr & 0x7;  sr >>= 3;
00676                         sr = *c++;                              /* 30 */
00677                         xmc[44] = sr & 0x7;  sr >>= 3;
00678                         xmc[45] = sr & 0x7;  sr >>= 3;
00679                         sr |= (uword)*c++ << 2;
00680                         xmc[46] = sr & 0x7;  sr >>= 3;
00681                         xmc[47] = sr & 0x7;  sr >>= 3;
00682                         xmc[48] = sr & 0x7;  sr >>= 3;
00683                         sr |= (uword)*c++ << 1;
00684                         xmc[49] = sr & 0x7;  sr >>= 3;
00685                         xmc[50] = sr & 0x7;  sr >>= 3;
00686                         xmc[51] = sr & 0x7;  sr >>= 3;
00687                         writeGSM_33(d+33);
00688 
00689 }

Generated on Sat Aug 6 00:39:30 2011 for Asterisk - the Open Source PBX by  doxygen 1.4.7