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