diff --git a/conf/testing/autoload_configs/opus.conf.xml b/conf/testing/autoload_configs/opus.conf.xml
index e187a0a6c5..1154797dce 100644
--- a/conf/testing/autoload_configs/opus.conf.xml
+++ b/conf/testing/autoload_configs/opus.conf.xml
@@ -6,6 +6,7 @@
-
+
+
diff --git a/conf/vanilla/autoload_configs/opus.conf.xml b/conf/vanilla/autoload_configs/opus.conf.xml
index 94aaede471..8494c2d3c7 100644
--- a/conf/vanilla/autoload_configs/opus.conf.xml
+++ b/conf/vanilla/autoload_configs/opus.conf.xml
@@ -28,6 +28,8 @@
-
+
+
+
diff --git a/src/mod/codecs/mod_opus/mod_opus.c b/src/mod/codecs/mod_opus/mod_opus.c
index 2081ef1b88..a90aba346a 100644
--- a/src/mod/codecs/mod_opus/mod_opus.c
+++ b/src/mod/codecs/mod_opus/mod_opus.c
@@ -160,6 +160,7 @@ struct {
int debuginfo;
uint32_t use_jb_lookahead;
switch_mutex_t *mutex;
+ int mono;
} opus_prefs;
static struct {
@@ -283,7 +284,7 @@ static switch_status_t switch_opus_fmtp_parse(const char *fmtp, switch_codec_fmt
}
if (!strcasecmp(data, "stereo")) {
- codec_settings->stereo = atoi(arg);
+ codec_settings->stereo = opus_prefs.mono ? 0 : atoi(arg);
codec_fmtp->stereo = codec_settings->stereo;
}
@@ -563,6 +564,11 @@ static switch_status_t switch_opus_init(switch_codec_t *codec, switch_codec_flag
opus_codec_settings.usedtx = opus_prefs.use_dtx;
+ if (opus_prefs.mono) {
+ opus_codec_settings.stereo = 0;
+ opus_codec_settings.sprop_stereo = 0;
+ }
+
codec->fmtp_out = gen_fmtp(&opus_codec_settings, codec->memory_pool);
if (encoding) {
@@ -1080,6 +1086,8 @@ static switch_status_t opus_load_config(switch_bool_t reload)
if (!switch_opus_acceptable_rate(opus_prefs.sprop_maxcapturerate)) {
opus_prefs.sprop_maxcapturerate = 0; /* value not supported */
}
+ } else if (!strcasecmp(key, "mono")) {
+ opus_prefs.mono = atoi(val);
}
}
}
diff --git a/src/switch_core_media.c b/src/switch_core_media.c
index ac8b9b9f71..686bc344f7 100644
--- a/src/switch_core_media.c
+++ b/src/switch_core_media.c
@@ -5774,7 +5774,13 @@ SWITCH_DECLARE(uint8_t) switch_core_media_negotiate_sdp(switch_core_session_t *s
pmap->adv_channels = 2; /* IKR ???*/
}
if (!zstr((char *) mmap->rm_fmtp) && switch_stristr("stereo=1", (char *) mmap->rm_fmtp)) {
- pmap->channels = 2;
+ uint32_t allow_channels = switch_core_max_audio_channels(0);
+ if (!allow_channels || allow_channels >= 2) { /*default*/
+ pmap->channels = 2;
+ } else { /* allow_channels == 1 */
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Opus: setting 1 audio channel via config.\n");
+ pmap->channels = 1;
+ }
} else {
pmap->channels = 1;
}