FreeCalypso > hg > gsm-codec-lib
comparison libgsmfrp/good_frame.c @ 5:4812e00bc100
libgsmfrp: implement handling of good frames
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Sat, 19 Nov 2022 20:46:13 +0000 |
| parents | |
| children | f081a6850fb5 |
comparison
equal
deleted
inserted
replaced
| 4:286d5f097eb4 | 5:4812e00bc100 |
|---|---|
| 1 /* | |
| 2 * In this module we implement preprocessing of received good frames. | |
| 3 */ | |
| 4 | |
| 5 #include <stdint.h> | |
| 6 #include <string.h> | |
| 7 #include "gsm_fr_preproc.h" | |
| 8 #include "internal.h" | |
| 9 | |
| 10 void gsmfr_preproc_good_frame(struct gsmfr_preproc_state *st, gsm_byte *frame) | |
| 11 { | |
| 12 int sid; | |
| 13 | |
| 14 /* always set correct magic */ | |
| 15 frame[0] = 0xD0 | frame[0] & 0x0F; | |
| 16 /* now classify by SID */ | |
| 17 sid = gsmfr_preproc_sid_classify(frame); | |
| 18 switch (sid) { | |
| 19 case 0: /* good speech frame */ | |
| 20 memcpy(&st->speech_frame, frame, sizeof(gsm_frame)); | |
| 21 st->rx_state = SPEECH; | |
| 22 return; | |
| 23 case 1: /* invalid SID frame */ | |
| 24 if (st->got_valid_sid) { | |
| 25 st->rx_state = COMFORT_NOISE; | |
| 26 gsmfr_preproc_gen_cn(st, frame); | |
| 27 } else { | |
| 28 st->rx_state = NO_DATA; | |
| 29 memcpy(frame, &gsmfr_preproc_silence_frame, | |
| 30 sizeof(gsm_frame)); | |
| 31 } | |
| 32 return; | |
| 33 case 2: /* valid SID frame */ | |
| 34 st->got_valid_sid = 1; | |
| 35 memcpy(st->sid_prefix, frame, 5); | |
| 36 st->sid_xmaxc[0] = ((frame[6] & 0x1F) << 1) | (frame[7] >> 7); | |
| 37 st->sid_xmaxc[1] = ((frame[13] & 0x1F) << 1) | (frame[14] >> 7); | |
| 38 st->sid_xmaxc[2] = ((frame[20] & 0x1F) << 1) | (frame[21] >> 7); | |
| 39 st->sid_xmaxc[3] = ((frame[27] & 0x1F) << 1) | (frame[28] >> 7); | |
| 40 st->rx_state = COMFORT_NOISE; | |
| 41 gsmfr_preproc_gen_cn(st, frame); | |
| 42 return; | |
| 43 } | |
| 44 } |
