<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>