res_parking: Apply ringing role option on swap with a channel that rings

(closes issue ASTERISK-21877)
Reported by: Matt Jordan
Review: https://reviewboard.asterisk.org/r/2656/


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@393815 65c4cc65-6c06-0410-ace0-fbb531ad65f3
changes/78/78/1
Jonathan Rose 12 years ago
parent 7ee5b025f4
commit b083a4cdae

@ -1015,7 +1015,9 @@ void ast_bridge_channel_playfile(struct ast_bridge_channel *bridge_channel, ast_
* playing the announcment. * playing the announcment.
* *
* XXX We have no idea what MOH class was in use before playing * XXX We have no idea what MOH class was in use before playing
* the file. * the file. This method also fails to restore ringing indications.
* the proposed solution is to create a resume_entertainment callback
* for the bridge technology and execute it here.
*/ */
if (ast_test_flag(ast_channel_flags(bridge_channel->chan), AST_FLAG_MOH)) { if (ast_test_flag(ast_channel_flags(bridge_channel->chan), AST_FLAG_MOH)) {
ast_moh_start(bridge_channel->chan, NULL, NULL); ast_moh_start(bridge_channel->chan, NULL, NULL);

@ -219,6 +219,7 @@ static int bridge_parking_push(struct ast_bridge_parking *self, struct ast_bridg
} }
if (swap) { if (swap) {
int use_ringing = 0;
ao2_lock(swap); ao2_lock(swap);
pu = swap->bridge_pvt; pu = swap->bridge_pvt;
if (!pu) { if (!pu) {
@ -236,15 +237,21 @@ static int bridge_parking_push(struct ast_bridge_parking *self, struct ast_bridg
/* TODO Add a parked call swap message type to relay information about parked channel swaps */ /* TODO Add a parked call swap message type to relay information about parked channel swaps */
if (ast_bridge_channel_has_role(swap, "holding_participant")) {
const char *idle_mode = ast_bridge_channel_get_role_option(swap, "holding_participant", "idle_mode");
if (!ast_strlen_zero(idle_mode) && !strcmp(idle_mode, "ringing")) {
use_ringing = 1;
}
}
ao2_unlock(swap); ao2_unlock(swap);
parking_set_duration(bridge_channel->features, pu); parking_set_duration(bridge_channel->features, pu);
/* BUGBUG Adding back local channel swapping made us not hear music on hold for the channel that got swapped if (parking_channel_set_roles(bridge_channel->chan, self->lot, use_ringing)) {
* into the parking lot. Setting the roels back up gets around that, but we still need to deal with the ringing option ast_log(LOG_WARNING, "Failed to apply holding bridge roles to %s while joining the parking lot.\n",
* to the park application here somehow. ast_channel_name(bridge_channel->chan));
*/ }
parking_channel_set_roles(bridge_channel->chan, self->lot, 0);
return 0; return 0;
} }

@ -54,17 +54,28 @@ struct ast_bridge *parking_lot_get_bridge(struct parking_lot *lot)
return lot_bridge; return lot_bridge;
} }
void parking_channel_set_roles(struct ast_channel *chan, struct parking_lot *lot, int force_ringing) int parking_channel_set_roles(struct ast_channel *chan, struct parking_lot *lot, int force_ringing)
{ {
ast_channel_add_bridge_role(chan, "holding_participant"); if (ast_channel_add_bridge_role(chan, "holding_participant")) {
return -1;
}
if (force_ringing) { if (force_ringing) {
ast_channel_set_bridge_role_option(chan, "holding_participant", "idle_mode", "ringing"); if (ast_channel_set_bridge_role_option(chan, "holding_participant", "idle_mode", "ringing")) {
return -1;
}
} else { } else {
ast_channel_set_bridge_role_option(chan, "holding_participant", "idle_mode", "musiconhold"); if (ast_channel_set_bridge_role_option(chan, "holding_participant", "idle_mode", "musiconhold")) {
return -1;
}
if (!ast_strlen_zero(lot->cfg->mohclass)) { if (!ast_strlen_zero(lot->cfg->mohclass)) {
ast_channel_set_bridge_role_option(chan, "holding_participant", "moh_class", lot->cfg->mohclass); if (ast_channel_set_bridge_role_option(chan, "holding_participant", "moh_class", lot->cfg->mohclass)) {
return -1;
}
} }
} }
return 0;
} }
struct parking_limits_pvt { struct parking_limits_pvt {

@ -214,8 +214,11 @@ void parked_call_retrieve_enable_features(struct ast_channel *chan, struct parki
* \param chan Entering channel * \param chan Entering channel
* \param lot The parking lot the channel will be entering * \param lot The parking lot the channel will be entering
* \param force_ringing Use ringing instead of music on hold * \param force_ringing Use ringing instead of music on hold
*
* \retval 0 on success
* \retval non-zero on failure
*/ */
void parking_channel_set_roles(struct ast_channel *chan, struct parking_lot *lot, int force_ringing); int parking_channel_set_roles(struct ast_channel *chan, struct parking_lot *lot, int force_ringing);
/*! /*!
* \since 12.0.0 * \since 12.0.0

Loading…
Cancel
Save