diff options
author | jpeeler <jpeeler@f38db490-d61c-443f-a65b-d21fe96a405b> | 2010-03-23 21:19:45 +0000 |
---|---|---|
committer | jpeeler <jpeeler@f38db490-d61c-443f-a65b-d21fe96a405b> | 2010-03-23 21:19:45 +0000 |
commit | 5d6184b977e0539e618871f6e1ae0fd9932588cf (patch) | |
tree | f83f9a6d772e69bfcbdc6c7006d5d52cbabf441d /main | |
parent | a259911a8bb549ad84de6a57160f3d1929b2f29c (diff) |
Merged revisions 254050 via svnmerge from
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: http://svn.digium.com/svn/asterisk/branches/1.6.0@254061 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main')
-rw-r--r-- | main/channel.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/main/channel.c b/main/channel.c index c80ad1cf0..1d53263de 100644 --- a/main/channel.c +++ b/main/channel.c @@ -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" |