[asterisk-commits] seanbright: trunk r365751 - /trunk/apps/app_externalivr.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Tue May 8 16:46:25 CDT 2012


Author: seanbright
Date: Tue May  8 16:46:21 2012
New Revision: 365751

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=365751
Log:
Add interrupt ('I') command to ExternalIVR.

Sending the 'I' command from an external process will cause the current playlist
to be cleared, including stopping any audio file that is currently playing.  This
is useful when you want to interrupt audio playback only when specific DTMF is
entered by the caller.

Modified:
    trunk/apps/app_externalivr.c

Modified: trunk/apps/app_externalivr.c
URL: http://svnview.digium.com/svn/asterisk/trunk/apps/app_externalivr.c?view=diff&rev=365751&r1=365750&r2=365751
==============================================================================
--- trunk/apps/app_externalivr.c (original)
+++ trunk/apps/app_externalivr.c Tue May  8 16:46:21 2012
@@ -105,6 +105,7 @@
 #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 @@
 						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");




More information about the asterisk-commits mailing list