diff options
author | Richard Mudgett <rmudgett@digium.com> | 2013-01-10 02:40:50 +0000 |
---|---|---|
committer | Richard Mudgett <rmudgett@digium.com> | 2013-01-10 02:40:50 +0000 |
commit | 2db3cc2e26bc275c0a3e372a53fe25f2a7b4cc7a (patch) | |
tree | f7766d4822a2b2fe164b74d833b795f27637a53f | |
parent | e31002b9b29d6c205201012f2c26878b039f8ef2 (diff) |
* Simplify native bridge code in ast_channel_bridge().
* Fix an unbalanced manager_bridge_event(unlink) call if
AST_SOFTHANGUP_UNBRIDGE is set in ast_channel_bridge().
* Make ast_channel_bridge() use common cleanup code when leaving the
bridge.
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@378889 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r-- | main/channel.c | 29 |
1 files changed, 9 insertions, 20 deletions
diff --git a/main/channel.c b/main/channel.c index 49ee80cfc..0023946cf 100644 --- a/main/channel.c +++ b/main/channel.c @@ -7978,8 +7978,6 @@ enum ast_bridge_result ast_channel_bridge(struct ast_channel *c0, struct ast_cha } ast_channel_internal_bridged_channel_set(c0, c1); ast_channel_internal_bridged_channel_set(c1, c0); - ast_debug(1, "Unbridge signal received. Ending native bridge.\n"); - continue; } /* Stop if we're a zombie or need a soft hangup */ @@ -8009,28 +8007,21 @@ enum ast_bridge_result ast_channel_bridge(struct ast_channel *c0, struct ast_cha ast_framehook_list_is_empty(ast_channel_framehooks(c0)) && ast_framehook_list_is_empty(ast_channel_framehooks(c1)) && !ast_channel_masq(c0) && !ast_channel_masqr(c0) && !ast_channel_masq(c1) && !ast_channel_masqr(c1)) { 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(ast_channel_flags(c0), AST_FLAG_NBRIDGE); ast_set_flag(ast_channel_flags(c1), AST_FLAG_NBRIDGE); - if ((res = ast_channel_tech(c0)->bridge(c0, c1, config->flags, fo, rc, timeoutms)) == AST_BRIDGE_COMPLETE) { - manager_bridge_event(0, 1, c0, c1); + res = ast_channel_tech(c0)->bridge(c0, c1, config->flags, fo, rc, timeoutms); + ast_clear_flag(ast_channel_flags(c0), AST_FLAG_NBRIDGE); + ast_clear_flag(ast_channel_flags(c1), AST_FLAG_NBRIDGE); + if (res == AST_BRIDGE_COMPLETE) { ast_debug(1, "Returning from native bridge, channels: %s, %s\n", ast_channel_name(c0), ast_channel_name(c1)); - ast_clear_flag(ast_channel_flags(c0), AST_FLAG_NBRIDGE); - ast_clear_flag(ast_channel_flags(c1), AST_FLAG_NBRIDGE); - if ((ast_channel_softhangup_internal_flag(c0) | ast_channel_softhangup_internal_flag(c1)) & AST_SOFTHANGUP_UNBRIDGE) {/* Bit operators are intentional. */ + ast_debug(1, "Unbridge signal received. Ending native bridge.\n"); continue; } - - ast_channel_internal_bridged_channel_set(c0, NULL); - ast_channel_internal_bridged_channel_set(c1, NULL); - ast_format_cap_destroy(o0nativeformats); - ast_format_cap_destroy(o1nativeformats); - return res; - } else { - ast_clear_flag(ast_channel_flags(c0), AST_FLAG_NBRIDGE); - ast_clear_flag(ast_channel_flags(c1), AST_FLAG_NBRIDGE); + break; } switch (res) { case AST_BRIDGE_RETRY: @@ -8053,10 +8044,8 @@ enum ast_bridge_result ast_channel_bridge(struct ast_channel *c0, struct ast_cha !(ast_channel_generator(c0) || ast_channel_generator(c1))) { if (ast_channel_make_compatible(c0, c1)) { ast_log(LOG_WARNING, "Can't make %s and %s compatible\n", ast_channel_name(c0), ast_channel_name(c1)); - manager_bridge_event(0, 1, c0, c1); - ast_format_cap_destroy(o0nativeformats); - ast_format_cap_destroy(o1nativeformats); - return AST_BRIDGE_FAILED; + res = AST_BRIDGE_FAILED; + break; } ast_format_cap_copy(o0nativeformats, ast_channel_nativeformats(c0)); |