aboutsummaryrefslogtreecommitdiffstats
path: root/main
diff options
context:
space:
mode:
authortilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2010-07-20 20:59:06 +0000
committertilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2010-07-20 20:59:06 +0000
commit3674ae02ec50cfda8e90bb6cbfcbda3806398e5c (patch)
tree22e071f64a8e76deb0ba7f9469d0b4116e0a2b70 /main
parent67f990dc2fac8834c0a5fef5276ed39327d7db48 (diff)
Do not queue up DTMF frames while a call is on hold.
(Fixes ABE-2110) git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@278167 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main')
-rw-r--r--main/autoservice.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/main/autoservice.c b/main/autoservice.c
index e5f183735..ffca734ca 100644
--- a/main/autoservice.c
+++ b/main/autoservice.c
@@ -61,6 +61,7 @@ struct asent {
* it gets stopped for the last time. */
unsigned int use_count;
unsigned int orig_end_dtmf_flag:1;
+ unsigned int ignore_frame_types;
/*! Frames go on at the head of deferred_frames, so we have the frames
* from newest to oldest. As we put them at the head of the readq, we'll
* end up with them in the right order for the channel's readq. */
@@ -292,7 +293,9 @@ int ast_autoservice_stop(struct ast_channel *chan)
ast_channel_lock(chan);
while ((f = AST_LIST_REMOVE_HEAD(&as->deferred_frames, frame_list))) {
- ast_queue_frame_head(chan, f);
+ if (!((1 << f->frametype) & as->ignore_frame_types)) {
+ ast_queue_frame_head(chan, f);
+ }
ast_frfree(f);
}
ast_channel_unlock(chan);
@@ -302,6 +305,23 @@ int ast_autoservice_stop(struct ast_channel *chan)
return res;
}
+int ast_autoservice_ignore(struct ast_channel *chan, enum ast_frame_type ftype)
+{
+ struct asent *as;
+ int res = -1;
+
+ AST_LIST_LOCK(&aslist);
+ AST_LIST_TRAVERSE(&aslist, as, list) {
+ if (as->chan == chan) {
+ res = 0;
+ as->ignore_frame_types |= (1 << ftype);
+ break;
+ }
+ }
+ AST_LIST_UNLOCK(&aslist);
+ return res;
+}
+
void ast_autoservice_init(void)
{
ast_cond_init(&as_cond, NULL);