aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjpeeler <jpeeler@f38db490-d61c-443f-a65b-d21fe96a405b>2010-03-23 21:20:22 +0000
committerjpeeler <jpeeler@f38db490-d61c-443f-a65b-d21fe96a405b>2010-03-23 21:20:22 +0000
commita6de163ab04173f07738bf361048ab152994b7d7 (patch)
tree698b53b6bfcfe21386535f72af914a30eaec8f15
parent820623ed428e6b3e28b63196346d454105babb35 (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.1@254065 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--main/channel.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/main/channel.c b/main/channel.c
index 0a6beb315..1843e2977 100644
--- a/main/channel.c
+++ b/main/channel.c
@@ -5185,14 +5185,17 @@ enum ast_bridge_result ast_channel_bridge(struct ast_channel *c0, struct ast_cha
bridge_play_sounds(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"