summaryrefslogtreecommitdiff
path: root/res/stasis/stasis_bridge.c
diff options
context:
space:
mode:
Diffstat (limited to 'res/stasis/stasis_bridge.c')
-rw-r--r--res/stasis/stasis_bridge.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/res/stasis/stasis_bridge.c b/res/stasis/stasis_bridge.c
index 9aef40353..7229a87d5 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);