[asterisk-commits] mnicholson: branch 1.6.1 r227832 - in /branches/1.6.1: ./ apps/app_dial.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Nov 4 15:15:50 CST 2009


Author: mnicholson
Date: Wed Nov  4 15:15:46 2009
New Revision: 227832

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=227832
Log:
Merged revisions 227829 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/trunk

................
  r227829 | mnicholson | 2009-11-04 15:03:33 -0600 (Wed, 04 Nov 2009) | 17 lines
  
  Merged revisions 227827 via svnmerge from 
  https://origsvn.digium.com/svn/asterisk/branches/1.4
  
  ........
    r227827 | mnicholson | 2009-11-04 14:52:27 -0600 (Wed, 04 Nov 2009) | 10 lines
    
    This patch modifies the Dial application to monitor the calling channel for hangups while playing back announcements.
    
    (closes issue #16005)
    Reported by: falves11
    Patches:
          dial-announce-hangup-fix1.diff uploaded by mnicholson (license 96)
    Tested by: mnicholson, falves11
    
    Review: https://reviewboard.asterisk.org/r/407/
  ........
................

Modified:
    branches/1.6.1/   (props changed)
    branches/1.6.1/apps/app_dial.c

Propchange: branches/1.6.1/
------------------------------------------------------------------------------
Binary property 'trunk-merged' - no diff available.

Modified: branches/1.6.1/apps/app_dial.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.6.1/apps/app_dial.c?view=diff&rev=227832&r1=227831&r2=227832
==============================================================================
--- branches/1.6.1/apps/app_dial.c (original)
+++ branches/1.6.1/apps/app_dial.c Wed Nov  4 15:15:46 2009
@@ -1732,21 +1732,70 @@
 			res = 0;
 		} else {
 			int digit = 0;
-			/* Start autoservice on the other chan */
-			res = ast_autoservice_start(chan);
-			/* Now Stream the File */
-			if (!res)
-				res = ast_streamfile(peer, opt_args[OPT_ARG_ANNOUNCE], peer->language);
-			if (!res) {
-				digit = ast_waitstream(peer, AST_DIGIT_ANY);
-			}
-			/* Ok, done. stop autoservice */
-			res = ast_autoservice_stop(chan);
-			if (digit > 0 && !res)
-				res = ast_senddigit(chan, digit, 0);
-			else
-				res = digit;
-
+			struct ast_channel *chans[2];
+			struct ast_channel *active_chan;
+
+			chans[0] = chan;
+			chans[1] = peer;
+
+			/* we need to stream the announcment while monitoring the caller for a hangup */
+
+			/* stream the file */
+			res = ast_streamfile(peer, opt_args[OPT_ARG_ANNOUNCE], peer->language);
+			if (res) {
+				res = 0;
+				ast_log(LOG_ERROR, "error streaming file '%s' to callee\n", opt_args[OPT_ARG_ANNOUNCE]);
+			}
+
+			ast_set_flag(peer, AST_FLAG_END_DTMF_ONLY);
+			while (peer->stream) {
+				int ms;
+
+				ms = ast_sched_wait(peer->sched);
+
+				if (ms < 0 && !peer->timingfunc) {
+					ast_stopstream(peer);
+					break;
+				}
+				if (ms < 0)
+					ms = 1000;
+
+				active_chan = ast_waitfor_n(chans, 2, &ms);
+				if (active_chan) {
+					struct ast_frame *fr = ast_read(active_chan);
+					if (!fr) {
+						ast_hangup(peer);
+						res = -1;
+						goto done;
+					}
+					switch(fr->frametype) {
+						case AST_FRAME_DTMF_END:
+							digit = fr->subclass;
+							if (active_chan == peer && strchr(AST_DIGIT_ANY, res)) {
+								ast_stopstream(peer);
+								res = ast_senddigit(chan, digit, 0);
+							}
+							break;
+						case AST_FRAME_CONTROL:
+							switch (fr->subclass) {
+								case AST_CONTROL_HANGUP:
+									ast_frfree(fr);
+									ast_hangup(peer);
+									res = -1;
+									goto done;
+								default:
+									break;
+							}
+							break;
+						default:
+							/* Ignore all others */
+							break;
+					}
+					ast_frfree(fr);
+				}
+				ast_sched_runq(peer->sched);
+			}
+			ast_clear_flag(peer, AST_FLAG_END_DTMF_ONLY);
 		}
 
 		if (chan && peer && ast_test_flag64(&opts, OPT_GOTO) && !ast_strlen_zero(opt_args[OPT_ARG_GOTO])) {




More information about the asterisk-commits mailing list