mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-03 19:16:46 +00:00
say.c: Honor requests for DTMF interruption.
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
(cherry picked from commit 4fe94bab09
)
This commit is contained in:
@@ -1323,6 +1323,28 @@ static int pbx_builtin_gotoif(struct ast_channel *chan, const char *data)
|
|||||||
return pbx_builtin_goto(chan, branch);
|
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)
|
static int pbx_builtin_saynumber(struct ast_channel *chan, const char *data)
|
||||||
{
|
{
|
||||||
char tmp[256];
|
char tmp[256];
|
||||||
@@ -1330,15 +1352,7 @@ static int pbx_builtin_saynumber(struct ast_channel *chan, const char *data)
|
|||||||
int number_val;
|
int number_val;
|
||||||
char *options;
|
char *options;
|
||||||
int res;
|
int res;
|
||||||
int interrupt = 0;
|
int interrupt = permit_dtmf_interrupt(chan);
|
||||||
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 (ast_strlen_zero(data)) {
|
if (ast_strlen_zero(data)) {
|
||||||
ast_log(LOG_WARNING, "SayNumber requires an argument (number)\n");
|
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;
|
int number_val;
|
||||||
char *options;
|
char *options;
|
||||||
int res;
|
int res;
|
||||||
int interrupt = 0;
|
int interrupt = permit_dtmf_interrupt(chan);
|
||||||
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 (ast_strlen_zero(data)) {
|
if (ast_strlen_zero(data)) {
|
||||||
ast_log(LOG_WARNING, "SayOrdinal requires an argument (number)\n");
|
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)
|
static int pbx_builtin_saydigits(struct ast_channel *chan, const char *data)
|
||||||
{
|
{
|
||||||
int res = 0;
|
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) {
|
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;
|
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)
|
static int pbx_builtin_saymoney(struct ast_channel *chan, const char *data)
|
||||||
{
|
{
|
||||||
int res = 0;
|
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) {
|
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;
|
return res;
|
||||||
@@ -1462,21 +1450,12 @@ static int pbx_builtin_saycharacters_case(struct ast_channel *chan, const char *
|
|||||||
int res = 0;
|
int res = 0;
|
||||||
int sensitivity = 0;
|
int sensitivity = 0;
|
||||||
char *parse;
|
char *parse;
|
||||||
int interrupt = 0;
|
|
||||||
const char *interrupt_string;
|
|
||||||
|
|
||||||
AST_DECLARE_APP_ARGS(args,
|
AST_DECLARE_APP_ARGS(args,
|
||||||
AST_APP_ARG(options);
|
AST_APP_ARG(options);
|
||||||
AST_APP_ARG(characters);
|
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)) {
|
if (ast_strlen_zero(data)) {
|
||||||
ast_log(LOG_WARNING, "SayAlphaCase requires two arguments (options, characters)\n");
|
ast_log(LOG_WARNING, "SayAlphaCase requires two arguments (options, characters)\n");
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1508,7 +1487,7 @@ static int pbx_builtin_saycharacters_case(struct ast_channel *chan, const char *
|
|||||||
return 0;
|
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;
|
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)
|
static int pbx_builtin_saycharacters(struct ast_channel *chan, const char *data)
|
||||||
{
|
{
|
||||||
int res = 0;
|
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) {
|
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;
|
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)
|
static int pbx_builtin_sayphonetic(struct ast_channel *chan, const char *data)
|
||||||
{
|
{
|
||||||
int res = 0;
|
int res = 0;
|
||||||
int interrupt = 0;
|
|
||||||
const char *interrupt_string;
|
|
||||||
|
|
||||||
ast_channel_lock(chan);
|
if (data) {
|
||||||
interrupt_string = pbx_builtin_getvar_helper(chan, "SAY_DTMF_INTERRUPT");
|
res = ast_say_phonetic_str(chan, data, permit_dtmf_interrupt(chan) ? AST_DIGIT_ANY : "", ast_channel_language(chan));
|
||||||
if (ast_true(interrupt_string)) {
|
|
||||||
interrupt = 1;
|
|
||||||
}
|
}
|
||||||
ast_channel_unlock(chan);
|
|
||||||
|
|
||||||
if (data)
|
|
||||||
res = ast_say_phonetic_str(chan, data, interrupt ? AST_DIGIT_ANY : "", ast_channel_language(chan));
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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);
|
res = ast_waitstream_full(chan, ints, audiofd, ctrlfd);
|
||||||
else
|
else
|
||||||
res = ast_waitstream(chan, ints);
|
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);
|
ast_stopstream(chan);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user