]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
app_senddtmf: Add option to answer target channel.
authorMike Bradeen <mbradeen@sangoma.com>
Mon, 6 Feb 2023 15:54:56 +0000 (08:54 -0700)
committerSean Bright <sean@seanbright.com>
Tue, 21 Feb 2023 13:11:23 +0000 (07:11 -0600)
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
doc/CHANGES-staging/app_senddtmf_answer.txt [new file with mode: 0644]

index ea75a9e5fb821bced7fc6d5f27c8a567c08116c6..c119d8c477ede20e95ff3d606a2d2497b3d38345 100644 (file)
                        <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>
        </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 (file)
index 0000000..76811e3
--- /dev/null
@@ -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.