diff --git a/res/res_stasis.c b/res/res_stasis.c index f2abaf7703942a04c2f4c8d86138d0148f1cd214..c11f829765fbfbd0749aadd60e3c16b99b02ec1e 100644 --- a/res/res_stasis.c +++ b/res/res_stasis.c @@ -513,6 +513,11 @@ static struct ast_channel *bridge_moh_create(struct ast_bridge *bridge) return NULL; } + if (stasis_app_channel_unreal_set_internal(chan)) { + ast_hangup(chan); + return NULL; + } + /* The after bridge callback assumes responsibility of the bridge_id. */ if (ast_bridge_set_after_callback(chan, moh_after_bridge_cb, moh_after_bridge_cb_failed, bridge_id)) { diff --git a/res/stasis/stasis_bridge.c b/res/stasis/stasis_bridge.c index 9aef40353838b71310d6ca7ae87989cfdc1b3533..7229a87d5a4d5df46bc946f52d1f7627172a0b22 100644 --- a/res/stasis/stasis_bridge.c +++ b/res/stasis/stasis_bridge.c @@ -130,6 +130,24 @@ static int bridge_stasis_push(struct ast_bridge *self, struct ast_bridge_channel return -1; } + /* + * If going into a holding bridge, default the role to participant, if + * it has no compatible role currently + */ + if ((self->technology->capabilities & AST_BRIDGE_CAPABILITY_HOLDING) + && !ast_channel_has_role(bridge_channel->chan, "announcer") + && !ast_channel_has_role(bridge_channel->chan, "holding_participant")) { + if (ast_channel_add_bridge_role(bridge_channel->chan, "holding_participant")) { + ast_log(LOG_ERROR, "Failed to set holding participant on %s\n", ast_channel_name(bridge_channel->chan)); + return -1; + } + + if (ast_channel_set_bridge_role_option(bridge_channel->chan, "holding_participant", "idle_mode", "none")) { + ast_log(LOG_ERROR, "Failed to set holding participant mode on %s\n", ast_channel_name(bridge_channel->chan)); + return -1; + } + } + ao2_cleanup(control); if (self->allowed_capabilities & STASIS_BRIDGE_MIXING_CAPABILITIES) { ast_bridge_channel_update_linkedids(bridge_channel, swap); @@ -187,6 +205,10 @@ static void bridge_stasis_pull(struct ast_bridge *self, struct ast_bridge_channe ast_bridge_channel_update_accountcodes(NULL, bridge_channel); } + if (self->technology->capabilities & AST_BRIDGE_CAPABILITY_HOLDING) { + ast_channel_clear_bridge_roles(bridge_channel->chan); + } + ast_bridge_move_hook(bridge_channel->features, bridge_stasis_moving, NULL, NULL, 0); ast_bridge_base_v_table.pull(self, bridge_channel);