<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/10010">View Change</a></p><div style="white-space:pre-wrap">Approvals:
Harald Welte: Looks good to me, approved
Jenkins Builder: Verified
</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">codec_pref: move match_codec_pref() to separate c-file and add unit-test<br><br>At the moment there are three sources that may advertise a list of<br>supported audio codec/rate settings. There is the MS that advertises<br>advertises a speech codec list and the MSC that sends a channel type<br>information element over A and there are also settings in the bsc<br>configuration file that may restrict the codec/rate types that are<br>allowed to use.<br><br>The function match_codec_pref() looks at all of the three buckets and<br>selects a codec that satisfies all three. This is already a somewhat<br>complicated process, overit is very isolated, so lets give it its own<br>c-file.<br><br>Due to the lack of unit-tests it is very hard to make changes here so<br>lets add also unit-test to make sure that regressions are catched early.<br><br>- Put match_codec_pref() and all its helper functions into a separate<br> c-file.<br>- Add a unit test.<br><br>Change-Id: Iabedfdcec8b99a319f2d57cbea45c5e36c7b6e29<br>Related: OS#3361<br>---<br>M configure.ac<br>M include/osmocom/bsc/Makefile.am<br>A include/osmocom/bsc/codec_pref.h<br>M src/osmo-bsc/Makefile.am<br>A src/osmo-bsc/codec_pref.c<br>M src/osmo-bsc/osmo_bsc_bssap.c<br>M tests/Makefile.am<br>A tests/codec_pref/Makefile.am<br>A tests/codec_pref/codec_pref_test.c<br>A tests/codec_pref/codec_pref_test.ok<br>M tests/testsuite.at<br>11 files changed, 1,431 insertions(+), 160 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/configure.ac b/configure.ac</span><br><span>index 25bcad7..a99e143 100644</span><br><span>--- a/configure.ac</span><br><span>+++ b/configure.ac</span><br><span>@@ -176,6 +176,7 @@</span><br><span> tests/atlocal</span><br><span> tests/gsm0408/Makefile</span><br><span> tests/bsc/Makefile</span><br><span style="color: hsl(120, 100%, 40%);">+ tests/codec_pref/Makefile</span><br><span> tests/abis/Makefile</span><br><span> tests/subscr/Makefile</span><br><span> tests/nanobts_omlattr/Makefile</span><br><span>diff --git a/include/osmocom/bsc/Makefile.am b/include/osmocom/bsc/Makefile.am</span><br><span>index 5fa39eb..dfab592 100644</span><br><span>--- a/include/osmocom/bsc/Makefile.am</span><br><span>+++ b/include/osmocom/bsc/Makefile.am</span><br><span>@@ -12,6 +12,7 @@</span><br><span> bss.h \</span><br><span> bts_ipaccess_nanobts_omlattr.h \</span><br><span> chan_alloc.h \</span><br><span style="color: hsl(120, 100%, 40%);">+ codec_pref.h \</span><br><span> ctrl.h \</span><br><span> debug.h \</span><br><span> e1_config.h \</span><br><span>diff --git a/include/osmocom/bsc/codec_pref.h b/include/osmocom/bsc/codec_pref.h</span><br><span>new file mode 100644</span><br><span>index 0000000..6933cea</span><br><span>--- /dev/null</span><br><span>+++ b/include/osmocom/bsc/codec_pref.h</span><br><span>@@ -0,0 +1,6 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#pragma once</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int match_codec_pref(int *full_rate, enum gsm48_chan_mode *chan_mode,</span><br><span style="color: hsl(120, 100%, 40%);">+ const struct gsm0808_channel_type *ct,</span><br><span style="color: hsl(120, 100%, 40%);">+ const struct gsm0808_speech_codec_list *scl,</span><br><span style="color: hsl(120, 100%, 40%);">+ const struct bsc_msc_data *msc);</span><br><span>diff --git a/src/osmo-bsc/Makefile.am b/src/osmo-bsc/Makefile.am</span><br><span>index a459a92..db63a99 100644</span><br><span>--- a/src/osmo-bsc/Makefile.am</span><br><span>+++ b/src/osmo-bsc/Makefile.am</span><br><span>@@ -53,6 +53,7 @@</span><br><span> bts_sysmobts.c \</span><br><span> bts_unknown.c \</span><br><span> chan_alloc.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ codec_pref.c \</span><br><span> e1_config.c \</span><br><span> gsm_04_08_utils.c \</span><br><span> gsm_04_80_utils.c \</span><br><span>diff --git a/src/osmo-bsc/codec_pref.c b/src/osmo-bsc/codec_pref.c</span><br><span>new file mode 100644</span><br><span>index 0000000..ee0760a</span><br><span>--- /dev/null</span><br><span>+++ b/src/osmo-bsc/codec_pref.c</span><br><span>@@ -0,0 +1,175 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2017-2018 by sysmocom s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Author: Philipp Maier</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU Affero General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * along with this program. If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/msgb.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/gsm0808_utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/bsc_msc_data.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/codec_pref.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Helper function for match_codec_pref(), looks up a matching chan mode for</span><br><span style="color: hsl(120, 100%, 40%);">+ * a given permitted speech value */</span><br><span style="color: hsl(120, 100%, 40%);">+enum gsm48_chan_mode gsm88_to_chan_mode(enum gsm0808_permitted_speech speech)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (speech) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case GSM0808_PERM_HR1:</span><br><span style="color: hsl(120, 100%, 40%);">+ case GSM0808_PERM_FR1:</span><br><span style="color: hsl(120, 100%, 40%);">+ return GSM48_CMODE_SPEECH_V1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case GSM0808_PERM_HR2:</span><br><span style="color: hsl(120, 100%, 40%);">+ case GSM0808_PERM_FR2:</span><br><span style="color: hsl(120, 100%, 40%);">+ return GSM48_CMODE_SPEECH_EFR;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case GSM0808_PERM_HR3:</span><br><span style="color: hsl(120, 100%, 40%);">+ case GSM0808_PERM_FR3:</span><br><span style="color: hsl(120, 100%, 40%);">+ return GSM48_CMODE_SPEECH_AMR;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ default:</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DMSC, LOGL_FATAL, "Unsupported permitted speech selected, assuming AMR as channel mode...\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ return GSM48_CMODE_SPEECH_AMR;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Helper function for match_codec_pref(), looks up a matching permitted speech</span><br><span style="color: hsl(120, 100%, 40%);">+ * value for a given msc audio codec pref */</span><br><span style="color: hsl(120, 100%, 40%);">+enum gsm0808_permitted_speech audio_support_to_gsm88(struct gsm_audio_support *audio)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ if (audio->hr) {</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (audio->ver) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case 1:</span><br><span style="color: hsl(120, 100%, 40%);">+ return GSM0808_PERM_HR1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 2:</span><br><span style="color: hsl(120, 100%, 40%);">+ return GSM0808_PERM_HR2;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 3:</span><br><span style="color: hsl(120, 100%, 40%);">+ return GSM0808_PERM_HR3;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ default:</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DMSC, LOGL_ERROR, "Wrong speech mode: hr%d, using hr1 instead\n", audio->ver);</span><br><span style="color: hsl(120, 100%, 40%);">+ return GSM0808_PERM_HR1;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (audio->ver) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case 1:</span><br><span style="color: hsl(120, 100%, 40%);">+ return GSM0808_PERM_FR1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 2:</span><br><span style="color: hsl(120, 100%, 40%);">+ return GSM0808_PERM_FR2;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 3:</span><br><span style="color: hsl(120, 100%, 40%);">+ return GSM0808_PERM_FR3;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ default:</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DMSC, LOGL_ERROR, "Wrong speech mode: fr%d, using fr1 instead\n", audio->ver);</span><br><span style="color: hsl(120, 100%, 40%);">+ return GSM0808_PERM_FR1;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Helper function for match_codec_pref(), tests if a given audio support</span><br><span style="color: hsl(120, 100%, 40%);">+ * matches one of the permitted speech settings of the channel type element.</span><br><span style="color: hsl(120, 100%, 40%);">+ * The matched permitted speech value is then also compared against the</span><br><span style="color: hsl(120, 100%, 40%);">+ * speech codec list. (optional, only relevant for AoIP) */</span><br><span style="color: hsl(120, 100%, 40%);">+static bool test_codec_pref(const struct gsm0808_channel_type *ct,</span><br><span style="color: hsl(120, 100%, 40%);">+ const struct gsm0808_speech_codec_list *scl, uint8_t perm_spch)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int i;</span><br><span style="color: hsl(120, 100%, 40%);">+ bool match = false;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm0808_speech_codec sc;</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Try to find the given permitted speech value in the</span><br><span style="color: hsl(120, 100%, 40%);">+ * codec list of the channel type element */</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < ct->perm_spch_len; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ct->perm_spch[i] == perm_spch) {</span><br><span style="color: hsl(120, 100%, 40%);">+ match = true;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* If we do not have a speech codec list to test against,</span><br><span style="color: hsl(120, 100%, 40%);">+ * we just exit early (will be always the case in non-AoIP networks) */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!scl)</span><br><span style="color: hsl(120, 100%, 40%);">+ return match;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* If we failed to match until here, there is no</span><br><span style="color: hsl(120, 100%, 40%);">+ * point in testing further */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (match == false)</span><br><span style="color: hsl(120, 100%, 40%);">+ return false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Extrapolate speech codec data */</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = gsm0808_speech_codec_from_chan_type(&sc, perm_spch);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ return false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Try to find extrapolated speech codec data in</span><br><span style="color: hsl(120, 100%, 40%);">+ * the speech codec list */</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < scl->len; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (sc.type == scl->codec[i].type)</span><br><span style="color: hsl(120, 100%, 40%);">+ return true;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return false;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Helper function for bssmap_handle_assignm_req(), matches the codec</span><br><span style="color: hsl(120, 100%, 40%);">+ * preferences from the MSC with the codec preferences</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[out] full_rate '1' if full-rate, '0' if half-rate, '-1' if no match</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[out] chan_mode GSM 04.08 channel mode</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] ct GSM 08.08 channel type</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] scl GSM 08.08 speech codec list</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] msc MSC data [for configuration]</span><br><span style="color: hsl(120, 100%, 40%);">+ * \returns 0 on success, -1 in case no match was found */</span><br><span style="color: hsl(120, 100%, 40%);">+int match_codec_pref(int *full_rate, enum gsm48_chan_mode *chan_mode,</span><br><span style="color: hsl(120, 100%, 40%);">+ const struct gsm0808_channel_type *ct,</span><br><span style="color: hsl(120, 100%, 40%);">+ const struct gsm0808_speech_codec_list *scl, const struct bsc_msc_data *msc)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int i;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t perm_spch;</span><br><span style="color: hsl(120, 100%, 40%);">+ bool match = false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < msc->audio_length; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch = audio_support_to_gsm88(msc->audio_support[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (test_codec_pref(ct, scl, perm_spch)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ match = true;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Exit without result, in case no match can be deteched */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!match) {</span><br><span style="color: hsl(120, 100%, 40%);">+ *full_rate = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+ *chan_mode = GSM48_CMODE_SIGN;</span><br><span style="color: hsl(120, 100%, 40%);">+ return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Check if the result is a half or full rate codec */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (perm_spch == GSM0808_PERM_HR1 || perm_spch == GSM0808_PERM_HR2 || perm_spch == GSM0808_PERM_HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ || perm_spch == GSM0808_PERM_HR4 || perm_spch == GSM0808_PERM_HR6)</span><br><span style="color: hsl(120, 100%, 40%);">+ *full_rate = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ else</span><br><span style="color: hsl(120, 100%, 40%);">+ *full_rate = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Lookup a channel mode for the selected codec */</span><br><span style="color: hsl(120, 100%, 40%);">+ *chan_mode = gsm88_to_chan_mode(perm_spch);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/osmo-bsc/osmo_bsc_bssap.c b/src/osmo-bsc/osmo_bsc_bssap.c</span><br><span>index c2d51b5..96cc2c5 100644</span><br><span>--- a/src/osmo-bsc/osmo_bsc_bssap.c</span><br><span>+++ b/src/osmo-bsc/osmo_bsc_bssap.c</span><br><span>@@ -22,17 +22,13 @@</span><br><span> #include <osmocom/bsc/osmo_bsc.h></span><br><span> #include <osmocom/bsc/osmo_bsc_grace.h></span><br><span> #include <osmocom/bsc/osmo_bsc_rf.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/bsc_msc_data.h></span><br><span> #include <osmocom/bsc/debug.h></span><br><span> #include <osmocom/bsc/bsc_subscriber.h></span><br><span> #include <osmocom/bsc/paging.h></span><br><span> #include <osmocom/bsc/gsm_04_08_utils.h></span><br><span> #include <osmocom/bsc/bsc_subscr_conn_fsm.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/protocol/gsm_08_08.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/codec_pref.h></span><br><span> #include <osmocom/gsm/gsm0808.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/gsm0808_utils.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/gsm48.h></span><br><span> #include <osmocom/bsc/osmo_bsc_sigtran.h></span><br><span> #include <osmocom/bsc/osmo_bsc_lcls.h></span><br><span> #include <osmocom/bsc/a_reset.h></span><br><span>@@ -45,161 +41,6 @@</span><br><span> * helpers for the assignment command</span><br><span> */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* Helper function for match_codec_pref(), looks up a matching permitted speech</span><br><span style="color: hsl(0, 100%, 40%);">- * value for a given msc audio codec pref */</span><br><span style="color: hsl(0, 100%, 40%);">-enum gsm0808_permitted_speech audio_support_to_gsm88(struct gsm_audio_support *audio)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- if (audio->hr) {</span><br><span style="color: hsl(0, 100%, 40%);">- switch (audio->ver) {</span><br><span style="color: hsl(0, 100%, 40%);">- case 1:</span><br><span style="color: hsl(0, 100%, 40%);">- return GSM0808_PERM_HR1;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- case 2:</span><br><span style="color: hsl(0, 100%, 40%);">- return GSM0808_PERM_HR2;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- case 3:</span><br><span style="color: hsl(0, 100%, 40%);">- return GSM0808_PERM_HR3;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- default:</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DMSC, LOGL_ERROR, "Wrong speech mode: hr%d, using hr1 instead\n",</span><br><span style="color: hsl(0, 100%, 40%);">- audio->ver);</span><br><span style="color: hsl(0, 100%, 40%);">- return GSM0808_PERM_HR1;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- } else {</span><br><span style="color: hsl(0, 100%, 40%);">- switch (audio->ver) {</span><br><span style="color: hsl(0, 100%, 40%);">- case 1:</span><br><span style="color: hsl(0, 100%, 40%);">- return GSM0808_PERM_FR1;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- case 2:</span><br><span style="color: hsl(0, 100%, 40%);">- return GSM0808_PERM_FR2;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- case 3:</span><br><span style="color: hsl(0, 100%, 40%);">- return GSM0808_PERM_FR3;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- default:</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DMSC, LOGL_ERROR, "Wrong speech mode: fr%d, using fr1 instead\n",</span><br><span style="color: hsl(0, 100%, 40%);">- audio->ver);</span><br><span style="color: hsl(0, 100%, 40%);">- return GSM0808_PERM_FR1;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Helper function for match_codec_pref(), looks up a matching chan mode for</span><br><span style="color: hsl(0, 100%, 40%);">- * a given permitted speech value */</span><br><span style="color: hsl(0, 100%, 40%);">-enum gsm48_chan_mode gsm88_to_chan_mode(enum gsm0808_permitted_speech speech)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- switch (speech) {</span><br><span style="color: hsl(0, 100%, 40%);">- case GSM0808_PERM_HR1:</span><br><span style="color: hsl(0, 100%, 40%);">- case GSM0808_PERM_FR1:</span><br><span style="color: hsl(0, 100%, 40%);">- return GSM48_CMODE_SPEECH_V1;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- case GSM0808_PERM_HR2:</span><br><span style="color: hsl(0, 100%, 40%);">- case GSM0808_PERM_FR2:</span><br><span style="color: hsl(0, 100%, 40%);">- return GSM48_CMODE_SPEECH_EFR;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- case GSM0808_PERM_HR3:</span><br><span style="color: hsl(0, 100%, 40%);">- case GSM0808_PERM_FR3:</span><br><span style="color: hsl(0, 100%, 40%);">- return GSM48_CMODE_SPEECH_AMR;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- default:</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DMSC, LOGL_FATAL,</span><br><span style="color: hsl(0, 100%, 40%);">- "Unsupported permitted speech selected, assuming AMR as channel mode...\n");</span><br><span style="color: hsl(0, 100%, 40%);">- return GSM48_CMODE_SPEECH_AMR;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Helper function for match_codec_pref(), tests if a given audio support</span><br><span style="color: hsl(0, 100%, 40%);">- * matches one of the permitted speech settings of the channel type element.</span><br><span style="color: hsl(0, 100%, 40%);">- * The matched permitted speech value is then also compared against the</span><br><span style="color: hsl(0, 100%, 40%);">- * speech codec list. (optional, only relevant for AoIP) */</span><br><span style="color: hsl(0, 100%, 40%);">-static bool test_codec_pref(const struct gsm0808_channel_type *ct,</span><br><span style="color: hsl(0, 100%, 40%);">- const struct gsm0808_speech_codec_list *scl,</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t perm_spch)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int i;</span><br><span style="color: hsl(0, 100%, 40%);">- bool match = false;</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm0808_speech_codec sc;</span><br><span style="color: hsl(0, 100%, 40%);">- int rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Try to finde the given permitted speech value in the</span><br><span style="color: hsl(0, 100%, 40%);">- * codec list of the channel type element */</span><br><span style="color: hsl(0, 100%, 40%);">- for (i = 0; i < ct->perm_spch_len; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">- if (ct->perm_spch[i] == perm_spch) {</span><br><span style="color: hsl(0, 100%, 40%);">- match = true;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* If we do not have a speech codec list to test against,</span><br><span style="color: hsl(0, 100%, 40%);">- * we just exit early (will be always the case in non-AoIP networks) */</span><br><span style="color: hsl(0, 100%, 40%);">- if (!scl)</span><br><span style="color: hsl(0, 100%, 40%);">- return match;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* If we failed to match until here, there is no</span><br><span style="color: hsl(0, 100%, 40%);">- * point in testing further */</span><br><span style="color: hsl(0, 100%, 40%);">- if (match == false)</span><br><span style="color: hsl(0, 100%, 40%);">- return false;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Extrapolate speech codec data */</span><br><span style="color: hsl(0, 100%, 40%);">- rc = gsm0808_speech_codec_from_chan_type(&sc, perm_spch);</span><br><span style="color: hsl(0, 100%, 40%);">- if (rc < 0)</span><br><span style="color: hsl(0, 100%, 40%);">- return false;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Try to find extrapolated speech codec data in</span><br><span style="color: hsl(0, 100%, 40%);">- * the speech codec list */</span><br><span style="color: hsl(0, 100%, 40%);">- for (i = 0; i < scl->len; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">- if (sc.type == scl->codec[i].type)</span><br><span style="color: hsl(0, 100%, 40%);">- return true;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return false;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! Helper function for bssmap_handle_assignm_req(), matches the codec</span><br><span style="color: hsl(0, 100%, 40%);">- * preferences from the MSC with the codec preferences</span><br><span style="color: hsl(0, 100%, 40%);">- * \param[out] full_rate '1' if full-rate, '0' if half-rate, '-1' if no match</span><br><span style="color: hsl(0, 100%, 40%);">- * \param[out] chan_mode GSM 04.08 channel mode</span><br><span style="color: hsl(0, 100%, 40%);">- * \param[in] ct GSM 08.08 channel type</span><br><span style="color: hsl(0, 100%, 40%);">- * \param[in] scl GSM 08.08 speech codec list</span><br><span style="color: hsl(0, 100%, 40%);">- * \param[in] msc MSC data [for configuration]</span><br><span style="color: hsl(0, 100%, 40%);">- * \returns 0 on success, -1 in case no match was found */</span><br><span style="color: hsl(0, 100%, 40%);">-static int match_codec_pref(int *full_rate, enum gsm48_chan_mode *chan_mode,</span><br><span style="color: hsl(0, 100%, 40%);">- const struct gsm0808_channel_type *ct,</span><br><span style="color: hsl(0, 100%, 40%);">- const struct gsm0808_speech_codec_list *scl,</span><br><span style="color: hsl(0, 100%, 40%);">- const struct bsc_msc_data *msc)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int i;</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t perm_spch;</span><br><span style="color: hsl(0, 100%, 40%);">- bool match = false;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- for (i = 0; i < msc->audio_length; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">- perm_spch = audio_support_to_gsm88(msc->audio_support[i]);</span><br><span style="color: hsl(0, 100%, 40%);">- if (test_codec_pref(ct, scl, perm_spch)) {</span><br><span style="color: hsl(0, 100%, 40%);">- match = true;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Exit without result, in case no match can be deteched */</span><br><span style="color: hsl(0, 100%, 40%);">- if (!match) {</span><br><span style="color: hsl(0, 100%, 40%);">- *full_rate = -1;</span><br><span style="color: hsl(0, 100%, 40%);">- *chan_mode = GSM48_CMODE_SIGN;</span><br><span style="color: hsl(0, 100%, 40%);">- return -1;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Check if the result is a half or full rate codec */</span><br><span style="color: hsl(0, 100%, 40%);">- if (perm_spch == GSM0808_PERM_HR1 || perm_spch == GSM0808_PERM_HR2</span><br><span style="color: hsl(0, 100%, 40%);">- || perm_spch == GSM0808_PERM_HR3 || perm_spch == GSM0808_PERM_HR4</span><br><span style="color: hsl(0, 100%, 40%);">- || perm_spch == GSM0808_PERM_HR6)</span><br><span style="color: hsl(0, 100%, 40%);">- *full_rate = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- else</span><br><span style="color: hsl(0, 100%, 40%);">- *full_rate = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Lookup a channel mode for the selected codec */</span><br><span style="color: hsl(0, 100%, 40%);">- *chan_mode = gsm88_to_chan_mode(perm_spch);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span> </span><br><span> static int bssmap_handle_reset_ack(struct bsc_msc_data *msc,</span><br><span> struct msgb *msg, unsigned int length)</span><br><span>diff --git a/tests/Makefile.am b/tests/Makefile.am</span><br><span>index 95d836b..9b4cfe4 100644</span><br><span>--- a/tests/Makefile.am</span><br><span>+++ b/tests/Makefile.am</span><br><span>@@ -1,5 +1,6 @@</span><br><span> SUBDIRS = \</span><br><span> bsc \</span><br><span style="color: hsl(120, 100%, 40%);">+ codec_pref \</span><br><span> gsm0408 \</span><br><span> abis \</span><br><span> subscr \</span><br><span>diff --git a/tests/codec_pref/Makefile.am b/tests/codec_pref/Makefile.am</span><br><span>new file mode 100644</span><br><span>index 0000000..e000252</span><br><span>--- /dev/null</span><br><span>+++ b/tests/codec_pref/Makefile.am</span><br><span>@@ -0,0 +1,34 @@</span><br><span style="color: hsl(120, 100%, 40%);">+AM_CPPFLAGS = \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(all_includes) \</span><br><span style="color: hsl(120, 100%, 40%);">+ -I$(top_srcdir)/include \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AM_CFLAGS = \</span><br><span style="color: hsl(120, 100%, 40%);">+ -Wall \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(LIBOSMOCORE_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(LIBOSMOGSM_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(LIBOSMOABIS_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(LIBOSMOSIGTRAN_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AM_LDFLAGS = \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+EXTRA_DIST = \</span><br><span style="color: hsl(120, 100%, 40%);">+ codec_pref_test.ok \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+noinst_PROGRAMS = \</span><br><span style="color: hsl(120, 100%, 40%);">+ codec_pref_test \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+codec_pref_test_SOURCES = \</span><br><span style="color: hsl(120, 100%, 40%);">+ codec_pref_test.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+codec_pref_test_LDADD = \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/codec_pref.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(LIBOSMOCORE_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(LIBOSMOGSM_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+ -lrt \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(NULL)</span><br><span>diff --git a/tests/codec_pref/codec_pref_test.c b/tests/codec_pref/codec_pref_test.c</span><br><span>new file mode 100644</span><br><span>index 0000000..73547ad</span><br><span>--- /dev/null</span><br><span>+++ b/tests/codec_pref/codec_pref_test.c</span><br><span>@@ -0,0 +1,498 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2018 by sysmocom s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Author: Philipp Maier</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU Affero General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * along with this program. If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/osmo_bsc.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/bsc_msc_data.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/gsm_04_80.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/application.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/codec_pref.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdio.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void *ctx = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define MSC_AUDIO_SUPPORT_MAX 5</span><br><span style="color: hsl(120, 100%, 40%);">+#define N_CONFIG_VARIANTS 9</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Make sure that there is some memory to put our test configuration. */</span><br><span style="color: hsl(120, 100%, 40%);">+static void init_msc_config(struct bsc_msc_data *msc)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support = talloc_zero_array(ctx, struct gsm_audio_support *, MSC_AUDIO_SUPPORT_MAX);</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_length = MSC_AUDIO_SUPPORT_MAX;</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < MSC_AUDIO_SUPPORT_MAX; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support[i] = talloc_zero(msc->audio_support, struct gsm_audio_support);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Free memory that we have used for the test configuration. */</span><br><span style="color: hsl(120, 100%, 40%);">+static void free_msc_config(struct bsc_msc_data *msc)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ talloc_free(msc->audio_support);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* The speech codec list is sent by the MS and lists the voice codec settings</span><br><span style="color: hsl(120, 100%, 40%);">+ * that the MS is able to support. The BSC must select one of this codecs</span><br><span style="color: hsl(120, 100%, 40%);">+ * depending on what the MSC is able to support. The following function</span><br><span style="color: hsl(120, 100%, 40%);">+ * generates some realistically made up speech codec lists. */</span><br><span style="color: hsl(120, 100%, 40%);">+static void make_scl_config(struct gsm0808_speech_codec_list *scl, uint8_t config_no)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(config_no < N_CONFIG_VARIANTS);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (config_no) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case 0:</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FR1 only */</span><br><span style="color: hsl(120, 100%, 40%);">+ scl->codec[0].type = GSM0808_SCT_FR1;</span><br><span style="color: hsl(120, 100%, 40%);">+ scl->len = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 1:</span><br><span style="color: hsl(120, 100%, 40%);">+ /* HR1 only */</span><br><span style="color: hsl(120, 100%, 40%);">+ scl->codec[0].type = GSM0808_SCT_HR1;</span><br><span style="color: hsl(120, 100%, 40%);">+ scl->len = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 2:</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FR2 only */</span><br><span style="color: hsl(120, 100%, 40%);">+ scl->codec[0].type = GSM0808_SCT_FR2;</span><br><span style="color: hsl(120, 100%, 40%);">+ scl->len = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 3:</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FR3 only */</span><br><span style="color: hsl(120, 100%, 40%);">+ scl->codec[0].type = GSM0808_SCT_FR3;</span><br><span style="color: hsl(120, 100%, 40%);">+ scl->len = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 4:</span><br><span style="color: hsl(120, 100%, 40%);">+ /* HR3 only */</span><br><span style="color: hsl(120, 100%, 40%);">+ scl->codec[0].type = GSM0808_SCT_HR3;</span><br><span style="color: hsl(120, 100%, 40%);">+ scl->len = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 5:</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FR1 and HR1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ scl->codec[0].type = GSM0808_SCT_FR1;</span><br><span style="color: hsl(120, 100%, 40%);">+ scl->codec[1].type = GSM0808_SCT_HR1;</span><br><span style="color: hsl(120, 100%, 40%);">+ scl->len = 2;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 6:</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FR1, FR2 and HR1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ scl->codec[0].type = GSM0808_SCT_FR1;</span><br><span style="color: hsl(120, 100%, 40%);">+ scl->codec[1].type = GSM0808_SCT_FR2;</span><br><span style="color: hsl(120, 100%, 40%);">+ scl->codec[2].type = GSM0808_SCT_HR1;</span><br><span style="color: hsl(120, 100%, 40%);">+ scl->len = 3;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 7:</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FR1, FR3 and HR3 */</span><br><span style="color: hsl(120, 100%, 40%);">+ scl->codec[0].type = GSM0808_SCT_FR1;</span><br><span style="color: hsl(120, 100%, 40%);">+ scl->codec[1].type = GSM0808_SCT_FR3;</span><br><span style="color: hsl(120, 100%, 40%);">+ scl->codec[2].type = GSM0808_SCT_HR3;</span><br><span style="color: hsl(120, 100%, 40%);">+ scl->len = 3;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 8:</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FR1, FR2, FR3, HR1 and HR3 */</span><br><span style="color: hsl(120, 100%, 40%);">+ scl->codec[0].type = GSM0808_SCT_FR1;</span><br><span style="color: hsl(120, 100%, 40%);">+ scl->codec[1].type = GSM0808_SCT_FR2;</span><br><span style="color: hsl(120, 100%, 40%);">+ scl->codec[2].type = GSM0808_SCT_FR3;</span><br><span style="color: hsl(120, 100%, 40%);">+ scl->codec[3].type = GSM0808_SCT_HR1;</span><br><span style="color: hsl(120, 100%, 40%);">+ scl->codec[4].type = GSM0808_SCT_HR3;</span><br><span style="color: hsl(120, 100%, 40%);">+ scl->len = 5;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* The channel type element which is sent to the BSC by the MSC lists all the</span><br><span style="color: hsl(120, 100%, 40%);">+ * codecs that the MSC is able to support. The following function generates</span><br><span style="color: hsl(120, 100%, 40%);">+ * a realistic permitted speech settings */</span><br><span style="color: hsl(120, 100%, 40%);">+static void make_ct_config(struct gsm0808_channel_type *ct, uint8_t config_no)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(config_no < N_CONFIG_VARIANTS);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (config_no) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case 0:</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FR1 only */</span><br><span style="color: hsl(120, 100%, 40%);">+ ct->perm_spch[0] = GSM0808_PERM_FR1;</span><br><span style="color: hsl(120, 100%, 40%);">+ ct->perm_spch_len = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 1:</span><br><span style="color: hsl(120, 100%, 40%);">+ /* HR1 only */</span><br><span style="color: hsl(120, 100%, 40%);">+ ct->perm_spch[0] = GSM0808_PERM_HR1;</span><br><span style="color: hsl(120, 100%, 40%);">+ ct->perm_spch_len = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 2:</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FR2 only */</span><br><span style="color: hsl(120, 100%, 40%);">+ ct->perm_spch[0] = GSM0808_PERM_FR2;</span><br><span style="color: hsl(120, 100%, 40%);">+ ct->perm_spch_len = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 3:</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FR3 only */</span><br><span style="color: hsl(120, 100%, 40%);">+ ct->perm_spch[0] = GSM0808_PERM_FR3;</span><br><span style="color: hsl(120, 100%, 40%);">+ ct->perm_spch_len = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 4:</span><br><span style="color: hsl(120, 100%, 40%);">+ /* HR3 only */</span><br><span style="color: hsl(120, 100%, 40%);">+ ct->perm_spch[0] = GSM0808_PERM_HR3;</span><br><span style="color: hsl(120, 100%, 40%);">+ ct->perm_spch_len = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 5:</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FR1 and HR1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ ct->perm_spch[0] = GSM0808_PERM_FR1;</span><br><span style="color: hsl(120, 100%, 40%);">+ ct->perm_spch[1] = GSM0808_PERM_HR1;</span><br><span style="color: hsl(120, 100%, 40%);">+ ct->perm_spch_len = 2;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 6:</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FR1, FR2 and HR1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ ct->perm_spch[0] = GSM0808_PERM_FR1;</span><br><span style="color: hsl(120, 100%, 40%);">+ ct->perm_spch[1] = GSM0808_PERM_FR2;</span><br><span style="color: hsl(120, 100%, 40%);">+ ct->perm_spch[2] = GSM0808_PERM_HR1;</span><br><span style="color: hsl(120, 100%, 40%);">+ ct->perm_spch_len = 3;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 7:</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FR1, FR3 and HR3 */</span><br><span style="color: hsl(120, 100%, 40%);">+ ct->perm_spch[0] = GSM0808_PERM_FR1;</span><br><span style="color: hsl(120, 100%, 40%);">+ ct->perm_spch[1] = GSM0808_PERM_FR3;</span><br><span style="color: hsl(120, 100%, 40%);">+ ct->perm_spch[2] = GSM0808_PERM_HR3;</span><br><span style="color: hsl(120, 100%, 40%);">+ ct->perm_spch_len = 3;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 8:</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FR1, FR2, FR3, HR1 and HR3 */</span><br><span style="color: hsl(120, 100%, 40%);">+ ct->perm_spch[0] = GSM0808_PERM_FR1;</span><br><span style="color: hsl(120, 100%, 40%);">+ ct->perm_spch[1] = GSM0808_PERM_FR2;</span><br><span style="color: hsl(120, 100%, 40%);">+ ct->perm_spch[2] = GSM0808_PERM_FR3;</span><br><span style="color: hsl(120, 100%, 40%);">+ ct->perm_spch[3] = GSM0808_PERM_HR1;</span><br><span style="color: hsl(120, 100%, 40%);">+ ct->perm_spch[4] = GSM0808_PERM_HR3;</span><br><span style="color: hsl(120, 100%, 40%);">+ ct->perm_spch_len = 5;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Generate some realistic MSC configuration which one also could find in the</span><br><span style="color: hsl(120, 100%, 40%);">+ * real world. This configuration acts as a filter. While the MSC could in</span><br><span style="color: hsl(120, 100%, 40%);">+ * theory advertise codecs more codecs as we are able to support we have to</span><br><span style="color: hsl(120, 100%, 40%);">+ * make sure that only the codecs we have support for are considered. */</span><br><span style="color: hsl(120, 100%, 40%);">+static void make_msc_config(struct bsc_msc_data *msc, uint8_t config_no)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ /* 1 = FR1/HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ * 2 = FR2/HR2</span><br><span style="color: hsl(120, 100%, 40%);">+ * 3 = FR2/HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * Note: HR2 is deprecated */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(config_no < N_CONFIG_VARIANTS);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (config_no) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case 0:</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FR1 only */</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support[0]->ver = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support[0]->hr = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_length = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 1:</span><br><span style="color: hsl(120, 100%, 40%);">+ /* HR1 only */</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support[0]->ver = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support[0]->hr = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_length = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 2:</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FR2 only */</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support[0]->ver = 2;</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support[0]->hr = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_length = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 3:</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FR3 only */</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support[0]->ver = 3;</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support[0]->hr = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_length = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 4:</span><br><span style="color: hsl(120, 100%, 40%);">+ /* HR3 only */</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support[0]->ver = 3;</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support[0]->hr = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_length = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 5:</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FR1 and HR1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support[0]->ver = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support[0]->hr = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support[1]->ver = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support[1]->hr = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_length = 2;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 6:</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FR1, FR2 and HR1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support[0]->ver = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support[0]->hr = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support[1]->ver = 2;</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support[1]->hr = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support[2]->ver = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support[2]->hr = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_length = 3;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 7:</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FR1, FR3 and HR3 */</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support[0]->ver = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support[0]->hr = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support[1]->ver = 3;</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support[1]->hr = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support[2]->ver = 3;</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support[2]->hr = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_length = 3;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 8:</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FR1, FR2, FR3, HR1 and HR3 */</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support[0]->ver = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support[0]->hr = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support[1]->ver = 2;</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support[1]->hr = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support[2]->ver = 3;</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support[2]->hr = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support[3]->ver = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support[3]->hr = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support[4]->ver = 3;</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_support[4]->hr = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ msc->audio_length = 5;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Try execute match_codec_pref(), display input and output parameters */</span><br><span style="color: hsl(120, 100%, 40%);">+static int test_match_codec_pref(const struct gsm0808_channel_type *ct,</span><br><span style="color: hsl(120, 100%, 40%);">+ const struct gsm0808_speech_codec_list *scl, const struct bsc_msc_data *msc)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int i;</span><br><span style="color: hsl(120, 100%, 40%);">+ int full_rate;</span><br><span style="color: hsl(120, 100%, 40%);">+ enum gsm48_chan_mode chan_mode;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("Determining channel mode and rate:\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ printf(" * MS: speech codec list (%u items):\n", scl->len);</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < scl->len; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+ printf(" codec[%u]->type=%s\n", i, gsm0808_speech_codec_type_name(scl->codec[i].type));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ printf(" * MSC: channel type permitted speech (%u items):\n", ct->perm_spch_len);</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < ct->perm_spch_len; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+ printf(" perm_spch[%u]=%s\n", i, gsm0808_permitted_speech_name(ct->perm_spch[i]));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ printf(" * BSS: audio support settings (%u items):\n", msc->audio_length);</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < msc->audio_length; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+ if (msc->audio_support[i]->hr)</span><br><span style="color: hsl(120, 100%, 40%);">+ printf(" audio_support[%u]=HR%u\n", i, msc->audio_support[i]->ver);</span><br><span style="color: hsl(120, 100%, 40%);">+ else</span><br><span style="color: hsl(120, 100%, 40%);">+ printf(" audio_support[%u]=FR%u\n", i, msc->audio_support[i]->ver);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = match_codec_pref(&full_rate, &chan_mode, ct, scl, msc);</span><br><span style="color: hsl(120, 100%, 40%);">+ printf(" * result: rc=%i, full_rate=%i, chan_mode=%s\n", rc, full_rate, gsm48_chan_mode_name(chan_mode));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* MS, MSC and local MSC settings are the same */</span><br><span style="color: hsl(120, 100%, 40%);">+static void test_one_to_one(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int i;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm0808_channel_type ct_msc;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm0808_speech_codec_list scl_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct bsc_msc_data msc_local;</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("============== test_one_to_one ==============\n\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ init_msc_config(&msc_local);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < N_CONFIG_VARIANTS; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+ make_msc_config(&msc_local, i);</span><br><span style="color: hsl(120, 100%, 40%);">+ make_scl_config(&scl_ms, i);</span><br><span style="color: hsl(120, 100%, 40%);">+ make_ct_config(&ct_msc, i);</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = test_match_codec_pref(&ct_msc, &scl_ms, &msc_local);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(rc == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ free_msc_config(&msc_local);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Network supports all combinations, MS varies */</span><br><span style="color: hsl(120, 100%, 40%);">+static void test_ms(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int i;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm0808_channel_type ct_msc;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm0808_speech_codec_list scl_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct bsc_msc_data msc_local;</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("============== test_ms ==============\n\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ init_msc_config(&msc_local);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ make_msc_config(&msc_local, 8);</span><br><span style="color: hsl(120, 100%, 40%);">+ make_ct_config(&ct_msc, 8);</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < N_CONFIG_VARIANTS; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+ make_scl_config(&scl_ms, i);</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = test_match_codec_pref(&ct_msc, &scl_ms, &msc_local);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(rc == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ free_msc_config(&msc_local);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* BSS and MS support all combinations, MSC varies */</span><br><span style="color: hsl(120, 100%, 40%);">+static void test_ct(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int i;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm0808_channel_type ct_msc;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm0808_speech_codec_list scl_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct bsc_msc_data msc_local;</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("============== test_ct ==============\n\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ init_msc_config(&msc_local);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ make_msc_config(&msc_local, 8);</span><br><span style="color: hsl(120, 100%, 40%);">+ make_scl_config(&scl_ms, 8);</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < N_CONFIG_VARIANTS; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+ make_ct_config(&ct_msc, i);</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = test_match_codec_pref(&ct_msc, &scl_ms, &msc_local);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(rc == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ free_msc_config(&msc_local);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* MSC and MS support all combinations, BSS varies */</span><br><span style="color: hsl(120, 100%, 40%);">+static void test_msc(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int i;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm0808_channel_type ct_msc;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm0808_speech_codec_list scl_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct bsc_msc_data msc_local;</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("============== test_msc ==============\n\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ init_msc_config(&msc_local);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ make_ct_config(&ct_msc, 8);</span><br><span style="color: hsl(120, 100%, 40%);">+ make_scl_config(&scl_ms, 8);</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < N_CONFIG_VARIANTS; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+ make_msc_config(&msc_local, 8);</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = test_match_codec_pref(&ct_msc, &scl_ms, &msc_local);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(rc == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ free_msc_config(&msc_local);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Some mixed configurations that are supposed to work */</span><br><span style="color: hsl(120, 100%, 40%);">+static void test_selected_working(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm0808_channel_type ct_msc;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm0808_speech_codec_list scl_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct bsc_msc_data msc_local;</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("============== test_selected_working ==============\n\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ init_msc_config(&msc_local);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ make_scl_config(&scl_ms, 6);</span><br><span style="color: hsl(120, 100%, 40%);">+ make_ct_config(&ct_msc, 5);</span><br><span style="color: hsl(120, 100%, 40%);">+ make_msc_config(&msc_local, 7);</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = test_match_codec_pref(&ct_msc, &scl_ms, &msc_local);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(rc == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ make_scl_config(&scl_ms, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ make_ct_config(&ct_msc, 5);</span><br><span style="color: hsl(120, 100%, 40%);">+ make_msc_config(&msc_local, 7);</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = test_match_codec_pref(&ct_msc, &scl_ms, &msc_local);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(rc == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ make_scl_config(&scl_ms, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+ make_ct_config(&ct_msc, 5);</span><br><span style="color: hsl(120, 100%, 40%);">+ make_msc_config(&msc_local, 6);</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = test_match_codec_pref(&ct_msc, &scl_ms, &msc_local);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(rc == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ free_msc_config(&msc_local);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Some mixed configurations that can not work */</span><br><span style="color: hsl(120, 100%, 40%);">+static void test_selected_non_working(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm0808_channel_type ct_msc;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm0808_speech_codec_list scl_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct bsc_msc_data msc_local;</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("============== test_selected_non_working ==============\n\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ init_msc_config(&msc_local);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ make_scl_config(&scl_ms, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+ make_ct_config(&ct_msc, 5);</span><br><span style="color: hsl(120, 100%, 40%);">+ make_msc_config(&msc_local, 7);</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = test_match_codec_pref(&ct_msc, &scl_ms, &msc_local);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(rc == -1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ make_scl_config(&scl_ms, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+ make_ct_config(&ct_msc, 5);</span><br><span style="color: hsl(120, 100%, 40%);">+ make_msc_config(&msc_local, 7);</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = test_match_codec_pref(&ct_msc, &scl_ms, &msc_local);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(rc == -1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ make_scl_config(&scl_ms, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+ make_ct_config(&ct_msc, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+ make_msc_config(&msc_local, 6);</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = test_match_codec_pref(&ct_msc, &scl_ms, &msc_local);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(rc == -1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ free_msc_config(&msc_local);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static const struct log_info_cat log_categories[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ [DMSC] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "DMSC",</span><br><span style="color: hsl(120, 100%, 40%);">+ .description = "Mobile Switching Center",</span><br><span style="color: hsl(120, 100%, 40%);">+ .enabled = 1,.loglevel = LOGL_NOTICE,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static const struct log_info log_info = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .cat = log_categories,</span><br><span style="color: hsl(120, 100%, 40%);">+ .num_cat = ARRAY_SIZE(log_categories),</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int main(int argc, char **argv)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ ctx = talloc_named_const(NULL, 0, "codec_pref_test");</span><br><span style="color: hsl(120, 100%, 40%);">+ msgb_talloc_ctx_init(ctx, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_init_logging2(ctx, &log_info);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ test_one_to_one();</span><br><span style="color: hsl(120, 100%, 40%);">+ test_ms();</span><br><span style="color: hsl(120, 100%, 40%);">+ test_ct();</span><br><span style="color: hsl(120, 100%, 40%);">+ test_msc();</span><br><span style="color: hsl(120, 100%, 40%);">+ test_selected_working();</span><br><span style="color: hsl(120, 100%, 40%);">+ test_selected_non_working();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("Testing execution completed.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ talloc_free(ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/tests/codec_pref/codec_pref_test.ok b/tests/codec_pref/codec_pref_test.ok</span><br><span>new file mode 100644</span><br><span>index 0000000..f97fbb1</span><br><span>--- /dev/null</span><br><span>+++ b/tests/codec_pref/codec_pref_test.ok</span><br><span>@@ -0,0 +1,707 @@</span><br><span style="color: hsl(120, 100%, 40%);">+============== test_one_to_one ==============</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (1 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (1 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (1 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=1, chan_mode=SPEECH_V1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (1 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (1 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (1 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=0, chan_mode=SPEECH_V1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (1 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (1 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (1 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=1, chan_mode=SPEECH_EFR</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (1 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (1 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (1 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=1, chan_mode=SPEECH_AMR</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (1 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (1 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (1 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=0, chan_mode=SPEECH_AMR</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (2 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[1]->type=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (2 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[1]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (2 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[1]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=1, chan_mode=SPEECH_V1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (3 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[1]->type=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[2]->type=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (3 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[2]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (3 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[2]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=1, chan_mode=SPEECH_V1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (3 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[1]->type=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[2]->type=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (3 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[1]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[2]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (3 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[1]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[2]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=1, chan_mode=SPEECH_V1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[1]->type=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[2]->type=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[3]->type=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[4]->type=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=1, chan_mode=SPEECH_V1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+============== test_ms ==============</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (1 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=1, chan_mode=SPEECH_V1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (1 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=0, chan_mode=SPEECH_V1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (1 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=1, chan_mode=SPEECH_EFR</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (1 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=1, chan_mode=SPEECH_AMR</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (1 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=0, chan_mode=SPEECH_AMR</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (2 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[1]->type=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=1, chan_mode=SPEECH_V1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (3 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[1]->type=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[2]->type=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=1, chan_mode=SPEECH_V1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (3 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[1]->type=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[2]->type=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=1, chan_mode=SPEECH_V1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[1]->type=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[2]->type=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[3]->type=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[4]->type=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=1, chan_mode=SPEECH_V1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+============== test_ct ==============</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[1]->type=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[2]->type=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[3]->type=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[4]->type=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (1 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=1, chan_mode=SPEECH_V1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[1]->type=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[2]->type=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[3]->type=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[4]->type=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (1 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=0, chan_mode=SPEECH_V1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[1]->type=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[2]->type=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[3]->type=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[4]->type=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (1 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=1, chan_mode=SPEECH_EFR</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[1]->type=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[2]->type=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[3]->type=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[4]->type=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (1 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=1, chan_mode=SPEECH_AMR</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[1]->type=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[2]->type=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[3]->type=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[4]->type=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (1 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=0, chan_mode=SPEECH_AMR</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[1]->type=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[2]->type=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[3]->type=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[4]->type=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (2 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[1]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=1, chan_mode=SPEECH_V1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[1]->type=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[2]->type=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[3]->type=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[4]->type=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (3 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[2]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=1, chan_mode=SPEECH_V1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[1]->type=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[2]->type=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[3]->type=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[4]->type=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (3 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[1]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[2]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=1, chan_mode=SPEECH_V1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[1]->type=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[2]->type=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[3]->type=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[4]->type=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=1, chan_mode=SPEECH_V1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+============== test_msc ==============</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[1]->type=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[2]->type=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[3]->type=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[4]->type=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=1, chan_mode=SPEECH_V1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[1]->type=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[2]->type=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[3]->type=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[4]->type=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=1, chan_mode=SPEECH_V1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[1]->type=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[2]->type=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[3]->type=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[4]->type=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=1, chan_mode=SPEECH_V1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[1]->type=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[2]->type=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[3]->type=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[4]->type=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=1, chan_mode=SPEECH_V1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[1]->type=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[2]->type=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[3]->type=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[4]->type=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=1, chan_mode=SPEECH_V1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[1]->type=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[2]->type=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[3]->type=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[4]->type=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=1, chan_mode=SPEECH_V1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[1]->type=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[2]->type=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[3]->type=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[4]->type=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=1, chan_mode=SPEECH_V1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[1]->type=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[2]->type=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[3]->type=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[4]->type=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=1, chan_mode=SPEECH_V1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[1]->type=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[2]->type=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[3]->type=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[4]->type=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (5 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[2]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[3]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[4]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=1, chan_mode=SPEECH_V1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+============== test_selected_working ==============</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (3 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[1]->type=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[2]->type=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (2 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[1]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (3 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[1]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[2]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=1, chan_mode=SPEECH_V1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (1 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (2 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[1]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (3 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[1]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[2]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=1, chan_mode=SPEECH_V1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (1 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (2 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[1]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (3 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[2]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=0, full_rate=0, chan_mode=SPEECH_V1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+============== test_selected_non_working ==============</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (1 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (2 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[1]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (3 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[1]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[2]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=-1, full_rate=-1, chan_mode=SIGNALLING</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (1 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (2 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[1]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (3 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[1]=FR3</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[2]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=-1, full_rate=-1, chan_mode=SIGNALLING</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Determining channel mode and rate:</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS: speech codec list (1 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ codec[0]->type=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ * MSC: channel type permitted speech (1 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch[0]=HR3</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSS: audio support settings (3 items):</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[0]=FR1</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[1]=FR2</span><br><span style="color: hsl(120, 100%, 40%);">+ audio_support[2]=HR1</span><br><span style="color: hsl(120, 100%, 40%);">+ * result: rc=-1, full_rate=-1, chan_mode=SIGNALLING</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Testing execution completed.</span><br><span>diff --git a/tests/testsuite.at b/tests/testsuite.at</span><br><span>index 515ffa0..f384655 100644</span><br><span>--- a/tests/testsuite.at</span><br><span>+++ b/tests/testsuite.at</span><br><span>@@ -26,6 +26,12 @@</span><br><span> AT_CHECK([$abs_top_builddir/tests/bsc/bsc_test], [], [expout], [ignore])</span><br><span> AT_CLEANUP</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+AT_SETUP([codec_pref])</span><br><span style="color: hsl(120, 100%, 40%);">+AT_KEYWORDS([codec_pref])</span><br><span style="color: hsl(120, 100%, 40%);">+cat $abs_srcdir/codec_pref/codec_pref_test.ok > expout</span><br><span style="color: hsl(120, 100%, 40%);">+AT_CHECK([$abs_top_builddir/tests/codec_pref/codec_pref_test], [], [expout], [ignore])</span><br><span style="color: hsl(120, 100%, 40%);">+AT_CLEANUP</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> AT_SETUP([nanobts_omlattr])</span><br><span> AT_KEYWORDS([nanobts_omlattr])</span><br><span> cat $abs_srcdir/nanobts_omlattr/nanobts_omlattr_test.ok > expout</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/10010">change 10010</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/10010"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: osmo-bsc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: Iabedfdcec8b99a319f2d57cbea45c5e36c7b6e29 </div>
<div style="display:none"> Gerrit-Change-Number: 10010 </div>
<div style="display:none"> Gerrit-PatchSet: 11 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>