DTMF hooks: Leaving channels need to push any collected digits into the bridge.
authorRichard Mudgett <rmudgett@digium.com>
Mon, 24 Nov 2014 20:32:29 +0000 (20:32 +0000)
committerRichard Mudgett <rmudgett@digium.com>
Mon, 24 Nov 2014 20:32:29 +0000 (20:32 +0000)
Any partially collected DTMF digits for a DTMF hook need to be pushed into
the bridge when a channel leaves the bridging system as if there were a
timeout.

Review: https://reviewboard.asterisk.org/r/4199/
........

Merged revisions 428601 from http://svn.asterisk.org/svn/asterisk/branches/12
........

Merged revisions 428602 from http://svn.asterisk.org/svn/asterisk/branches/13

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@428603 65c4cc65-6c06-0410-ace0-fbb531ad65f3

main/bridge.c
main/bridge_channel.c

index f46d314..1e746a0 100644 (file)
@@ -1764,8 +1764,8 @@ int ast_bridge_depart(struct ast_channel *chan)
        }
 
        /*
-        * We are claiming the reference held by the depart bridge
-        * channel thread.
+        * We are claiming the bridge_channel reference held by
+        * bridge_channel_depart_thread().
         */
 
        ast_bridge_channel_leave_bridge(bridge_channel,
index 60fa030..e59d28e 100644 (file)
@@ -2564,10 +2564,15 @@ int bridge_channel_internal_join(struct ast_bridge_channel *bridge_channel)
 
                ast_bridge_unlock(bridge_channel->bridge);
                bridge_channel_event_join_leave(bridge_channel, AST_BRIDGE_HOOK_TYPE_JOIN);
+
                while (bridge_channel->state == BRIDGE_CHANNEL_STATE_WAIT) {
                        /* Wait for something to do. */
                        bridge_channel_wait(bridge_channel);
                }
+
+               /* Force a timeout on any accumulated DTMF hook digits. */
+               ast_bridge_channel_feature_digit(bridge_channel, 0);
+
                bridge_channel_event_join_leave(bridge_channel, AST_BRIDGE_HOOK_TYPE_LEAVE);
                ast_bridge_channel_lock_bridge(bridge_channel);
        }