diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/osmo-bts-sysmo/oml.c | 45 |
1 files changed, 32 insertions, 13 deletions
diff --git a/src/osmo-bts-sysmo/oml.c b/src/osmo-bts-sysmo/oml.c index 18ca6274..26c627e3 100644 --- a/src/osmo-bts-sysmo/oml.c +++ b/src/osmo-bts-sysmo/oml.c @@ -29,6 +29,7 @@ #include <osmo-bts/gsm_data.h> #include <osmo-bts/logging.h> #include <osmo-bts/oml.h> +#include <osmo-bts/amr.h> #include "l1_if.h" #include "femtobts.h" @@ -466,33 +467,51 @@ static void alive_timer_cb(void *data) osmo_timer_schedule(&fl1h->alive_timer, 5, 0); } +/* osmocom AMR mode: 0..7, L1: 1..8 */ +#define AMR_MODE_OSMO2L1(x) (x+1) + +static void clear_amr_params(GsmL1_LogChParam_t *lch_par) +{ + int j; + /* common for the SIGN, V1 and EFR: */ + lch_par->tch.amrCmiPhase = GsmL1_AmrCmiPhase_NA; + lch_par->tch.amrInitCodecMode = GsmL1_AmrCodecMode_Unset; + for (j = 0; j < ARRAY_SIZE(lch_par->tch.amrActiveCodecSet); j++) + lch_par->tch.amrActiveCodecSet[j] = GsmL1_AmrCodec_Unset; +} static void lchan2lch_par(GsmL1_LogChParam_t *lch_par, struct gsm_lchan *lchan) { int j; + unsigned int osmo_amr_mode; - LOGPC(DL1C, LOGL_INFO, "%s: %s tch_mode=0x%02x\n", + LOGP(DL1C, LOGL_INFO, "%s: %s tch_mode=0x%02x\n", gsm_lchan_name(lchan), __FUNCTION__, lchan->tch_mode); switch (lchan->tch_mode) { case GSM48_CMODE_SIGN: + /* we have to set some TCH payload type even if we don't + * know yet what codec we will use later on */ + if (lchan->type == GSM_LCHAN_TCH_F) + lch_par->tch.tchPlType = GsmL1_TchPlType_Fr; + else + lch_par->tch.tchPlType = GsmL1_TchPlType_Hr; + clear_amr_params(lch_par); + break; case GSM48_CMODE_SPEECH_V1: + lch_par->tch.tchPlType = GsmL1_TchPlType_Fr; + clear_amr_params(lch_par); + break; case GSM48_CMODE_SPEECH_EFR: - if (lchan->tch_mode == GSM48_CMODE_SPEECH_V1) - lch_par->tch.tchPlType = GsmL1_TchPlType_Fr; - else if (lchan->tch_mode == GSM48_CMODE_SPEECH_EFR) - lch_par->tch.tchPlType = GsmL1_TchPlType_Efr; - /* common for the SIGN, V1 and EFR: */ - lch_par->tch.amrCmiPhase = GsmL1_AmrCmiPhase_NA; - lch_par->tch.amrInitCodecMode = GsmL1_AmrCodecMode_Unset; - for (j = 0; j < ARRAY_SIZE(lch_par->tch.amrActiveCodecSet); j++) - lch_par->tch.amrActiveCodecSet[j] = GsmL1_AmrCodec_Unset; + lch_par->tch.tchPlType = GsmL1_TchPlType_Efr; + clear_amr_params(lch_par); break; case GSM48_CMODE_SPEECH_AMR: + lch_par->tch.tchPlType = GsmL1_TchPlType_Amr; + lch_par->tch.amrCmiPhase = GsmL1_AmrCmiPhase_Odd; /* FIXME? */ - if (lchan->mr_conf.icmi) - lch_par->tch.amrInitCodecMode = lchan->mr_conf.smod; - /* else: FIXME (implicit rule by TS 05.09 ?!?) */ + osmo_amr_mode = amr_get_initial_mode(lchan); + lch_par->tch.amrInitCodecMode = AMR_MODE_OSMO2L1(osmo_amr_mode); /* initialize to clean state */ for (j = 0; j < ARRAY_SIZE(lch_par->tch.amrActiveCodecSet); j++) |