diff --git a/configs/samples/musiconhold.conf.sample b/configs/samples/musiconhold.conf.sample index 2f601086b0..1737c7a170 100644 --- a/configs/samples/musiconhold.conf.sample +++ b/configs/samples/musiconhold.conf.sample @@ -82,6 +82,9 @@ directory=moh ; ; in alphabetical order. If 'randstart', the files are sorted ; ; in alphabetical order as well, but the first file is chosen ; ; at random. If unspecified, the sort order is undefined. +;answeredonly=yes ; Only allow answered channels to have music on hold. + ; Enabling this will prevent MOH on unanswered channels. + ; (default: "no") ;[native-alphabetical] ;mode=files diff --git a/doc/CHANGES-staging/res_musiconhold_answeredonly.txt b/doc/CHANGES-staging/res_musiconhold_answeredonly.txt new file mode 100644 index 0000000000..c335184c22 --- /dev/null +++ b/doc/CHANGES-staging/res_musiconhold_answeredonly.txt @@ -0,0 +1,4 @@ +Subject: res_musiconhold_answeredonly + +This change adds an option, answeredonly, that will prevent music +on hold on channels that are not answered. diff --git a/res/res_musiconhold.c b/res/res_musiconhold.c index 9844de0cd0..6196211265 100644 --- a/res/res_musiconhold.c +++ b/res/res_musiconhold.c @@ -193,6 +193,8 @@ struct mohclass { unsigned int delete:1; AST_LIST_HEAD_NOLOCK(, mohdata) members; AST_LIST_ENTRY(mohclass) list; + /*!< Play the moh if the channel answered */ + int answeredonly; }; struct mohdata { @@ -1193,6 +1195,8 @@ static void moh_parse_options(struct ast_variable *var, struct mohclass *mohclas ast_log(LOG_WARNING, "kill_method '%s' is invalid. Setting to 'process_group'\n", var->value); mohclass->kill_method = KILL_METHOD_PROCESS_GROUP; } + } else if (!strcasecmp(var->name, "answeredonly")) { + mohclass->answeredonly = ast_true(var->value) ? 1: 0; } } @@ -1835,6 +1839,11 @@ static int local_ast_moh_start(struct ast_channel *chan, const char *mclass, con return -1; } + if (mohclass->answeredonly && (ast_channel_state(chan) != AST_STATE_UP)) { + ast_verb(3, "The channel '%s' is not answered yet. Ignore the moh request.\n", ast_channel_name(chan)); + return -1; + } + /* If we are using a cached realtime class with files, re-scan the files */ if (!var && ast_test_flag(global_flags, MOH_CACHERTCLASSES) && mohclass->realtime && !strcasecmp(mohclass->mode, "files")) { /*