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#include "gsm.h" 9 10void gsm_encode (gsm s, gsm_signal * source, gsm_byte * c) 11{ 12 int16_t LARc [8], Nc [4], Mc [4], bc [4], xmaxc [4], xmc [13 * 4] ; 13 14 Gsm_Coder (s, source, LARc, Nc, bc, Mc, xmaxc, xmc) ; 15 16 17 /* variable size 18 19 GSM_MAGIC 4 20 21 LARc [0] 6 22 LARc [1] 6 23 LARc [2] 5 24 LARc [3] 5 25 LARc [4] 4 26 LARc [5] 4 27 LARc [6] 3 28 LARc [7] 3 29 30 Nc [0] 7 31 bc [0] 2 32 Mc [0] 2 33 xmaxc [0] 6 34 xmc [0] 3 35 xmc [1] 3 36 xmc [2] 3 37 xmc [3] 3 38 xmc [4] 3 39 xmc [5] 3 40 xmc [6] 3 41 xmc [7] 3 42 xmc [8] 3 43 xmc [9] 3 44 xmc [10] 3 45 xmc [11] 3 46 xmc [12] 3 47 48 Nc [1] 7 49 bc [1] 2 50 Mc [1] 2 51 xmaxc [1] 6 52 xmc [13] 3 53 xmc [14] 3 54 xmc [15] 3 55 xmc [16] 3 56 xmc [17] 3 57 xmc [18] 3 58 xmc [19] 3 59 xmc [20] 3 60 xmc [21] 3 61 xmc [22] 3 62 xmc [23] 3 63 xmc [24] 3 64 xmc [25] 3 65 66 Nc [2] 7 67 bc [2] 2 68 Mc [2] 2 69 xmaxc [2] 6 70 xmc [26] 3 71 xmc [27] 3 72 xmc [28] 3 73 xmc [29] 3 74 xmc [30] 3 75 xmc [31] 3 76 xmc [32] 3 77 xmc [33] 3 78 xmc [34] 3 79 xmc [35] 3 80 xmc [36] 3 81 xmc [37] 3 82 xmc [38] 3 83 84 Nc [3] 7 85 bc [3] 2 86 Mc [3] 2 87 xmaxc [3] 6 88 xmc [39] 3 89 xmc [40] 3 90 xmc [41] 3 91 xmc [42] 3 92 xmc [43] 3 93 xmc [44] 3 94 xmc [45] 3 95 xmc [46] 3 96 xmc [47] 3 97 xmc [48] 3 98 xmc [49] 3 99 xmc [50] 3 100 xmc [51] 3 101 */ 102 103#ifdef WAV49 104 105 if (s->wav_fmt) 106 { s->frame_index = !s->frame_index ; 107 if (s->frame_index) 108 { uint16_t sr ; 109 110 sr = 0 ; 111 sr = sr >> 6 | LARc [0] << 10 ; 112 sr = sr >> 6 | LARc [1] << 10 ; 113 *c++ = sr >> 4 ; 114 sr = sr >> 5 | LARc [2] << 11 ; 115 *c++ = sr >> 7 ; 116 sr = sr >> 5 | LARc [3] << 11 ; 117 sr = sr >> 4 | LARc [4] << 12 ; 118 *c++ = sr >> 6 ; 119 sr = sr >> 4 | LARc [5] << 12 ; 120 sr = sr >> 3 | LARc [6] << 13 ; 121 *c++ = sr >> 7 ; 122 sr = sr >> 3 | LARc [7] << 13 ; 123 sr = sr >> 7 | Nc [0] << 9 ; 124 *c++ = sr >> 5 ; 125 sr = sr >> 2 | bc [0] << 14 ; 126 sr = sr >> 2 | Mc [0] << 14 ; 127 sr = sr >> 6 | xmaxc [0] << 10 ; 128 *c++ = sr >> 3 ; 129 sr = sr >> 3 | xmc [0] << 13 ; 130 *c++ = sr >> 8 ; 131 sr = sr >> 3 | xmc [1] << 13 ; 132 sr = sr >> 3 | xmc [2] << 13 ; 133 sr = sr >> 3 | xmc [3] << 13 ; 134 *c++ = sr >> 7 ; 135 sr = sr >> 3 | xmc [4] << 13 ; 136 sr = sr >> 3 | xmc [5] << 13 ; 137 sr = sr >> 3 | xmc [6] << 13 ; 138 *c++ = sr >> 6 ; 139 sr = sr >> 3 | xmc [7] << 13 ; 140 sr = sr >> 3 | xmc [8] << 13 ; 141 *c++ = sr >> 8 ; 142 sr = sr >> 3 | xmc [9] << 13 ; 143 sr = sr >> 3 | xmc [10] << 13 ; 144 sr = sr >> 3 | xmc [11] << 13 ; 145 *c++ = sr >> 7 ; 146 sr = sr >> 3 | xmc [12] << 13 ; 147 sr = sr >> 7 | Nc [1] << 9 ; 148 *c++ = sr >> 5 ; 149 sr = sr >> 2 | bc [1] << 14 ; 150 sr = sr >> 2 | Mc [1] << 14 ; 151 sr = sr >> 6 | xmaxc [1] << 10 ; 152 *c++ = sr >> 3 ; 153 sr = sr >> 3 | xmc [13] << 13 ; 154 *c++ = sr >> 8 ; 155 sr = sr >> 3 | xmc [14] << 13 ; 156 sr = sr >> 3 | xmc [15] << 13 ; 157 sr = sr >> 3 | xmc [16] << 13 ; 158 *c++ = sr >> 7 ; 159 sr = sr >> 3 | xmc [17] << 13 ; 160 sr = sr >> 3 | xmc [18] << 13 ; 161 sr = sr >> 3 | xmc [19] << 13 ; 162 *c++ = sr >> 6 ; 163 sr = sr >> 3 | xmc [20] << 13 ; 164 sr = sr >> 3 | xmc [21] << 13 ; 165 *c++ = sr >> 8 ; 166 sr = sr >> 3 | xmc [22] << 13 ; 167 sr = sr >> 3 | xmc [23] << 13 ; 168 sr = sr >> 3 | xmc [24] << 13 ; 169 *c++ = sr >> 7 ; 170 sr = sr >> 3 | xmc [25] << 13 ; 171 sr = sr >> 7 | Nc [2] << 9 ; 172 *c++ = sr >> 5 ; 173 sr = sr >> 2 | bc [2] << 14 ; 174 sr = sr >> 2 | Mc [2] << 14 ; 175 sr = sr >> 6 | xmaxc [2] << 10 ; 176 *c++ = sr >> 3 ; 177 sr = sr >> 3 | xmc [26] << 13 ; 178 *c++ = sr >> 8 ; 179 sr = sr >> 3 | xmc [27] << 13 ; 180 sr = sr >> 3 | xmc [28] << 13 ; 181 sr = sr >> 3 | xmc [29] << 13 ; 182 *c++ = sr >> 7 ; 183 sr = sr >> 3 | xmc [30] << 13 ; 184 sr = sr >> 3 | xmc [31] << 13 ; 185 sr = sr >> 3 | xmc [32] << 13 ; 186 *c++ = sr >> 6 ; 187 sr = sr >> 3 | xmc [33] << 13 ; 188 sr = sr >> 3 | xmc [34] << 13 ; 189 *c++ = sr >> 8 ; 190 sr = sr >> 3 | xmc [35] << 13 ; 191 sr = sr >> 3 | xmc [36] << 13 ; 192 sr = sr >> 3 | xmc [37] << 13 ; 193 *c++ = sr >> 7 ; 194 sr = sr >> 3 | xmc [38] << 13 ; 195 sr = sr >> 7 | Nc [3] << 9 ; 196 *c++ = sr >> 5 ; 197 sr = sr >> 2 | bc [3] << 14 ; 198 sr = sr >> 2 | Mc [3] << 14 ; 199 sr = sr >> 6 | xmaxc [3] << 10 ; 200 *c++ = sr >> 3 ; 201 sr = sr >> 3 | xmc [39] << 13 ; 202 *c++ = sr >> 8 ; 203 sr = sr >> 3 | xmc [40] << 13 ; 204 sr = sr >> 3 | xmc [41] << 13 ; 205 sr = sr >> 3 | xmc [42] << 13 ; 206 *c++ = sr >> 7 ; 207 sr = sr >> 3 | xmc [43] << 13 ; 208 sr = sr >> 3 | xmc [44] << 13 ; 209 sr = sr >> 3 | xmc [45] << 13 ; 210 *c++ = sr >> 6 ; 211 sr = sr >> 3 | xmc [46] << 13 ; 212 sr = sr >> 3 | xmc [47] << 13 ; 213 *c++ = sr >> 8 ; 214 sr = sr >> 3 | xmc [48] << 13 ; 215 sr = sr >> 3 | xmc [49] << 13 ; 216 sr = sr >> 3 | xmc [50] << 13 ; 217 *c++ = sr >> 7 ; 218 sr = sr >> 3 | xmc [51] << 13 ; 219 sr = sr >> 4 ; 220 *c = sr >> 8 ; 221 s->frame_chain = *c ; 222 } 223 else { 224 uint16_t sr ; 225 226 sr = 0 ; 227 sr = sr >> 4 | s->frame_chain << 12 ; 228 sr = sr >> 6 | LARc [0] << 10 ; 229 *c++ = sr >> 6 ; 230 sr = sr >> 6 | LARc [1] << 10 ; 231 *c++ = sr >> 8 ; 232 sr = sr >> 5 | LARc [2] << 11 ; 233 sr = sr >> 5 | LARc [3] << 11 ; 234 *c++ = sr >> 6 ; 235 sr = sr >> 4 | LARc [4] << 12 ; 236 sr = sr >> 4 | LARc [5] << 12 ; 237 *c++ = sr >> 6 ; 238 sr = sr >> 3 | LARc [6] << 13 ; 239 sr = sr >> 3 | LARc [7] << 13 ; 240 *c++ = sr >> 8 ; 241 sr = sr >> 7 | Nc [0] << 9 ; 242 sr = sr >> 2 | bc [0] << 14 ; 243 *c++ = sr >> 7 ; 244 sr = sr >> 2 | Mc [0] << 14 ; 245 sr = sr >> 6 | xmaxc [0] << 10 ; 246 *c++ = sr >> 7 ; 247 sr = sr >> 3 | xmc [0] << 13 ; 248 sr = sr >> 3 | xmc [1] << 13 ; 249 sr = sr >> 3 | xmc [2] << 13 ; 250 *c++ = sr >> 6 ; 251 sr = sr >> 3 | xmc [3] << 13 ; 252 sr = sr >> 3 | xmc [4] << 13 ; 253 *c++ = sr >> 8 ; 254 sr = sr >> 3 | xmc [5] << 13 ; 255 sr = sr >> 3 | xmc [6] << 13 ; 256 sr = sr >> 3 | xmc [7] << 13 ; 257 *c++ = sr >> 7 ; 258 sr = sr >> 3 | xmc [8] << 13 ; 259 sr = sr >> 3 | xmc [9] << 13 ; 260 sr = sr >> 3 | xmc [10] << 13 ; 261 *c++ = sr >> 6 ; 262 sr = sr >> 3 | xmc [11] << 13 ; 263 sr = sr >> 3 | xmc [12] << 13 ; 264 *c++ = sr >> 8 ; 265 sr = sr >> 7 | Nc [1] << 9 ; 266 sr = sr >> 2 | bc [1] << 14 ; 267 *c++ = sr >> 7 ; 268 sr = sr >> 2 | Mc [1] << 14 ; 269 sr = sr >> 6 | xmaxc [1] << 10 ; 270 *c++ = sr >> 7 ; 271 sr = sr >> 3 | xmc [13] << 13 ; 272 sr = sr >> 3 | xmc [14] << 13 ; 273 sr = sr >> 3 | xmc [15] << 13 ; 274 *c++ = sr >> 6 ; 275 sr = sr >> 3 | xmc [16] << 13 ; 276 sr = sr >> 3 | xmc [17] << 13 ; 277 *c++ = sr >> 8 ; 278 sr = sr >> 3 | xmc [18] << 13 ; 279 sr = sr >> 3 | xmc [19] << 13 ; 280 sr = sr >> 3 | xmc [20] << 13 ; 281 *c++ = sr >> 7 ; 282 sr = sr >> 3 | xmc [21] << 13 ; 283 sr = sr >> 3 | xmc [22] << 13 ; 284 sr = sr >> 3 | xmc [23] << 13 ; 285 *c++ = sr >> 6 ; 286 sr = sr >> 3 | xmc [24] << 13 ; 287 sr = sr >> 3 | xmc [25] << 13 ; 288 *c++ = sr >> 8 ; 289 sr = sr >> 7 | Nc [2] << 9 ; 290 sr = sr >> 2 | bc [2] << 14 ; 291 *c++ = sr >> 7 ; 292 sr = sr >> 2 | Mc [2] << 14 ; 293 sr = sr >> 6 | xmaxc [2] << 10 ; 294 *c++ = sr >> 7 ; 295 sr = sr >> 3 | xmc [26] << 13 ; 296 sr = sr >> 3 | xmc [27] << 13 ; 297 sr = sr >> 3 | xmc [28] << 13 ; 298 *c++ = sr >> 6 ; 299 sr = sr >> 3 | xmc [29] << 13 ; 300 sr = sr >> 3 | xmc [30] << 13 ; 301 *c++ = sr >> 8 ; 302 sr = sr >> 3 | xmc [31] << 13 ; 303 sr = sr >> 3 | xmc [32] << 13 ; 304 sr = sr >> 3 | xmc [33] << 13 ; 305 *c++ = sr >> 7 ; 306 sr = sr >> 3 | xmc [34] << 13 ; 307 sr = sr >> 3 | xmc [35] << 13 ; 308 sr = sr >> 3 | xmc [36] << 13 ; 309 *c++ = sr >> 6 ; 310 sr = sr >> 3 | xmc [37] << 13 ; 311 sr = sr >> 3 | xmc [38] << 13 ; 312 *c++ = sr >> 8 ; 313 sr = sr >> 7 | Nc [3] << 9 ; 314 sr = sr >> 2 | bc [3] << 14 ; 315 *c++ = sr >> 7 ; 316 sr = sr >> 2 | Mc [3] << 14 ; 317 sr = sr >> 6 | xmaxc [3] << 10 ; 318 *c++ = sr >> 7 ; 319 sr = sr >> 3 | xmc [39] << 13 ; 320 sr = sr >> 3 | xmc [40] << 13 ; 321 sr = sr >> 3 | xmc [41] << 13 ; 322 *c++ = sr >> 6 ; 323 sr = sr >> 3 | xmc [42] << 13 ; 324 sr = sr >> 3 | xmc [43] << 13 ; 325 *c++ = sr >> 8 ; 326 sr = sr >> 3 | xmc [44] << 13 ; 327 sr = sr >> 3 | xmc [45] << 13 ; 328 sr = sr >> 3 | xmc [46] << 13 ; 329 *c++ = sr >> 7 ; 330 sr = sr >> 3 | xmc [47] << 13 ; 331 sr = sr >> 3 | xmc [48] << 13 ; 332 sr = sr >> 3 | xmc [49] << 13 ; 333 *c++ = sr >> 6 ; 334 sr = sr >> 3 | xmc [50] << 13 ; 335 sr = sr >> 3 | xmc [51] << 13 ; 336 *c++ = sr >> 8 ; 337 } 338 } 339 340 else 341 342#endif /* WAV49 */ 343 { 344 345 *c++ = ((GSM_MAGIC & 0xF) << 4) /* 1 */ 346 | ((LARc [0] >> 2) & 0xF) ; 347 *c++ = ((LARc [0] & 0x3) << 6) 348 | (LARc [1] & 0x3F) ; 349 *c++ = ((LARc [2] & 0x1F) << 3) 350 | ((LARc [3] >> 2) & 0x7) ; 351 *c++ = ((LARc [3] & 0x3) << 6) 352 | ((LARc [4] & 0xF) << 2) 353 | ((LARc [5] >> 2) & 0x3) ; 354 *c++ = ((LARc [5] & 0x3) << 6) 355 | ((LARc [6] & 0x7) << 3) 356 | (LARc [7] & 0x7) ; 357 *c++ = ((Nc [0] & 0x7F) << 1) 358 | ((bc [0] >> 1) & 0x1) ; 359 *c++ = ((bc [0] & 0x1) << 7) 360 | ((Mc [0] & 0x3) << 5) 361 | ((xmaxc [0] >> 1) & 0x1F) ; 362 *c++ = ((xmaxc [0] & 0x1) << 7) 363 | ((xmc [0] & 0x7) << 4) 364 | ((xmc [1] & 0x7) << 1) 365 | ((xmc [2] >> 2) & 0x1) ; 366 *c++ = ((xmc [2] & 0x3) << 6) 367 | ((xmc [3] & 0x7) << 3) 368 | (xmc [4] & 0x7) ; 369 *c++ = ((xmc [5] & 0x7) << 5) /* 10 */ 370 | ((xmc [6] & 0x7) << 2) 371 | ((xmc [7] >> 1) & 0x3) ; 372 *c++ = ((xmc [7] & 0x1) << 7) 373 | ((xmc [8] & 0x7) << 4) 374 | ((xmc [9] & 0x7) << 1) 375 | ((xmc [10] >> 2) & 0x1) ; 376 *c++ = ((xmc [10] & 0x3) << 6) 377 | ((xmc [11] & 0x7) << 3) 378 | (xmc [12] & 0x7) ; 379 *c++ = ((Nc [1] & 0x7F) << 1) 380 | ((bc [1] >> 1) & 0x1) ; 381 *c++ = ((bc [1] & 0x1) << 7) 382 | ((Mc [1] & 0x3) << 5) 383 | ((xmaxc [1] >> 1) & 0x1F) ; 384 *c++ = ((xmaxc [1] & 0x1) << 7) 385 | ((xmc [13] & 0x7) << 4) 386 | ((xmc [14] & 0x7) << 1) 387 | ((xmc [15] >> 2) & 0x1) ; 388 *c++ = ((xmc [15] & 0x3) << 6) 389 | ((xmc [16] & 0x7) << 3) 390 | (xmc [17] & 0x7) ; 391 *c++ = ((xmc [18] & 0x7) << 5) 392 | ((xmc [19] & 0x7) << 2) 393 | ((xmc [20] >> 1) & 0x3) ; 394 *c++ = ((xmc [20] & 0x1) << 7) 395 | ((xmc [21] & 0x7) << 4) 396 | ((xmc [22] & 0x7) << 1) 397 | ((xmc [23] >> 2) & 0x1) ; 398 *c++ = ((xmc [23] & 0x3) << 6) 399 | ((xmc [24] & 0x7) << 3) 400 | (xmc [25] & 0x7) ; 401 *c++ = ((Nc [2] & 0x7F) << 1) /* 20 */ 402 | ((bc [2] >> 1) & 0x1) ; 403 *c++ = ((bc [2] & 0x1) << 7) 404 | ((Mc [2] & 0x3) << 5) 405 | ((xmaxc [2] >> 1) & 0x1F) ; 406 *c++ = ((xmaxc [2] & 0x1) << 7) 407 | ((xmc [26] & 0x7) << 4) 408 | ((xmc [27] & 0x7) << 1) 409 | ((xmc [28] >> 2) & 0x1) ; 410 *c++ = ((xmc [28] & 0x3) << 6) 411 | ((xmc [29] & 0x7) << 3) 412 | (xmc [30] & 0x7) ; 413 *c++ = ((xmc [31] & 0x7) << 5) 414 | ((xmc [32] & 0x7) << 2) 415 | ((xmc [33] >> 1) & 0x3) ; 416 *c++ = ((xmc [33] & 0x1) << 7) 417 | ((xmc [34] & 0x7) << 4) 418 | ((xmc [35] & 0x7) << 1) 419 | ((xmc [36] >> 2) & 0x1) ; 420 *c++ = ((xmc [36] & 0x3) << 6) 421 | ((xmc [37] & 0x7) << 3) 422 | (xmc [38] & 0x7) ; 423 *c++ = ((Nc [3] & 0x7F) << 1) 424 | ((bc [3] >> 1) & 0x1) ; 425 *c++ = ((bc [3] & 0x1) << 7) 426 | ((Mc [3] & 0x3) << 5) 427 | ((xmaxc [3] >> 1) & 0x1F) ; 428 *c++ = ((xmaxc [3] & 0x1) << 7) 429 | ((xmc [39] & 0x7) << 4) 430 | ((xmc [40] & 0x7) << 1) 431 | ((xmc [41] >> 2) & 0x1) ; 432 *c++ = ((xmc [41] & 0x3) << 6) /* 30 */ 433 | ((xmc [42] & 0x7) << 3) 434 | (xmc [43] & 0x7) ; 435 *c++ = ((xmc [44] & 0x7) << 5) 436 | ((xmc [45] & 0x7) << 2) 437 | ((xmc [46] >> 1) & 0x3) ; 438 *c++ = ((xmc [46] & 0x1) << 7) 439 | ((xmc [47] & 0x7) << 4) 440 | ((xmc [48] & 0x7) << 1) 441 | ((xmc [49] >> 2) & 0x1) ; 442 *c++ = ((xmc [49] & 0x3) << 6) 443 | ((xmc [50] & 0x7) << 3) 444 | (xmc [51] & 0x7) ; 445 446 } 447} 448 449