]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 254050 via svnmerge from
authorJeff Peeler <jpeeler@digium.com>
Tue, 23 Mar 2010 21:19:45 +0000 (21:19 +0000)
committerJeff Peeler <jpeeler@digium.com>
Tue, 23 Mar 2010 21:19:45 +0000 (21:19 +0000)
https://origsvn.digium.com/svn/asterisk/trunk

........
  r254050 | jpeeler | 2010-03-23 16:17:23 -0500 (Tue, 23 Mar 2010) | 14 lines

  Exit native bridging early for greater timing accuracy with warnings

  This changes native bridging to break one millisecond early so that the more
  accurate timeval calculations done in the generic bridge can be performed using
  the bridge config. Currently the time between exiting native bridging slightly
  late can sometimes cause a large enough discrepancy for warnings to be missed.
  For the record, 1.4 does not attempt to native bridge at all when warnings are
  enabled.

  (closes issue #15815)
  Reported by: adomjan

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

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

main/channel.c

index c80ad1cf0579cf5e9d0a446156902b5f8b1de71f..1d53263de640b960c31bfa239c8cdeaba42c5daa 100644 (file)
@@ -5158,14 +5158,17 @@ enum ast_bridge_result ast_channel_bridge(struct ast_channel *c0, struct ast_cha
                update_bridge_vars(c0, c1);
 
                if (c0->tech->bridge &&
+                       /* if < 1 ms remains use generic bridging for accurate timing */
+                       (!config->timelimit || to > 1000 || to == 0) &&
                    (c0->tech->bridge == c1->tech->bridge) &&
                    !nativefailed && !c0->monitor && !c1->monitor &&
-                   !c0->audiohooks && !c1->audiohooks && 
+                   !c0->audiohooks && !c1->audiohooks &&
                    !c0->masq && !c0->masqr && !c1->masq && !c1->masqr) {
+                       int timeoutms = to - 1000 > 0 ? to - 1000 : to;
                        /* Looks like they share a bridge method and nothing else is in the way */
                        ast_set_flag(c0, AST_FLAG_NBRIDGE);
                        ast_set_flag(c1, AST_FLAG_NBRIDGE);
-                       if ((res = c0->tech->bridge(c0, c1, config->flags, fo, rc, to)) == AST_BRIDGE_COMPLETE) {
+                       if ((res = c0->tech->bridge(c0, c1, config->flags, fo, rc, timeoutms)) == AST_BRIDGE_COMPLETE) {
                                /* \todo  XXX here should check that cid_num is not NULL */
                                manager_event(EVENT_FLAG_CALL, "Unlink",
                                              "Channel1: %s\r\n"