# HG changeset patch # User Mychaela Falconia # Date 1668892733 0 # Node ID b2255a5d051980c2854b965056f7f52bbe2c9903 # Parent 4812e00bc1004139eedfae24ab2ebf4b6189a510 libgsmfrp: implement BFI handling diff -r 4812e00bc100 -r b2255a5d0519 libgsmfrp/Makefile --- a/libgsmfrp/Makefile Sat Nov 19 20:46:13 2022 +0000 +++ b/libgsmfrp/Makefile Sat Nov 19 21:18:53 2022 +0000 @@ -1,6 +1,7 @@ CC= gcc CFLAGS= -O2 -OBJS= comfort_noise.o good_frame.o sidclass.o silence_frame.o state.o +OBJS= bad_frame.o comfort_noise.o good_frame.o sidclass.o silence_frame.o \ + state.o LIB= libgsmfrp.a all: ${LIB} diff -r 4812e00bc100 -r b2255a5d0519 libgsmfrp/bad_frame.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libgsmfrp/bad_frame.c Sat Nov 19 21:18:53 2022 +0000 @@ -0,0 +1,59 @@ +/* + * In this module we implement our handling of BFI frame gaps. + */ + +#include +#include +#include "gsm_fr_preproc.h" +#include "internal.h" + +static int reduce_xmaxc(gsm_byte *frame) +{ + int mute_flag = 1; + unsigned sub, xmaxc; + + for (sub = 0; sub < 4; sub++) { + xmaxc = ((frame[sub*7+6] & 0x1F) << 1) | (frame[sub*7+7] >> 7); + if (xmaxc > 4) { + xmaxc -= 4; + mute_flag = 0; + } else + xmaxc = 0; + frame[sub*7+6] &= 0xE0; + frame[sub*7+6] |= xmaxc >> 1; + frame[sub*7+7] &= 0x7F; + frame[sub*7+7] |= (xmaxc & 1) << 7; + } + return mute_flag; +} + +void gsmfr_preproc_bfi(struct gsmfr_preproc_state *st, int taf, gsm_byte *frame) +{ + int mute; + + switch (st->rx_state) { + case NO_DATA: + memcpy(frame, &gsmfr_preproc_silence_frame, sizeof(gsm_frame)); + return; + case SPEECH: + memcpy(frame, &st->speech_frame, sizeof(gsm_frame)); + st->rx_state = SPEECH_MUTING; + return; + case SPEECH_MUTING: + mute = reduce_xmaxc(st->speech_frame); + memcpy(frame, &st->speech_frame, sizeof(gsm_frame)); + if (mute) + st->rx_state = NO_DATA; + return; + case COMFORT_NOISE: + gsmfr_preproc_gen_cn(st, frame); + if (taf) + st->rx_state = LOST_SID; + return; + case LOST_SID: + gsmfr_preproc_gen_cn(st, frame); + if (taf) + st->rx_state = NO_DATA; + return; + } +}