diff --git a/src/include/switch_types.h b/src/include/switch_types.h index 19e9461ebb..fa01f73c04 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -245,7 +245,8 @@ typedef enum { SMF_ECHO_ALEG = (1 << 1), SMF_ECHO_BLEG = (1 << 2), SMF_FORCE = (1 << 3), - SMF_LOOP = (1 << 4) + SMF_LOOP = (1 << 4), + SMF_HOLD_BLEG = (1 << 5) } switch_media_flag_t; typedef enum { diff --git a/src/switch_ivr.c b/src/switch_ivr.c index 658b544726..3d00d23fca 100644 --- a/src/switch_ivr.c +++ b/src/switch_ivr.c @@ -291,6 +291,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_parse_event(switch_core_session_t *se char *app_name = switch_event_get_header(event, "execute-app-name"); char *app_arg = switch_event_get_header(event, "execute-app-arg"); char *loop_h = switch_event_get_header(event, "loops"); + char *hold_bleg = switch_event_get_header(event, "hold-bleg"); int loops = 1; if (loop_h) { @@ -301,8 +302,25 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_parse_event(switch_core_session_t *se if ((application_interface = switch_loadable_module_get_application_interface(app_name))) { if (application_interface->application_function) { int x; + const char *b_uuid = NULL; + switch_core_session_t *b_session = NULL; + switch_channel_clear_flag(channel, CF_STOP_BROADCAST); switch_channel_set_flag(channel, CF_BROADCAST); + if (hold_bleg && switch_true(hold_bleg)) { + if ((b_uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE))) { + const char *stream; + + if (!(stream = switch_channel_get_variable_partner(channel, SWITCH_HOLD_MUSIC_VARIABLE))) { + stream = switch_channel_get_variable(channel, SWITCH_HOLD_MUSIC_VARIABLE); + } + if (stream) { + switch_ivr_broadcast(b_uuid, hold_bleg, SMF_ECHO_ALEG | SMF_LOOP); + } else { + b_uuid = NULL; + } + } + } for (x = 0; x < loops || loops < 0; x++) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s Command Execute %s(%s)\n", switch_channel_get_name(channel), app_name, app_arg); @@ -311,6 +329,14 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_parse_event(switch_core_session_t *se break; } } + if (b_uuid) { + if ((b_session = switch_core_session_locate(b_uuid))) { + switch_channel_t *b_channel = switch_core_session_get_channel(b_session); + switch_channel_stop_broadcast(b_channel); + switch_channel_wait_for_flag(b_channel, CF_BROADCAST, SWITCH_FALSE, 5000); + switch_core_session_rwunlock(b_session); + } + } switch_channel_clear_flag(channel, CF_BROADCAST); } } diff --git a/src/switch_ivr_async.c b/src/switch_ivr_async.c index f7ad37785e..8c4eaad9ce 100644 --- a/src/switch_ivr_async.c +++ b/src/switch_ivr_async.c @@ -1353,6 +1353,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_bind_dtmf_meta_session(switch_core_se if (!switch_strlen_zero(app)) { md->map[key].app = switch_core_session_strdup(session, app); md->map[key].flags = exec_b ? SMF_ECHO_BLEG : SMF_ECHO_ALEG; + md->map[key].flags |= SMF_HOLD_BLEG; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Bound: %d %s\n", key, app); } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "UnBound: %d\n", key); @@ -1838,6 +1839,9 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_broadcast(const char *uuid, const cha if ((flags & SMF_LOOP)) { switch_event_add_header(event, SWITCH_STACK_BOTTOM, "loops", "%d", -1); } + if ((flags & SMF_HOLD_BLEG)) { + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "hold-bleg", "%s", "true"); + } switch_core_session_queue_private_event(other_session, &event); }