]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_musiconhold: Add option to not play music on hold on unanswered channels
authorsungtae kim <pchero21@gmail.com>
Sat, 13 Aug 2022 16:32:06 +0000 (01:32 +0900)
committerFriendly Automation <jenkins2@gerrit.asterisk.org>
Tue, 13 Sep 2022 12:17:35 +0000 (07:17 -0500)
This change adds an option, answeredonly, that will prevent music on
hold on channels that are not answered.

ASTERISK-30135

Change-Id: I1ab0defa43a29a26ae39f94c623596cf90fddc08

configs/samples/musiconhold.conf.sample
doc/CHANGES-staging/res_musiconhold_answeredonly.txt [new file with mode: 0644]
res/res_musiconhold.c

index 2f601086b096847eafbeb133520c900b238e87c0..1737c7a170caeebf1247c8fea7f54bd05eec6fb0 100644 (file)
@@ -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 (file)
index 0000000..c335184
--- /dev/null
@@ -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.
index 9844de0cd0323ab3f2ebb8b1c8a62b485a9cb50f..6196211265e67a9c72d607c420c8461d3664c189 100644 (file)
@@ -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")) {
                /*