mirror of
https://gitea.osmocom.org/cellular-infrastructure/osmo-mgw.git
synced 2025-11-03 13:33:29 +00:00
audio: Make the BSC handle the new mr_config request of the BSC API
Handle the mr_config request and set the AMR multirate config for the given MSC. Initialize the mr_config with the AMR5.9 default we have been using until now.
This commit is contained in:
@@ -23,6 +23,13 @@ struct bsc_api {
|
||||
uint8_t cause, uint8_t *rr_cause);
|
||||
int (*clear_request)(struct gsm_subscriber_connection *conn,
|
||||
uint32_t cause);
|
||||
|
||||
/**
|
||||
* Configure the multirate setting on this channel. If it is
|
||||
* not implemented AMR5.9 will be used.
|
||||
*/
|
||||
void (*mr_config)(struct gsm_subscriber_connection *conn,
|
||||
struct gsm48_multi_rate_conf *conf);
|
||||
};
|
||||
|
||||
int bsc_api_init(struct gsm_network *network, struct bsc_api *api);
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
#include "bsc_msc.h"
|
||||
|
||||
#include <osmocom/core/timer.h>
|
||||
#include <osmocom/gsm/protocol/gsm_04_08.h>
|
||||
|
||||
#include <regex.h>
|
||||
|
||||
@@ -68,6 +69,7 @@ struct osmo_msc_data {
|
||||
int rtp_base;
|
||||
|
||||
/* audio codecs */
|
||||
struct gsm48_multi_rate_conf amr_conf;
|
||||
struct gsm_audio_support **audio_support;
|
||||
int audio_length;
|
||||
|
||||
|
||||
@@ -151,6 +151,12 @@ static void assignment_t10_timeout(void *_conn)
|
||||
static void handle_mr_config(struct gsm_subscriber_connection *conn,
|
||||
struct gsm_lchan *lchan)
|
||||
{
|
||||
struct bsc_api *api;
|
||||
api = conn->bts->network->bsc_api;
|
||||
|
||||
if (api->mr_config)
|
||||
return api->mr_config(conn, &lchan->mr_conf);
|
||||
|
||||
lchan->mr_conf.ver = 1;
|
||||
lchan->mr_conf.icmi = 1;
|
||||
lchan->mr_conf.m5_90 = 1;
|
||||
|
||||
@@ -296,6 +296,34 @@ static int bsc_clear_request(struct gsm_subscriber_connection *conn, uint32_t ca
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void bsc_mr_config(struct gsm_subscriber_connection *conn,
|
||||
struct gsm48_multi_rate_conf *conf)
|
||||
{
|
||||
struct osmo_msc_data *msc;
|
||||
|
||||
if (!conn->sccp_con) {
|
||||
LOGP(DMSC, LOGL_ERROR,
|
||||
"No msc data available on conn %p. Audio will be broken.\n",
|
||||
conn);
|
||||
return;
|
||||
}
|
||||
|
||||
msc = conn->sccp_con->msc;
|
||||
|
||||
conf->ver = 1;
|
||||
conf->icmi = 1;
|
||||
|
||||
/* maybe gcc see's it is copy of _one_ byte */
|
||||
conf->m4_75 = msc->amr_conf.m4_75;
|
||||
conf->m5_15 = msc->amr_conf.m5_15;
|
||||
conf->m5_90 = msc->amr_conf.m5_90;
|
||||
conf->m6_70 = msc->amr_conf.m6_70;
|
||||
conf->m7_40 = msc->amr_conf.m7_40;
|
||||
conf->m7_95 = msc->amr_conf.m7_95;
|
||||
conf->m10_2 = msc->amr_conf.m10_2;
|
||||
conf->m12_2 = msc->amr_conf.m12_2;
|
||||
}
|
||||
|
||||
static struct bsc_api bsc_handler = {
|
||||
.sapi_n_reject = bsc_sapi_n_reject,
|
||||
.cipher_mode_compl = bsc_cipher_mode_compl,
|
||||
@@ -304,6 +332,7 @@ static struct bsc_api bsc_handler = {
|
||||
.assign_compl = bsc_assign_compl,
|
||||
.assign_fail = bsc_assign_fail,
|
||||
.clear_request = bsc_clear_request,
|
||||
.mr_config = bsc_mr_config,
|
||||
};
|
||||
|
||||
struct bsc_api *osmo_bsc_api()
|
||||
|
||||
@@ -491,5 +491,8 @@ struct osmo_msc_data *osmo_msc_data_alloc(struct gsm_network *net, int nr)
|
||||
msc_data->nr = nr;
|
||||
msc_data->allow_emerg = 1;
|
||||
|
||||
/* Defaults for the audio setup */
|
||||
msc_data->amr_conf.m5_90 = 1;
|
||||
|
||||
return msc_data;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user