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 }