aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormnicholson <mnicholson@f38db490-d61c-443f-a65b-d21fe96a405b>2009-11-04 21:09:14 +0000
committermnicholson <mnicholson@f38db490-d61c-443f-a65b-d21fe96a405b>2009-11-04 21:09:14 +0000
commit5af7410f487ba65b392f0fef9b99f59c944c2b5c (patch)
treeb499d5dc09e34af2693b7cccc0983ffc9f0f4425
parent8c9f3eac3cba4dde4ff82672fbeae299e4ef9ff6 (diff)
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/ ........ ................ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.2@227831 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--apps/app_dial.c75
1 files changed, 62 insertions, 13 deletions
diff --git a/apps/app_dial.c b/apps/app_dial.c
index 5c54d7e5b..51ef8bdfc 100644
--- a/apps/app_dial.c
+++ b/apps/app_dial.c
@@ -1938,21 +1938,70 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags
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);
+ 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]);
}
- /* Ok, done. stop autoservice */
- res = ast_autoservice_stop(chan);
- if (digit > 0 && !res)
- res = ast_senddigit(chan, digit, 0);
- else
- res = digit;
+ 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])) {