[asterisk-commits] mnicholson: branch 1.4 r227827 - /branches/1.4/apps/app_dial.c
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Wed Nov 4 14:52:33 CST 2009
Author: mnicholson
Date: Wed Nov 4 14:52:27 2009
New Revision: 227827
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=227827
Log:
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.4/apps/app_dial.c
Modified: branches/1.4/apps/app_dial.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.4/apps/app_dial.c?view=diff&rev=227827&r1=227826&r2=227827
==============================================================================
--- branches/1.4/apps/app_dial.c (original)
+++ branches/1.4/apps/app_dial.c Wed Nov 4 14:52:27 2009
@@ -1638,21 +1638,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);
- 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);
+ }
+ 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_flag(&opts, OPT_GOTO) && !ast_strlen_zero(opt_args[OPT_ARG_GOTO])) {
More information about the asterisk-commits
mailing list