From 3488d8eb86f5d4138b24cbec1019f9a06baa4e3d Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Sat, 6 Aug 2011 07:00:52 +0200 Subject: 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. --- openbsc/include/openbsc/bsc_api.h | 7 +++++++ openbsc/include/openbsc/osmo_msc_data.h | 2 ++ openbsc/src/libbsc/bsc_api.c | 6 ++++++ openbsc/src/osmo-bsc/osmo_bsc_api.c | 29 +++++++++++++++++++++++++++++ openbsc/src/osmo-bsc/osmo_bsc_msc.c | 3 +++ 5 files changed, 47 insertions(+) diff --git a/openbsc/include/openbsc/bsc_api.h b/openbsc/include/openbsc/bsc_api.h index 36ec3705c..14b1a51ad 100644 --- a/openbsc/include/openbsc/bsc_api.h +++ b/openbsc/include/openbsc/bsc_api.h @@ -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); diff --git a/openbsc/include/openbsc/osmo_msc_data.h b/openbsc/include/openbsc/osmo_msc_data.h index 6eebcdd41..8e255a0fd 100644 --- a/openbsc/include/openbsc/osmo_msc_data.h +++ b/openbsc/include/openbsc/osmo_msc_data.h @@ -26,6 +26,7 @@ #include "bsc_msc.h" #include +#include #include @@ -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; diff --git a/openbsc/src/libbsc/bsc_api.c b/openbsc/src/libbsc/bsc_api.c index 351cc343b..53d811395 100644 --- a/openbsc/src/libbsc/bsc_api.c +++ b/openbsc/src/libbsc/bsc_api.c @@ -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; diff --git a/openbsc/src/osmo-bsc/osmo_bsc_api.c b/openbsc/src/osmo-bsc/osmo_bsc_api.c index 015972678..e48458ab7 100644 --- a/openbsc/src/osmo-bsc/osmo_bsc_api.c +++ b/openbsc/src/osmo-bsc/osmo_bsc_api.c @@ -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() diff --git a/openbsc/src/osmo-bsc/osmo_bsc_msc.c b/openbsc/src/osmo-bsc/osmo_bsc_msc.c index 40d8366ca..6f319f9a7 100644 --- a/openbsc/src/osmo-bsc/osmo_bsc_msc.c +++ b/openbsc/src/osmo-bsc/osmo_bsc_msc.c @@ -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; } -- cgit v1.2.3