make it so when you put someone on hold and then they attended transfer you, the resulting bridge will still be playing hold music

This commit is contained in:
Anthony Minessale 2012-11-15 21:07:58 -06:00
parent 6644cefb20
commit d48e3de7c8
3 changed files with 45 additions and 19 deletions

View File

@ -1255,6 +1255,7 @@ typedef enum {
CF_NO_CDR,
CF_EARLY_OK,
CF_MEDIA_TRANS,
CF_HOLD_ON_BRIDGE,
/* WARNING: DO NOT ADD ANY FLAGS BELOW THIS LINE */
/* IF YOU ADD NEW ONES CHECK IF THEY SHOULD PERSIST OR ZERO THEM IN switch_core_session.c switch_core_session_request_xml() */
CF_FLAG_MAX

View File

@ -2456,6 +2456,11 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
case SWITCH_MESSAGE_INDICATE_HOLD:
{
if (msg->numeric_arg) {
sofia_glue_toggle_hold(tech_pvt, 1);
} else {
sofia_set_flag_locked(tech_pvt, TFLAG_SIP_HOLD);
switch_channel_set_flag(channel, CF_LEG_HOLDING);
sofia_glue_do_invite(session);
@ -2478,6 +2483,7 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
}
}
}
}
break;
case SWITCH_MESSAGE_INDICATE_UNHOLD:

View File

@ -317,6 +317,15 @@ static void *audio_bridge_thread(switch_thread_t *thread, void *obj)
goto end_of_bridge_loop;
}
if (switch_channel_test_flag(chan_a, CF_HOLD_ON_BRIDGE)) {
switch_core_session_message_t hmsg = { 0 };
switch_channel_clear_flag(chan_a, CF_HOLD_ON_BRIDGE);
hmsg.message_id = SWITCH_MESSAGE_INDICATE_HOLD;
hmsg.from = __FILE__;
hmsg.numeric_arg = 1;
switch_core_session_receive_message(session_a, &hmsg);
}
if (read_frame_count > DEFAULT_LEAD_FRAMES && switch_channel_media_ack(chan_a) && switch_core_session_private_event_count(session_a)) {
switch_channel_set_flag(chan_b, CF_SUSPEND);
msg.numeric_arg = 42;
@ -1556,6 +1565,16 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_uuid_bridge(const char *originator_uu
originatee_channel = switch_core_session_get_channel(originatee_session);
if (switch_channel_test_flag(originator_channel, CF_LEG_HOLDING)) {
switch_channel_set_flag(originator_channel, CF_HOLD_ON_BRIDGE);
}
if (switch_channel_test_flag(originatee_channel, CF_LEG_HOLDING)) {
switch_channel_set_flag(originatee_channel, CF_HOLD_ON_BRIDGE);
}
if (switch_channel_direction(originatee_channel) == SWITCH_CALL_DIRECTION_OUTBOUND && !switch_channel_test_flag(originatee_channel, CF_DIALPLAN)) {
switch_channel_flip_cid(originatee_channel);
switch_channel_set_flag(originatee_channel, CF_DIALPLAN);