diff --git a/apps/app_externalivr.c b/apps/app_externalivr.c index 036bbeeefe3398191e603d6e4bd5344a2701c61c..07fbcba012d38d994da9452dd6f939fd11e2f0b8 100644 --- a/apps/app_externalivr.c +++ b/apps/app_externalivr.c @@ -105,6 +105,7 @@ static const char app[] = "ExternalIVR"; #define EIVR_CMD_EXIT 'E' /* exit */ #define EIVR_CMD_GET 'G' /* get channel varable(s) */ #define EIVR_CMD_HGUP 'H' /* hangup */ +#define EIVR_CMD_IRPT 'I' /* interrupt */ #define EIVR_CMD_LOG 'L' /* log message */ #define EIVR_CMD_OPT 'O' /* option */ #define EIVR_CMD_PARM 'P' /* return supplied params */ @@ -761,6 +762,28 @@ static int eivr_comm(struct ast_channel *chan, struct ivr_localuser *u, u->gen_active = 1; } } + } else if (input[0] == EIVR_CMD_IRPT) { + if (ast_channel_state(chan) != AST_STATE_UP || ast_check_hangup(chan)) { + ast_chan_log(LOG_WARNING, chan, "Queue 'I'nterrupt called on unanswered channel\n"); + send_eivr_event(eivr_events, 'Z', NULL, chan); + continue; + } + AST_LIST_LOCK(&u->playlist); + if (!u->abort_current_sound && !u->playing_silence) { + /* send interrupted file as T data */ + if ((entry = AST_LIST_REMOVE_HEAD(&u->playlist, list))) { + send_eivr_event(eivr_events, 'T', entry->filename, chan); + ast_free(entry); + } + } + while ((entry = AST_LIST_REMOVE_HEAD(&u->playlist, list))) { + send_eivr_event(eivr_events, 'D', entry->filename, chan); + ast_free(entry); + } + if (!u->playing_silence) { + u->abort_current_sound = 1; + } + AST_LIST_UNLOCK(&u->playlist); } else if (input[0] == EIVR_CMD_SQUE) { if (ast_channel_state(chan) != AST_STATE_UP || ast_check_hangup(chan)) { ast_chan_log(LOG_WARNING, chan, "Queue re'S'et called on unanswered channel\n");