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 } |