app_senddtmf: Add option to answer target channel.

Adds a new option to SendDTMF() which will answer the specified
channel if it is not already up. If no channel is specified, the
current channel will be answered instead.

ASTERISK-30422

Change-Id: Iddcbd501fcdf9fef0f453b7a8115a90b11f1d085
This commit is contained in:
Mike Bradeen
2023-02-06 08:54:56 -07:00
committed by Sean Bright
parent 603675f285
commit f015d3e0cc
2 changed files with 36 additions and 0 deletions

View File

@@ -57,6 +57,15 @@
<parameter name="channel" required="false">
<para>Channel where digits will be played</para>
</parameter>
<parameter name="options">
<optionlist>
<option name="a">
<para>Answer the channel specified by the <literal>channel</literal>
parameter if it is not already up. If no <literal>channel</literal>
parameter is provided, the current channel will be answered.</para>
</option>
</optionlist>
</parameter>
</syntax>
<description>
<para>It will send all digits or terminate if it encounters an error.</para>
@@ -90,6 +99,19 @@
</manager>
***/
enum read_option_flags {
OPT_ANSWER = (1 << 0),
};
AST_APP_OPTIONS(senddtmf_app_options, {
AST_APP_OPTION('a', OPT_ANSWER),
});
enum {
/* note: this entry _MUST_ be the last one in the enum */
OPT_ARG_ARRAY_SIZE,
};
static const char senddtmf_name[] = "SendDTMF";
static int senddtmf_exec(struct ast_channel *chan, const char *vdata)
@@ -100,11 +122,14 @@ static int senddtmf_exec(struct ast_channel *chan, const char *vdata)
struct ast_channel *chan_found = NULL;
struct ast_channel *chan_dest = chan;
struct ast_channel *chan_autoservice = NULL;
char *opt_args[OPT_ARG_ARRAY_SIZE];
struct ast_flags flags = {0};
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(digits);
AST_APP_ARG(dinterval);
AST_APP_ARG(duration);
AST_APP_ARG(channel);
AST_APP_ARG(options);
);
if (ast_strlen_zero(vdata)) {
@@ -136,6 +161,12 @@ static int senddtmf_exec(struct ast_channel *chan, const char *vdata)
chan_autoservice = chan;
}
}
if (!ast_strlen_zero(args.options)) {
ast_app_parse_options(senddtmf_app_options, &flags, opt_args, args.options);
}
if (ast_test_flag(&flags, OPT_ANSWER)) {
ast_auto_answer(chan_dest);
}
res = ast_dtmf_stream(chan_dest, chan_autoservice, args.digits,
dinterval <= 0 ? 250 : dinterval, duration);
if (chan_found) {