res_musiconhold: Add option to not play music on hold on unanswered channels

This change adds an option, answeredonly, that will prevent music on
hold on channels that are not answered.

ASTERISK-30135

Change-Id: I1ab0defa43a29a26ae39f94c623596cf90fddc08
This commit is contained in:
sungtae kim 2022-08-14 01:32:06 +09:00 committed by Friendly Automation
parent 94731d815a
commit bdf8ef8882
3 changed files with 16 additions and 0 deletions

View 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

View File

@ -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.

View 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")) {
/*