summaryrefslogtreecommitdiff
path: root/main/channel.c
diff options
context:
space:
mode:
authorJeff Peeler <jpeeler@digium.com>2010-03-23 21:17:23 +0000
committerJeff Peeler <jpeeler@digium.com>2010-03-23 21:17:23 +0000
commit48edf2c78a336139d9058349add502c5ab3103f9 (patch)
treedf50ca909117d962aa0fcf5252678ea774d9efda /main/channel.c
parent61e7dbddddaca6ba9bf8e195c2ce6a20a56af8b9 (diff)
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/trunk@254050 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/channel.c')
-rw-r--r--main/channel.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/main/channel.c b/main/channel.c
index 016453c24..191a4298f 100644
--- a/main/channel.c
+++ b/main/channel.c
@@ -6058,14 +6058,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) &&
!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) {
ast_manager_event_multichan(EVENT_FLAG_CALL, "Unlink", 2, chans,
"Channel1: %s\r\n"
"Channel2: %s\r\n"