]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Fix DTMF not being sent to other side after a partial feature match
authorJeff Peeler <jpeeler@digium.com>
Fri, 1 May 2009 17:40:46 +0000 (17:40 +0000)
committerJeff Peeler <jpeeler@digium.com>
Fri, 1 May 2009 17:40:46 +0000 (17:40 +0000)
This fixes a regression from commit 176701. The issue was that
ast_generic_bridge never exited after the feature digit timeout had elapsed,
which prevented the queued DTMF from being sent to the other side.

This issue was reported to me directly.

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

main/channel.c

index a10412fc70a30ce9ea79b450b6b97195b64c497c..6a2f7f77c25d99960b02be8a24fc7d92e923bad6 100644 (file)
@@ -3950,6 +3950,13 @@ static enum ast_bridge_result ast_generic_bridge(struct ast_channel *c0, struct
        if (jb_in_use)
                ast_jb_empty_and_reset(c0, c1);
 
+       if (config->feature_timer > 0 && ast_tvzero(config->nexteventts)) {
+               /* nexteventts is not set when the bridge is not scheduled to
+                * break, so calculate when the bridge should possibly break
+                * if a partial feature match timed out */
+               config->nexteventts = ast_tvadd(ast_tvnow(), ast_samp2tv(config->feature_timer, 1000));
+       }
+
        for (;;) {
                struct ast_channel *who, *other;
 
@@ -3972,8 +3979,20 @@ static enum ast_bridge_result ast_generic_bridge(struct ast_channel *c0, struct
                                }
                                break;
                        }
-               } else
+               } else {
+                       /* If a feature has been started and the bridge is configured to 
+                        * to not break, leave the channel bridge when the feature timer
+                        * time has elapsed so the DTMF will be sent to the other side. 
+                        */
+                       if (!ast_tvzero(config->nexteventts)) {
+                               int diff = ast_tvdiff_ms(config->nexteventts, ast_tvnow());
+                               if (diff <= 0) {
+                                       res = AST_BRIDGE_RETRY;
+                                       break;
+                               }
+                       }
                        to = -1;
+               }
                /* Calculate the appropriate max sleep interval - in general, this is the time,
                   left to the closest jb delivery moment */
                if (jb_in_use)