00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "private.h"
00010 #include "gsm.h"
00011 #include "proto.h"
00012
00013 int gsm_explode P3((s, c, target), gsm s, gsm_byte * c, gsm_signal * target)
00014 {
00015 # define LARc target
00016 # define Nc *((gsm_signal (*) [17])(target + 8))
00017 # define bc *((gsm_signal (*) [17])(target + 9))
00018 # define Mc *((gsm_signal (*) [17])(target + 10))
00019 # define xmaxc *((gsm_signal (*) [17])(target + 11))
00020
00021
00022 #ifdef WAV49
00023 if (s->wav_fmt) {
00024
00025 uword sr = 0;
00026
00027 if (s->frame_index == 1) {
00028
00029 sr = *c++;
00030 LARc[0] = sr & 0x3f; sr >>= 6;
00031 sr |= (uword)*c++ << 2;
00032 LARc[1] = sr & 0x3f; sr >>= 6;
00033 sr |= (uword)*c++ << 4;
00034 LARc[2] = sr & 0x1f; sr >>= 5;
00035 LARc[3] = sr & 0x1f; sr >>= 5;
00036 sr |= (uword)*c++ << 2;
00037 LARc[4] = sr & 0xf; sr >>= 4;
00038 LARc[5] = sr & 0xf; sr >>= 4;
00039 sr |= (uword)*c++ << 2;
00040 LARc[6] = sr & 0x7; sr >>= 3;
00041 LARc[7] = sr & 0x7; sr >>= 3;
00042 sr |= (uword)*c++ << 4;
00043 Nc[0] = sr & 0x7f; sr >>= 7;
00044 bc[0] = sr & 0x3; sr >>= 2;
00045 Mc[0] = sr & 0x3; sr >>= 2;
00046 sr |= (uword)*c++ << 1;
00047 xmaxc[0] = sr & 0x3f; sr >>= 6;
00048 #undef xmc
00049 #define xmc (target + 12)
00050 xmc[0] = sr & 0x7; sr >>= 3;
00051 sr = *c++;
00052 xmc[1] = sr & 0x7; sr >>= 3;
00053 xmc[2] = sr & 0x7; sr >>= 3;
00054 sr |= (uword)*c++ << 2;
00055 xmc[3] = sr & 0x7; sr >>= 3;
00056 xmc[4] = sr & 0x7; sr >>= 3;
00057 xmc[5] = sr & 0x7; sr >>= 3;
00058 sr |= (uword)*c++ << 1;
00059 xmc[6] = sr & 0x7; sr >>= 3;
00060 xmc[7] = sr & 0x7; sr >>= 3;
00061 xmc[8] = sr & 0x7; sr >>= 3;
00062 sr = *c++;
00063 xmc[9] = sr & 0x7; sr >>= 3;
00064 xmc[10] = sr & 0x7; sr >>= 3;
00065 sr |= (uword)*c++ << 2;
00066 xmc[11] = sr & 0x7; sr >>= 3;
00067 xmc[12] = sr & 0x7; sr >>= 3;
00068 sr |= (uword)*c++ << 4;
00069 Nc[1] = sr & 0x7f; sr >>= 7;
00070 bc[1] = sr & 0x3; sr >>= 2;
00071 Mc[1] = sr & 0x3; sr >>= 2;
00072 sr |= (uword)*c++ << 1;
00073 xmaxc[1] = sr & 0x3f; sr >>= 6;
00074 #undef xmc
00075 #define xmc (target + 29 - 13)
00076
00077 xmc[13] = sr & 0x7; sr >>= 3;
00078 sr = *c++;
00079 xmc[14] = sr & 0x7; sr >>= 3;
00080 xmc[15] = sr & 0x7; sr >>= 3;
00081 sr |= (uword)*c++ << 2;
00082 xmc[16] = sr & 0x7; sr >>= 3;
00083 xmc[17] = sr & 0x7; sr >>= 3;
00084 xmc[18] = sr & 0x7; sr >>= 3;
00085 sr |= (uword)*c++ << 1;
00086 xmc[19] = sr & 0x7; sr >>= 3;
00087 xmc[20] = sr & 0x7; sr >>= 3;
00088 xmc[21] = sr & 0x7; sr >>= 3;
00089 sr = *c++;
00090 xmc[22] = sr & 0x7; sr >>= 3;
00091 xmc[23] = sr & 0x7; sr >>= 3;
00092 sr |= (uword)*c++ << 2;
00093 xmc[24] = sr & 0x7; sr >>= 3;
00094 xmc[25] = sr & 0x7; sr >>= 3;
00095 sr |= (uword)*c++ << 4;
00096 Nc[2] = sr & 0x7f; sr >>= 7;
00097 bc[2] = sr & 0x3; sr >>= 2;
00098 Mc[2] = sr & 0x3; sr >>= 2;
00099 sr |= (uword)*c++ << 1;
00100 xmaxc[2] = sr & 0x3f; sr >>= 6;
00101
00102 #undef xmc
00103 #define xmc (target + 46 - 26)
00104
00105 xmc[26] = sr & 0x7; sr >>= 3;
00106 sr = *c++;
00107 xmc[27] = sr & 0x7; sr >>= 3;
00108 xmc[28] = sr & 0x7; sr >>= 3;
00109 sr |= (uword)*c++ << 2;
00110 xmc[29] = sr & 0x7; sr >>= 3;
00111 xmc[30] = sr & 0x7; sr >>= 3;
00112 xmc[31] = sr & 0x7; sr >>= 3;
00113 sr |= (uword)*c++ << 1;
00114 xmc[32] = sr & 0x7; sr >>= 3;
00115 xmc[33] = sr & 0x7; sr >>= 3;
00116 xmc[34] = sr & 0x7; sr >>= 3;
00117 sr = *c++;
00118 xmc[35] = sr & 0x7; sr >>= 3;
00119 xmc[36] = sr & 0x7; sr >>= 3;
00120 sr |= (uword)*c++ << 2;
00121 xmc[37] = sr & 0x7; sr >>= 3;
00122 xmc[38] = sr & 0x7; sr >>= 3;
00123 sr |= (uword)*c++ << 4;
00124 Nc[3] = sr & 0x7f; sr >>= 7;
00125 bc[3] = sr & 0x3; sr >>= 2;
00126 Mc[3] = sr & 0x3; sr >>= 2;
00127 sr |= (uword)*c++ << 1;
00128 xmaxc[3] = sr & 0x3f; sr >>= 6;
00129 #undef xmc
00130 #define xmc (target + 63 - 39)
00131
00132 xmc[39] = sr & 0x7; sr >>= 3;
00133 sr = *c++;
00134 xmc[40] = sr & 0x7; sr >>= 3;
00135 xmc[41] = sr & 0x7; sr >>= 3;
00136 sr |= (uword)*c++ << 2;
00137 xmc[42] = sr & 0x7; sr >>= 3;
00138 xmc[43] = sr & 0x7; sr >>= 3;
00139 xmc[44] = sr & 0x7; sr >>= 3;
00140 sr |= (uword)*c++ << 1;
00141 xmc[45] = sr & 0x7; sr >>= 3;
00142 xmc[46] = sr & 0x7; sr >>= 3;
00143 xmc[47] = sr & 0x7; sr >>= 3;
00144 sr = *c++;
00145 xmc[48] = sr & 0x7; sr >>= 3;
00146 xmc[49] = sr & 0x7; sr >>= 3;
00147 sr |= (uword)*c++ << 2;
00148 xmc[50] = sr & 0x7; sr >>= 3;
00149 xmc[51] = sr & 0x7; sr >>= 3;
00150
00151 s->frame_chain = sr & 0xf;
00152 }
00153 else {
00154 sr = s->frame_chain;
00155 sr |= (uword)*c++ << 4;
00156 LARc[0] = sr & 0x3f; sr >>= 6;
00157 LARc[1] = sr & 0x3f; sr >>= 6;
00158 sr = *c++;
00159 LARc[2] = sr & 0x1f; sr >>= 5;
00160 sr |= (uword)*c++ << 3;
00161 LARc[3] = sr & 0x1f; sr >>= 5;
00162 LARc[4] = sr & 0xf; sr >>= 4;
00163 sr |= (uword)*c++ << 2;
00164 LARc[5] = sr & 0xf; sr >>= 4;
00165 LARc[6] = sr & 0x7; sr >>= 3;
00166 LARc[7] = sr & 0x7; sr >>= 3;
00167 sr = *c++;
00168 Nc[0] = sr & 0x7f; sr >>= 7;
00169 sr |= (uword)*c++ << 1;
00170 bc[0] = sr & 0x3; sr >>= 2;
00171 Mc[0] = sr & 0x3; sr >>= 2;
00172 sr |= (uword)*c++ << 5;
00173 xmaxc[0] = sr & 0x3f; sr >>= 6;
00174 #undef xmc
00175 #define xmc (target + 12)
00176 xmc[0] = sr & 0x7; sr >>= 3;
00177 xmc[1] = sr & 0x7; sr >>= 3;
00178 sr |= (uword)*c++ << 1;
00179 xmc[2] = sr & 0x7; sr >>= 3;
00180 xmc[3] = sr & 0x7; sr >>= 3;
00181 xmc[4] = sr & 0x7; sr >>= 3;
00182 sr = *c++;
00183 xmc[5] = sr & 0x7; sr >>= 3;
00184 xmc[6] = sr & 0x7; sr >>= 3;
00185 sr |= (uword)*c++ << 2;
00186 xmc[7] = sr & 0x7; sr >>= 3;
00187 xmc[8] = sr & 0x7; sr >>= 3;
00188 xmc[9] = sr & 0x7; sr >>= 3;
00189 sr |= (uword)*c++ << 1;
00190 xmc[10] = sr & 0x7; sr >>= 3;
00191 xmc[11] = sr & 0x7; sr >>= 3;
00192 xmc[12] = sr & 0x7; sr >>= 3;
00193 sr = *c++;
00194 Nc[1] = sr & 0x7f; sr >>= 7;
00195 sr |= (uword)*c++ << 1;
00196 bc[1] = sr & 0x3; sr >>= 2;
00197 Mc[1] = sr & 0x3; sr >>= 2;
00198 sr |= (uword)*c++ << 5;
00199 xmaxc[1] = sr & 0x3f; sr >>= 6;
00200 #undef xmc
00201 #define xmc (target + 29 - 13)
00202
00203 xmc[13] = sr & 0x7; sr >>= 3;
00204 xmc[14] = sr & 0x7; sr >>= 3;
00205 sr |= (uword)*c++ << 1;
00206 xmc[15] = sr & 0x7; sr >>= 3;
00207 xmc[16] = sr & 0x7; sr >>= 3;
00208 xmc[17] = sr & 0x7; sr >>= 3;
00209 sr = *c++;
00210 xmc[18] = sr & 0x7; sr >>= 3;
00211 xmc[19] = sr & 0x7; sr >>= 3;
00212 sr |= (uword)*c++ << 2;
00213 xmc[20] = sr & 0x7; sr >>= 3;
00214 xmc[21] = sr & 0x7; sr >>= 3;
00215 xmc[22] = sr & 0x7; sr >>= 3;
00216 sr |= (uword)*c++ << 1;
00217 xmc[23] = sr & 0x7; sr >>= 3;
00218 xmc[24] = sr & 0x7; sr >>= 3;
00219 xmc[25] = sr & 0x7; sr >>= 3;
00220 sr = *c++;
00221 Nc[2] = sr & 0x7f; sr >>= 7;
00222 sr |= (uword)*c++ << 1;
00223 bc[2] = sr & 0x3; sr >>= 2;
00224 Mc[2] = sr & 0x3; sr >>= 2;
00225 sr |= (uword)*c++ << 5;
00226 xmaxc[2] = sr & 0x3f; sr >>= 6;
00227 #undef xmc
00228 #define xmc (target + 46 - 26)
00229 xmc[26] = sr & 0x7; sr >>= 3;
00230 xmc[27] = sr & 0x7; sr >>= 3;
00231 sr |= (uword)*c++ << 1;
00232 xmc[28] = sr & 0x7; sr >>= 3;
00233 xmc[29] = sr & 0x7; sr >>= 3;
00234 xmc[30] = sr & 0x7; sr >>= 3;
00235 sr = *c++;
00236 xmc[31] = sr & 0x7; sr >>= 3;
00237 xmc[32] = sr & 0x7; sr >>= 3;
00238 sr |= (uword)*c++ << 2;
00239 xmc[33] = sr & 0x7; sr >>= 3;
00240 xmc[34] = sr & 0x7; sr >>= 3;
00241 xmc[35] = sr & 0x7; sr >>= 3;
00242 sr |= (uword)*c++ << 1;
00243 xmc[36] = sr & 0x7; sr >>= 3;
00244 xmc[37] = sr & 0x7; sr >>= 3;
00245 xmc[38] = sr & 0x7; sr >>= 3;
00246 sr = *c++;
00247 Nc[3] = sr & 0x7f; sr >>= 7;
00248 sr |= (uword)*c++ << 1;
00249 bc[3] = sr & 0x3; sr >>= 2;
00250 Mc[3] = sr & 0x3; sr >>= 2;
00251 sr |= (uword)*c++ << 5;
00252 xmaxc[3] = sr & 0x3f; sr >>= 6;
00253
00254 #undef xmc
00255 #define xmc (target + 63 - 39)
00256
00257 xmc[39] = sr & 0x7; sr >>= 3;
00258 xmc[40] = sr & 0x7; sr >>= 3;
00259 sr |= (uword)*c++ << 1;
00260 xmc[41] = sr & 0x7; sr >>= 3;
00261 xmc[42] = sr & 0x7; sr >>= 3;
00262 xmc[43] = sr & 0x7; sr >>= 3;
00263 sr = *c++;
00264 xmc[44] = sr & 0x7; sr >>= 3;
00265 xmc[45] = sr & 0x7; sr >>= 3;
00266 sr |= (uword)*c++ << 2;
00267 xmc[46] = sr & 0x7; sr >>= 3;
00268 xmc[47] = sr & 0x7; sr >>= 3;
00269 xmc[48] = sr & 0x7; sr >>= 3;
00270 sr |= (uword)*c++ << 1;
00271 xmc[49] = sr & 0x7; sr >>= 3;
00272 xmc[50] = sr & 0x7; sr >>= 3;
00273 xmc[51] = sr & 0x7; sr >>= 3;
00274 }
00275 }
00276 else
00277 #endif
00278 {
00279
00280
00281 if (((*c >> 4) & 0x0F) != GSM_MAGIC) return -1;
00282
00283 LARc[0] = (*c++ & 0xF) << 2;
00284 LARc[0] |= (*c >> 6) & 0x3;
00285 LARc[1] = *c++ & 0x3F;
00286 LARc[2] = (*c >> 3) & 0x1F;
00287 LARc[3] = (*c++ & 0x7) << 2;
00288 LARc[3] |= (*c >> 6) & 0x3;
00289 LARc[4] = (*c >> 2) & 0xF;
00290 LARc[5] = (*c++ & 0x3) << 2;
00291 LARc[5] |= (*c >> 6) & 0x3;
00292 LARc[6] = (*c >> 3) & 0x7;
00293 LARc[7] = *c++ & 0x7;
00294
00295 Nc[0] = (*c >> 1) & 0x7F;
00296
00297 bc[0] = (*c++ & 0x1) << 1;
00298 bc[0] |= (*c >> 7) & 0x1;
00299
00300 Mc[0] = (*c >> 5) & 0x3;
00301
00302 xmaxc[0] = (*c++ & 0x1F) << 1;
00303 xmaxc[0] |= (*c >> 7) & 0x1;
00304
00305 #undef xmc
00306 #define xmc (target + 12)
00307
00308 xmc[0] = (*c >> 4) & 0x7;
00309 xmc[1] = (*c >> 1) & 0x7;
00310 xmc[2] = (*c++ & 0x1) << 2;
00311 xmc[2] |= (*c >> 6) & 0x3;
00312 xmc[3] = (*c >> 3) & 0x7;
00313 xmc[4] = *c++ & 0x7;
00314 xmc[5] = (*c >> 5) & 0x7;
00315 xmc[6] = (*c >> 2) & 0x7;
00316 xmc[7] = (*c++ & 0x3) << 1;
00317 xmc[7] |= (*c >> 7) & 0x1;
00318 xmc[8] = (*c >> 4) & 0x7;
00319 xmc[9] = (*c >> 1) & 0x7;
00320 xmc[10] = (*c++ & 0x1) << 2;
00321 xmc[10] |= (*c >> 6) & 0x3;
00322 xmc[11] = (*c >> 3) & 0x7;
00323 xmc[12] = *c++ & 0x7;
00324
00325 Nc[1] = (*c >> 1) & 0x7F;
00326
00327 bc[1] = (*c++ & 0x1) << 1;
00328 bc[1] |= (*c >> 7) & 0x1;
00329
00330 Mc[1] = (*c >> 5) & 0x3;
00331
00332 xmaxc[1] = (*c++ & 0x1F) << 1;
00333 xmaxc[1] |= (*c >> 7) & 0x1;
00334
00335 #undef xmc
00336 #define xmc (target + 29 - 13)
00337
00338 xmc[13] = (*c >> 4) & 0x7;
00339 xmc[14] = (*c >> 1) & 0x7;
00340 xmc[15] = (*c++ & 0x1) << 2;
00341 xmc[15] |= (*c >> 6) & 0x3;
00342 xmc[16] = (*c >> 3) & 0x7;
00343 xmc[17] = *c++ & 0x7;
00344 xmc[18] = (*c >> 5) & 0x7;
00345 xmc[19] = (*c >> 2) & 0x7;
00346 xmc[20] = (*c++ & 0x3) << 1;
00347 xmc[20] |= (*c >> 7) & 0x1;
00348 xmc[21] = (*c >> 4) & 0x7;
00349 xmc[22] = (*c >> 1) & 0x7;
00350 xmc[23] = (*c++ & 0x1) << 2;
00351 xmc[23] |= (*c >> 6) & 0x3;
00352 xmc[24] = (*c >> 3) & 0x7;
00353 xmc[25] = *c++ & 0x7;
00354
00355 Nc[2] = (*c >> 1) & 0x7F;
00356
00357 bc[2] = (*c++ & 0x1) << 1;
00358 bc[2] |= (*c >> 7) & 0x1;
00359
00360 Mc[2] = (*c >> 5) & 0x3;
00361
00362 xmaxc[2] = (*c++ & 0x1F) << 1;
00363 xmaxc[2] |= (*c >> 7) & 0x1;
00364
00365 #undef xmc
00366 #define xmc (target + 46 - 26)
00367
00368 xmc[26] = (*c >> 4) & 0x7;
00369 xmc[27] = (*c >> 1) & 0x7;
00370 xmc[28] = (*c++ & 0x1) << 2;
00371 xmc[28] |= (*c >> 6) & 0x3;
00372 xmc[29] = (*c >> 3) & 0x7;
00373 xmc[30] = *c++ & 0x7;
00374 xmc[31] = (*c >> 5) & 0x7;
00375 xmc[32] = (*c >> 2) & 0x7;
00376 xmc[33] = (*c++ & 0x3) << 1;
00377 xmc[33] |= (*c >> 7) & 0x1;
00378 xmc[34] = (*c >> 4) & 0x7;
00379 xmc[35] = (*c >> 1) & 0x7;
00380 xmc[36] = (*c++ & 0x1) << 2;
00381 xmc[36] |= (*c >> 6) & 0x3;
00382 xmc[37] = (*c >> 3) & 0x7;
00383 xmc[38] = *c++ & 0x7;
00384
00385 Nc[3] = (*c >> 1) & 0x7F;
00386
00387 bc[3] = (*c++ & 0x1) << 1;
00388 bc[3] |= (*c >> 7) & 0x1;
00389
00390 Mc[3] = (*c >> 5) & 0x3;
00391
00392 xmaxc[3] = (*c++ & 0x1F) << 1;
00393 xmaxc[3] |= (*c >> 7) & 0x1;
00394
00395 #undef xmc
00396 #define xmc (target + 63 - 39)
00397
00398 xmc[39] = (*c >> 4) & 0x7;
00399 xmc[40] = (*c >> 1) & 0x7;
00400 xmc[41] = (*c++ & 0x1) << 2;
00401 xmc[41] |= (*c >> 6) & 0x3;
00402 xmc[42] = (*c >> 3) & 0x7;
00403 xmc[43] = *c++ & 0x7;
00404 xmc[44] = (*c >> 5) & 0x7;
00405 xmc[45] = (*c >> 2) & 0x7;
00406 xmc[46] = (*c++ & 0x3) << 1;
00407 xmc[46] |= (*c >> 7) & 0x1;
00408 xmc[47] = (*c >> 4) & 0x7;
00409 xmc[48] = (*c >> 1) & 0x7;
00410 xmc[49] = (*c++ & 0x1) << 2;
00411 xmc[49] |= (*c >> 6) & 0x3;
00412 xmc[50] = (*c >> 3) & 0x7;
00413 xmc[51] = *c & 0x7;
00414 }
00415
00416 return 0;
00417 }