]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
say.c: Honor requests for DTMF interruption.
authorSean Bright <sean.bright@gmail.com>
Thu, 23 Dec 2021 21:57:59 +0000 (16:57 -0500)
committerFriendly Automation <jenkins2@gerrit.asterisk.org>
Wed, 5 Jan 2022 13:56:32 +0000 (07:56 -0600)
SayAlpha, SayAlphaCase, SayDigits, SayMoney, SayNumber, SayOrdinal,
and SayPhonetic all claim to allow DTMF interruption if the
SAY_DTMF_INTERRUPT channel variable is set to a truthy value, but we
are failing to break out of a given 'say' application if DTMF actually
occurs.

ASTERISK-29816 #close

Change-Id: I6a96e0130560831d2cb45164919862b9bcb6287e

main/pbx_builtins.c
main/say.c

index eae4c6ba8f21f86fedf480b0f90c385f2a6e35ce..54fe4ff92a88fdc7c972ca938044fef3f9fe93b2 100644 (file)
@@ -1323,6 +1323,28 @@ static int pbx_builtin_gotoif(struct ast_channel *chan, const char *data)
        return pbx_builtin_goto(chan, branch);
 }
 
+/*!
+ * \brief Determine if DTMF interruption was requested.
+ *
+ * If the SAY_DTMF_INTERRUPT channel variable is truthy, the caller has
+ * requested DTMF interruption be enabled.
+ *
+ * \param chan the channel to examine
+ *
+ * \retval -1 if DTMF interruption was requested
+ * \retval  0 if DTMF interruption was not requested
+ */
+static int permit_dtmf_interrupt(struct ast_channel *chan)
+{
+       int interrupt;
+
+       ast_channel_lock(chan);
+       interrupt = ast_true(pbx_builtin_getvar_helper(chan, "SAY_DTMF_INTERRUPT"));
+       ast_channel_unlock(chan);
+
+       return interrupt;
+}
+
 static int pbx_builtin_saynumber(struct ast_channel *chan, const char *data)
 {
        char tmp[256];
@@ -1330,15 +1352,7 @@ static int pbx_builtin_saynumber(struct ast_channel *chan, const char *data)
        int number_val;
        char *options;
        int res;
-       int interrupt = 0;
-       const char *interrupt_string;
-
-       ast_channel_lock(chan);
-       interrupt_string = pbx_builtin_getvar_helper(chan, "SAY_DTMF_INTERRUPT");
-       if (ast_true(interrupt_string)) {
-               interrupt = 1;
-       }
-       ast_channel_unlock(chan);
+       int interrupt = permit_dtmf_interrupt(chan);
 
        if (ast_strlen_zero(data)) {
                ast_log(LOG_WARNING, "SayNumber requires an argument (number)\n");
@@ -1377,15 +1391,7 @@ static int pbx_builtin_sayordinal(struct ast_channel *chan, const char *data)
        int number_val;
        char *options;
        int res;
-       int interrupt = 0;
-       const char *interrupt_string;
-
-       ast_channel_lock(chan);
-       interrupt_string = pbx_builtin_getvar_helper(chan, "SAY_DTMF_INTERRUPT");
-       if (ast_true(interrupt_string)) {
-               interrupt = 1;
-       }
-       ast_channel_unlock(chan);
+       int interrupt = permit_dtmf_interrupt(chan);
 
        if (ast_strlen_zero(data)) {
                ast_log(LOG_WARNING, "SayOrdinal requires an argument (number)\n");
@@ -1420,18 +1426,9 @@ static int pbx_builtin_sayordinal(struct ast_channel *chan, const char *data)
 static int pbx_builtin_saydigits(struct ast_channel *chan, const char *data)
 {
        int res = 0;
-       int interrupt = 0;
-       const char *interrupt_string;
-
-       ast_channel_lock(chan);
-       interrupt_string = pbx_builtin_getvar_helper(chan, "SAY_DTMF_INTERRUPT");
-       if (ast_true(interrupt_string)) {
-               interrupt = 1;
-       }
-       ast_channel_unlock(chan);
 
        if (data) {
-               res = ast_say_digit_str(chan, data, interrupt ? AST_DIGIT_ANY : "", ast_channel_language(chan));
+               res = ast_say_digit_str(chan, data, permit_dtmf_interrupt(chan) ? AST_DIGIT_ANY : "", ast_channel_language(chan));
        }
 
        return res;
@@ -1440,18 +1437,9 @@ static int pbx_builtin_saydigits(struct ast_channel *chan, const char *data)
 static int pbx_builtin_saymoney(struct ast_channel *chan, const char *data)
 {
        int res = 0;
-       int interrupt = 0;
-       const char *interrupt_string;
-
-       ast_channel_lock(chan);
-       interrupt_string = pbx_builtin_getvar_helper(chan, "SAY_DTMF_INTERRUPT");
-       if (ast_true(interrupt_string)) {
-               interrupt = 1;
-       }
-       ast_channel_unlock(chan);
 
        if (data) {
-               res = ast_say_money_str(chan, data, interrupt ? AST_DIGIT_ANY : "", ast_channel_language(chan));
+               res = ast_say_money_str(chan, data, permit_dtmf_interrupt(chan) ? AST_DIGIT_ANY : "", ast_channel_language(chan));
        }
 
        return res;
@@ -1462,21 +1450,12 @@ static int pbx_builtin_saycharacters_case(struct ast_channel *chan, const char *
        int res = 0;
        int sensitivity = 0;
        char *parse;
-       int interrupt = 0;
-       const char *interrupt_string;
 
        AST_DECLARE_APP_ARGS(args,
                AST_APP_ARG(options);
                AST_APP_ARG(characters);
        );
 
-       ast_channel_lock(chan);
-       interrupt_string = pbx_builtin_getvar_helper(chan, "SAY_DTMF_INTERRUPT");
-       if (ast_true(interrupt_string)) {
-               interrupt = 1;
-       }
-       ast_channel_unlock(chan);
-
        if (ast_strlen_zero(data)) {
                ast_log(LOG_WARNING, "SayAlphaCase requires two arguments (options, characters)\n");
                return 0;
@@ -1508,7 +1487,7 @@ static int pbx_builtin_saycharacters_case(struct ast_channel *chan, const char *
                return 0;
        }
 
-       res = ast_say_character_str(chan, args.characters, interrupt ? AST_DIGIT_ANY : "", ast_channel_language(chan), sensitivity);
+       res = ast_say_character_str(chan, args.characters, permit_dtmf_interrupt(chan) ? AST_DIGIT_ANY : "", ast_channel_language(chan), sensitivity);
 
        return res;
 }
@@ -1516,18 +1495,9 @@ static int pbx_builtin_saycharacters_case(struct ast_channel *chan, const char *
 static int pbx_builtin_saycharacters(struct ast_channel *chan, const char *data)
 {
        int res = 0;
-       int interrupt = 0;
-       const char *interrupt_string;
-
-       ast_channel_lock(chan);
-       interrupt_string = pbx_builtin_getvar_helper(chan, "SAY_DTMF_INTERRUPT");
-       if (ast_true(interrupt_string)) {
-               interrupt = 1;
-       }
-       ast_channel_unlock(chan);
 
        if (data) {
-               res = ast_say_character_str(chan, data, interrupt ? AST_DIGIT_ANY : "", ast_channel_language(chan), AST_SAY_CASE_NONE);
+               res = ast_say_character_str(chan, data, permit_dtmf_interrupt(chan) ? AST_DIGIT_ANY : "", ast_channel_language(chan), AST_SAY_CASE_NONE);
        }
 
        return res;
@@ -1536,18 +1506,11 @@ static int pbx_builtin_saycharacters(struct ast_channel *chan, const char *data)
 static int pbx_builtin_sayphonetic(struct ast_channel *chan, const char *data)
 {
        int res = 0;
-       int interrupt = 0;
-       const char *interrupt_string;
 
-       ast_channel_lock(chan);
-       interrupt_string = pbx_builtin_getvar_helper(chan, "SAY_DTMF_INTERRUPT");
-       if (ast_true(interrupt_string)) {
-               interrupt = 1;
+       if (data) {
+               res = ast_say_phonetic_str(chan, data, permit_dtmf_interrupt(chan) ? AST_DIGIT_ANY : "", ast_channel_language(chan));
        }
-       ast_channel_unlock(chan);
 
-       if (data)
-               res = ast_say_phonetic_str(chan, data, interrupt ? AST_DIGIT_ANY : "", ast_channel_language(chan));
        return res;
 }
 
index bb0c0a6b361710acab490c93fdde06696d9e0b4d..54aefe0df10fa4c945c358a3b231b57ca7905abd 100644 (file)
@@ -189,6 +189,13 @@ static int say_filenames(struct ast_channel *chan, const char *ints, const char
                                res = ast_waitstream_full(chan, ints, audiofd, ctrlfd);
                        else
                                res = ast_waitstream(chan, ints);
+
+                       if (res > 0) {
+                               /* We were interrupted by a digit */
+                               ast_stopstream(chan);
+                               ast_free(filenames);
+                               return res;
+                       }
                }
                ast_stopstream(chan);
        }