From 98742388b6cade35574f14043b3a5bdb90af2939 Mon Sep 17 00:00:00 2001 From: Mike Bradeen <mbradeen@sangoma.com> Date: Mon, 6 Feb 2023 08:54:56 -0700 Subject: [PATCH] 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 --- apps/app_senddtmf.c | 31 +++++++++++++++++++++ doc/CHANGES-staging/app_senddtmf_answer.txt | 5 ++++ 2 files changed, 36 insertions(+) create mode 100644 doc/CHANGES-staging/app_senddtmf_answer.txt diff --git a/apps/app_senddtmf.c b/apps/app_senddtmf.c index ea75a9e5fb..c119d8c477 100644 --- a/apps/app_senddtmf.c +++ b/apps/app_senddtmf.c @@ -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) { diff --git a/doc/CHANGES-staging/app_senddtmf_answer.txt b/doc/CHANGES-staging/app_senddtmf_answer.txt new file mode 100644 index 0000000000..76811e3a7f --- /dev/null +++ b/doc/CHANGES-staging/app_senddtmf_answer.txt @@ -0,0 +1,5 @@ +Subject: app_senddtmf + +A new option has been added 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. -- GitLab