diff options
-rw-r--r-- | bridges/bridge_native_rtp.c | 41 | ||||
-rw-r--r-- | main/bridge.c | 57 |
2 files changed, 42 insertions, 56 deletions
diff --git a/bridges/bridge_native_rtp.c b/bridges/bridge_native_rtp.c index 4655efeae..24873d031 100644 --- a/bridges/bridge_native_rtp.c +++ b/bridges/bridge_native_rtp.c @@ -212,10 +212,6 @@ static void native_rtp_bridge_stop(struct ast_bridge *bridge, struct ast_channel return; } - if (!c0 || !c1) { - return; - } - ast_channel_lock_both(c0->chan, c1->chan); native_type = native_rtp_bridge_get(c0->chan, c1->chan, &glue0, &glue1, &instance0, &instance1, &vinstance0, &vinstance1); @@ -457,44 +453,7 @@ static void native_rtp_bridge_unsuspend(struct ast_bridge *bridge, struct ast_br static void native_rtp_bridge_leave(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel) { - struct ast_rtp_glue *glue; - RAII_VAR(struct ast_rtp_instance *, instance, NULL, ao2_cleanup); - RAII_VAR(struct ast_rtp_instance *, vinstance, NULL, ao2_cleanup); - RAII_VAR(struct ast_rtp_instance *, tinstance, NULL, ao2_cleanup); - native_rtp_bridge_framehook_detach(bridge_channel); - - glue = ast_rtp_instance_get_glue(ast_channel_tech(bridge_channel->chan)->type); - if (!glue) { - return; - } - - glue->get_rtp_info(bridge_channel->chan, &instance); - - if (glue->get_vrtp_info) { - glue->get_vrtp_info(bridge_channel->chan, &vinstance); - } - - if (glue->get_trtp_info) { - glue->get_trtp_info(bridge_channel->chan, &tinstance); - } - - /* Tear down P2P bridges */ - if (instance) { - ast_rtp_instance_set_bridged(instance, NULL); - } - if (vinstance) { - ast_rtp_instance_set_bridged(vinstance, NULL); - } - if (tinstance) { - ast_rtp_instance_set_bridged(tinstance, NULL); - } - - if (ast_channel_is_leaving_bridge(bridge_channel->chan)) { - /* Direct RTP may have occurred, tear it down */ - glue->update_peer(bridge_channel->chan, NULL, NULL, NULL, NULL, 0); - } - native_rtp_bridge_stop(bridge, NULL); } diff --git a/main/bridge.c b/main/bridge.c index 0478e4686..ab3bb17e6 100644 --- a/main/bridge.c +++ b/main/bridge.c @@ -1139,28 +1139,55 @@ static int smart_bridge_operation(struct ast_bridge *bridge) return -1; } + /* To ensure that things are sane for the old technology move the channels it + * expects to the dummy bridge + */ + AST_LIST_TRAVERSE_SAFE_BEGIN(&bridge->channels, bridge_channel, entry) { + if (bridge_channel->just_joined) { + continue; + } + ast_debug(1, "Bridge %s: moving %p(%s) to dummy bridge temporarily\n", + bridge->uniqueid, bridge_channel, ast_channel_name(bridge_channel->chan)); + AST_LIST_REMOVE_CURRENT(entry); + AST_LIST_INSERT_TAIL(&dummy_bridge.channels, bridge_channel, entry); + dummy_bridge.num_channels++; + if (ast_test_flag(&bridge_channel->features->feature_flags, AST_BRIDGE_CHANNEL_FLAG_LONELY)) { + dummy_bridge.num_lonely++; + } + if (!bridge_channel->suspended) { + dummy_bridge.num_active++; + } + } + AST_LIST_TRAVERSE_SAFE_END; + + /* Take all the channels out of the old technology */ + AST_LIST_TRAVERSE_SAFE_BEGIN(&dummy_bridge.channels, bridge_channel, entry) { + ast_debug(1, "Bridge %s: %p(%s) is leaving %s technology (dummy)\n", + dummy_bridge.uniqueid, bridge_channel, ast_channel_name(bridge_channel->chan), + old_technology->name); + if (old_technology->leave) { + old_technology->leave(&dummy_bridge, bridge_channel); + } + AST_LIST_REMOVE_CURRENT(entry); + AST_LIST_INSERT_TAIL(&bridge->channels, bridge_channel, entry); + dummy_bridge.num_channels--; + if (ast_test_flag(&bridge_channel->features->feature_flags, AST_BRIDGE_CHANNEL_FLAG_LONELY)) { + dummy_bridge.num_lonely--; + } + if (!bridge_channel->suspended) { + dummy_bridge.num_active--; + } + } + AST_LIST_TRAVERSE_SAFE_END; + ast_debug(1, "Bridge %s: calling %s technology stop\n", dummy_bridge.uniqueid, old_technology->name); if (old_technology->stop) { old_technology->stop(&dummy_bridge); } - /* - * Move existing channels over to the new technology and - * complete joining any new channels to the bridge. - */ + /* Add any new channels or re-add existing channels to the bridge. */ AST_LIST_TRAVERSE(&bridge->channels, bridge_channel, entry) { - if (!bridge_channel->just_joined) { - /* Take existing channel from the old technology. */ - ast_debug(1, "Bridge %s: %p(%s) is leaving %s technology (dummy)\n", - dummy_bridge.uniqueid, bridge_channel, ast_channel_name(bridge_channel->chan), - old_technology->name); - if (old_technology->leave) { - old_technology->leave(&dummy_bridge, bridge_channel); - } - } - - /* Add any new channels or re-add an existing channel to the bridge. */ bridge_channel_complete_join(bridge, bridge_channel); } |