diff --git a/UPGRADE.txt b/UPGRADE.txt index 3956438dcde52db16d51539dbc553a682ff00b34..df4216f695f53a3985bc3b4698937748b3f12ab4 100644 --- a/UPGRADE.txt +++ b/UPGRADE.txt @@ -20,8 +20,14 @@ === =========================================================== -From 11.2.0 to 11.2.1: +From 11.3 to 11.4: +* Added the 'n' option to MeetMe to prevent application of the DENOISE function + to a channel joining a conference. Some channel drivers that vary the number + of audio samples in a voice frame will experience significant quality problems + if a denoiser is attached to the channel; this option gives them the ability + to remove the denoiser without having to unload func_speex. +From 11.2.0 to 11.2.1: * Asterisk would previously not output certain error messages when a remote console attempted to connect to Asterisk and no instance of Asterisk was running. This error message is displayed on stderr; as a result, some diff --git a/apps/app_meetme.c b/apps/app_meetme.c index cf849b4ad0573bc34d37c9f8a70ce3cecf8e06ee..1cdf1d709c3028d194ef486a884e818947f904c0 100644 --- a/apps/app_meetme.c +++ b/apps/app_meetme.c @@ -139,6 +139,14 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") channel's currently set music class, or <literal>default</literal>.</para> <argument name="class" required="true" /> </option> + <option name="n"> + <para>Disable the denoiser. By default, if <literal>func_speex</literal> is loaded, Asterisk + will apply a denoiser to channels in the MeetMe conference. However, channel + drivers that present audio with a varying rate will experience degraded + performance with a denoiser attached. This parameter allows a channel joining + the conference to choose not to have a denoiser attached without having to + unload <literal>func_speex</literal>.</para> + </option> <option name="o"> <para>Set talker optimization - treats talkers who aren't speaking as being muted, meaning (a) No encode is done on transmission and (b) @@ -648,6 +656,8 @@ enum { #define CONFFLAG_INTROUSER_VMREC (1ULL << 33) /*! If there's only one person left in a conference when someone leaves, kill the conference */ #define CONFFLAG_KILL_LAST_MAN_STANDING ((uint64_t)1 << 34) +/*! If set, don't enable a denoiser for the channel */ +#define CONFFLAG_DONT_DENOISE (1ULL << 33) enum { OPT_ARG_WAITMARKED = 0, @@ -678,6 +688,7 @@ AST_APP_OPTIONS(meetme_opts, BEGIN_OPTIONS AST_APP_OPTION('k', CONFFLAG_KILL_LAST_MAN_STANDING ), AST_APP_OPTION_ARG('M', CONFFLAG_MOH, OPT_ARG_MOH_CLASS ), AST_APP_OPTION('m', CONFFLAG_STARTMUTED ), + AST_APP_OPTION('n', CONFFLAG_DONT_DENOISE ), AST_APP_OPTION('o', CONFFLAG_OPTIMIZETALKER ), AST_APP_OPTION('P', CONFFLAG_ALWAYSPROMPT ), AST_APP_OPTION_ARG('p', CONFFLAG_KEYEXIT, OPT_ARG_EXITKEYS ), @@ -3208,7 +3219,8 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, struc } /* Reduce background noise from each participant */ - if ((mod_speex = ast_module_helper("", "codec_speex", 0, 0, 0, 0))) { + if (!ast_test_flag64(confflags, CONFFLAG_DONT_DENOISE) && + (mod_speex = ast_module_helper("", "func_speex", 0, 0, 0, 0))) { ast_free(mod_speex); ast_func_write(chan, "DENOISE(rx)", "on"); }