diff --git a/include/asterisk/bridge.h b/include/asterisk/bridge.h index 8858cf02cf607d6f9af4f0d8fe8e1d274f695cf1..acea2f01fbbef55d089544847da5f5610e767e3c 100644 --- a/include/asterisk/bridge.h +++ b/include/asterisk/bridge.h @@ -746,6 +746,18 @@ int ast_bridge_suspend(struct ast_bridge *bridge, struct ast_channel *chan); */ int ast_bridge_unsuspend(struct ast_bridge *bridge, struct ast_channel *chan); +/*! + * \brief Sets BRIDGECHANNEL and BRIDGEPVTCALLID for a channel + * + * \pre chan must be locked before calling + * + * \param name channel name of the bridged peer + * \param pvtid Private CallID of the bridged peer + * + * \return nothing + */ +void ast_bridge_vars_set(struct ast_channel *chan, const char *name, const char *pvtid); + struct ast_unreal_pvt; /*! diff --git a/main/bridge.c b/main/bridge.c index ebbfc397654274fd9beea27bbc0718db9dfde521..7451a163c7e0a442db055bc80fd6d33f61b6e6d8 100644 --- a/main/bridge.c +++ b/main/bridge.c @@ -1211,7 +1211,7 @@ static void check_bridge_play_sounds(struct ast_bridge *bridge) } } -static void update_bridge_vars_set(struct ast_channel *chan, const char *name, const char *pvtid) +void ast_bridge_vars_set(struct ast_channel *chan, const char *name, const char *pvtid) { ast_channel_stage_snapshot(chan); pbx_builtin_setvar_helper(chan, "BRIDGEPEER", name); @@ -1251,12 +1251,12 @@ static void set_bridge_peer_vars_2party(struct ast_channel *c0, struct ast_chann ast_channel_unlock(c1); ast_channel_lock(c0); - update_bridge_vars_set(c0, c1_name, c1_pvtid); + ast_bridge_vars_set(c0, c1_name, c1_pvtid); UPDATE_BRIDGE_VARS_GET(c0, c0_name, c0_pvtid); ast_channel_unlock(c0); ast_channel_lock(c1); - update_bridge_vars_set(c1, c0_name, c0_pvtid); + ast_bridge_vars_set(c1, c0_name, c0_pvtid); ast_channel_unlock(c1); } @@ -1357,7 +1357,7 @@ static void set_bridge_peer_vars_multiparty(struct ast_bridge *bridge) ++idx; ast_channel_lock(bridge_channel->chan); - update_bridge_vars_set(bridge_channel->chan, buf, NULL); + ast_bridge_vars_set(bridge_channel->chan, buf, NULL); ast_channel_unlock(bridge_channel->chan); } } @@ -1379,7 +1379,7 @@ static void set_bridge_peer_vars_holding(struct ast_bridge *bridge) AST_LIST_TRAVERSE(&bridge->channels, bridge_channel, entry) { ast_channel_lock(bridge_channel->chan); - update_bridge_vars_set(bridge_channel->chan, NULL, NULL); + ast_bridge_vars_set(bridge_channel->chan, NULL, NULL); ast_channel_unlock(bridge_channel->chan); } } diff --git a/main/bridge_channel.c b/main/bridge_channel.c index be0819a5c4f8548eace10ccca1795e66cc5d1e81..f3483e4403fa128afdbe6d423e72b465d24923d7 100644 --- a/main/bridge_channel.c +++ b/main/bridge_channel.c @@ -289,6 +289,10 @@ void ast_bridge_channel_leave_bridge_nolock(struct ast_bridge_channel *bridge_ch channel_set_cause(bridge_channel->chan, cause); + ast_channel_lock(bridge_channel->chan); + ast_bridge_vars_set(bridge_channel->chan, NULL, NULL); + ast_channel_unlock(bridge_channel->chan); + /* Change the state on the bridge channel */ bridge_channel->state = new_state;