[asterisk-commits] tilghman: trunk r278272 - in /trunk: ./ include/asterisk/ main/
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Tue Jul 20 17:26:26 CDT 2010
Author: tilghman
Date: Tue Jul 20 17:26:23 2010
New Revision: 278272
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=278272
Log:
Merged revisions 278167 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4
........
r278167 | tilghman | 2010-07-20 15:59:06 -0500 (Tue, 20 Jul 2010) | 4 lines
Do not queue up DTMF frames while a call is on hold.
(Fixes ABE-2110)
........
Modified:
trunk/ (props changed)
trunk/include/asterisk/channel.h
trunk/main/autoservice.c
trunk/main/features.c
Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-1.4-merged' - no diff available.
Modified: trunk/include/asterisk/channel.h
URL: http://svnview.digium.com/svn/asterisk/trunk/include/asterisk/channel.h?view=diff&rev=278272&r1=278271&r2=278272
==============================================================================
--- trunk/include/asterisk/channel.h (original)
+++ trunk/include/asterisk/channel.h Tue Jul 20 17:26:23 2010
@@ -2043,6 +2043,18 @@
int ast_autoservice_stop(struct ast_channel *chan);
/*!
+ * \brief Ignore certain frame types
+ * \note Normally, we cache DTMF, IMAGE, HTML, TEXT, and CONTROL frames
+ * while a channel is in autoservice and queue them up when taken out of
+ * autoservice. When this is not desireable, this API may be used to
+ * cause the channel to ignore those frametypes after the channel is put
+ * into autoservice, but before autoservice is stopped.
+ * \retval 0 success
+ * \retval -1 channel is not in autoservice
+ */
+int ast_autoservice_ignore(struct ast_channel *chan, enum ast_frame_type ftype);
+
+/*!
* \brief Enable or disable timer ticks for a channel
*
* \param c channel
Modified: trunk/main/autoservice.c
URL: http://svnview.digium.com/svn/asterisk/trunk/main/autoservice.c?view=diff&rev=278272&r1=278271&r2=278272
==============================================================================
--- trunk/main/autoservice.c (original)
+++ trunk/main/autoservice.c Tue Jul 20 17:26:23 2010
@@ -56,6 +56,7 @@
* 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. */
@@ -286,7 +287,9 @@
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);
@@ -296,6 +299,23 @@
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);
Modified: trunk/main/features.c
URL: http://svnview.digium.com/svn/asterisk/trunk/main/features.c?view=diff&rev=278272&r1=278271&r2=278272
==============================================================================
--- trunk/main/features.c (original)
+++ trunk/main/features.c Tue Jul 20 17:26:23 2010
@@ -1321,6 +1321,7 @@
/* First play for caller, put other channel on auto service */
if (ast_autoservice_start(callee_chan))
return -1;
+ ast_autoservice_ignore(callee_chan, AST_FRAME_DTMF_END);
if (ast_stream_and_wait(caller_chan, audiofile, "")) {
ast_log(LOG_WARNING, "Failed to play automon message!\n");
ast_autoservice_stop(callee_chan);
@@ -1331,6 +1332,7 @@
/* Then play for callee, put other channel on auto service */
if (ast_autoservice_start(caller_chan))
return -1;
+ ast_autoservice_ignore(caller_chan, AST_FRAME_DTMF_END);
if (ast_stream_and_wait(callee_chan, audiofile, "")) {
ast_log(LOG_WARNING, "Failed to play automon message !\n");
ast_autoservice_stop(caller_chan);
@@ -1475,6 +1477,7 @@
if (!ast_strlen_zero(courtesytone)) {
if (ast_autoservice_start(callee_chan))
return -1;
+ ast_autoservice_ignore(callee_chan, AST_FRAME_DTMF_END);
if (ast_stream_and_wait(caller_chan, courtesytone, "")) {
ast_log(LOG_WARNING, "Failed to play courtesy tone!\n");
ast_autoservice_stop(callee_chan);
@@ -1624,6 +1627,7 @@
transferer_real_context = real_ctx(transferer, transferee);
/* Start autoservice on chan while we talk to the originator */
ast_autoservice_start(transferee);
+ ast_autoservice_ignore(transferee, AST_FRAME_DTMF_END);
ast_indicate(transferee, AST_CONTROL_HOLD);
memset(xferto, 0, sizeof(xferto));
@@ -1771,6 +1775,7 @@
transferer_real_context = real_ctx(transferer, transferee);
/* Start autoservice on chan while we talk to the originator */
ast_autoservice_start(transferee);
+ ast_autoservice_ignore(transferee, AST_FRAME_DTMF_END);
ast_indicate(transferee, AST_CONTROL_HOLD);
/* Transfer */
@@ -2048,6 +2053,7 @@
while (!newchan && !atxferdropcall && tries < atxfercallbackretries) {
/* Trying to transfer again */
ast_autoservice_start(transferee);
+ ast_autoservice_ignore(transferee, AST_FRAME_DTMF_END);
ast_indicate(transferee, AST_CONTROL_HOLD);
newchan = feature_request_and_dial(transferer, transferee, "Local",
@@ -2404,6 +2410,7 @@
}
ast_autoservice_start(idle);
+ ast_autoservice_ignore(idle, AST_FRAME_DTMF_END);
if(work && idle) {
pbx_builtin_setvar_helper(work, "DYNAMIC_PEERNAME", idle->name);
More information about the asterisk-commits
mailing list