more crazy black magic
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@9603 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
parent
a0e7d7a83c
commit
a6989de65c
|
@ -291,7 +291,8 @@ typedef enum {
|
||||||
SMF_ECHO_BLEG = (1 << 2),
|
SMF_ECHO_BLEG = (1 << 2),
|
||||||
SMF_FORCE = (1 << 3),
|
SMF_FORCE = (1 << 3),
|
||||||
SMF_LOOP = (1 << 4),
|
SMF_LOOP = (1 << 4),
|
||||||
SMF_HOLD_BLEG = (1 << 5)
|
SMF_HOLD_BLEG = (1 << 5),
|
||||||
|
SMF_IMMEDIATE = (1 << 6)
|
||||||
} switch_media_flag_enum_t;
|
} switch_media_flag_enum_t;
|
||||||
typedef uint32_t switch_media_flag_t;
|
typedef uint32_t switch_media_flag_t;
|
||||||
|
|
||||||
|
|
|
@ -498,6 +498,10 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_park(switch_core_session_t *session,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (switch_channel_test_flag(channel, CF_PROXY_MODE)) {
|
||||||
|
return SWITCH_STATUS_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
read_codec = switch_core_session_get_read_codec(session);
|
read_codec = switch_core_session_get_read_codec(session);
|
||||||
|
|
||||||
if (!read_codec || !read_codec->implementation) {
|
if (!read_codec || !read_codec->implementation) {
|
||||||
|
@ -907,8 +911,10 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_media(const char *uuid, switch_media_
|
||||||
status = SWITCH_STATUS_SUCCESS;
|
status = SWITCH_STATUS_SUCCESS;
|
||||||
switch_core_session_receive_message(session, &msg);
|
switch_core_session_receive_message(session, &msg);
|
||||||
|
|
||||||
switch_channel_wait_for_flag(channel, CF_REQ_MEDIA, SWITCH_FALSE, 10000, NULL);
|
if (!(flags & SMF_IMMEDIATE)) {
|
||||||
switch_core_session_read_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0);
|
switch_channel_wait_for_flag(channel, CF_REQ_MEDIA, SWITCH_FALSE, 10000, NULL);
|
||||||
|
switch_core_session_read_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0);
|
||||||
|
}
|
||||||
|
|
||||||
if ((flags & SMF_REBRIDGE)
|
if ((flags & SMF_REBRIDGE)
|
||||||
&& (other_uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BRIDGE_VARIABLE))
|
&& (other_uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BRIDGE_VARIABLE))
|
||||||
|
|
|
@ -651,16 +651,21 @@ static switch_status_t signal_bridge_on_hangup(switch_core_session_t *session)
|
||||||
if ((uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BRIDGE_VARIABLE))
|
if ((uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BRIDGE_VARIABLE))
|
||||||
&& (other_session = switch_core_session_locate(uuid))) {
|
&& (other_session = switch_core_session_locate(uuid))) {
|
||||||
switch_channel_t *other_channel = switch_core_session_get_channel(other_session);
|
switch_channel_t *other_channel = switch_core_session_get_channel(other_session);
|
||||||
|
const char *sbv = switch_channel_get_variable(other_channel, SWITCH_SIGNAL_BRIDGE_VARIABLE);
|
||||||
|
|
||||||
|
if (!switch_strlen_zero(sbv) && !strcmp(sbv, switch_core_session_get_uuid(session))) {
|
||||||
|
|
||||||
|
switch_channel_set_variable(other_channel, SWITCH_SIGNAL_BRIDGE_VARIABLE, NULL);
|
||||||
|
|
||||||
|
switch_channel_set_variable(channel, SWITCH_BRIDGE_VARIABLE, NULL);
|
||||||
|
switch_channel_set_variable(other_channel, SWITCH_BRIDGE_VARIABLE, NULL);
|
||||||
|
|
||||||
|
if (switch_channel_get_state(other_channel) < CS_HANGUP) {
|
||||||
|
switch_channel_hangup(other_channel, switch_channel_get_cause(channel));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
switch_channel_set_variable(channel, SWITCH_SIGNAL_BRIDGE_VARIABLE, NULL);
|
switch_channel_set_variable(channel, SWITCH_SIGNAL_BRIDGE_VARIABLE, NULL);
|
||||||
switch_channel_set_variable(other_channel, SWITCH_SIGNAL_BRIDGE_VARIABLE, NULL);
|
|
||||||
|
|
||||||
switch_channel_set_variable(channel, SWITCH_BRIDGE_VARIABLE, NULL);
|
|
||||||
switch_channel_set_variable(other_channel, SWITCH_BRIDGE_VARIABLE, NULL);
|
|
||||||
|
|
||||||
if (switch_channel_get_state(other_channel) < CS_HANGUP) {
|
|
||||||
switch_channel_hangup(other_channel, switch_channel_get_cause(channel));
|
|
||||||
}
|
|
||||||
|
|
||||||
switch_core_session_rwunlock(other_session);
|
switch_core_session_rwunlock(other_session);
|
||||||
}
|
}
|
||||||
|
@ -729,10 +734,14 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_signal_bridge(switch_core_session_t *
|
||||||
switch_channel_set_state_flag(caller_channel, CF_TRANSFER);
|
switch_channel_set_state_flag(caller_channel, CF_TRANSFER);
|
||||||
switch_channel_set_state_flag(peer_channel, CF_TRANSFER);
|
switch_channel_set_state_flag(peer_channel, CF_TRANSFER);
|
||||||
|
|
||||||
|
|
||||||
switch_channel_set_state(caller_channel, CS_HIBERNATE);
|
switch_channel_set_state(caller_channel, CS_HIBERNATE);
|
||||||
switch_channel_set_state(peer_channel, CS_HIBERNATE);
|
switch_channel_set_state(peer_channel, CS_HIBERNATE);
|
||||||
|
|
||||||
|
if (switch_channel_test_flag(caller_channel, CF_BRIDGED)) {
|
||||||
|
switch_channel_set_flag(caller_channel, CF_TRANSFER);
|
||||||
|
switch_channel_set_flag(peer_channel, CF_TRANSFER);
|
||||||
|
}
|
||||||
|
|
||||||
return SWITCH_STATUS_SUCCESS;
|
return SWITCH_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -901,6 +910,33 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_multi_threaded_bridge(switch_core_ses
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void cleanup_proxy_mode(switch_core_session_t *session)
|
||||||
|
{
|
||||||
|
switch_core_session_t *sbsession;
|
||||||
|
|
||||||
|
switch_channel_t *channel = switch_core_session_get_channel(session);
|
||||||
|
|
||||||
|
|
||||||
|
if (switch_channel_test_flag(channel, CF_PROXY_MODE)) {
|
||||||
|
const char *sbv = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE);
|
||||||
|
|
||||||
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Restore media to %s\n", switch_channel_get_name(channel));
|
||||||
|
switch_ivr_media(switch_core_session_get_uuid(session), SMF_IMMEDIATE);
|
||||||
|
|
||||||
|
if (!switch_strlen_zero(sbv) && (sbsession = switch_core_session_locate(sbv))) {
|
||||||
|
switch_channel_t *sbchannel = switch_core_session_get_channel(sbsession);
|
||||||
|
switch_channel_hangup(sbchannel, SWITCH_CAUSE_ATTENDED_TRANSFER);
|
||||||
|
switch_core_session_rwunlock(sbsession);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch_channel_set_variable(channel, SWITCH_SIGNAL_BRIDGE_VARIABLE, NULL);
|
||||||
|
switch_channel_set_variable(channel, SWITCH_BRIDGE_VARIABLE, NULL);
|
||||||
|
switch_channel_set_variable(channel, SWITCH_BRIDGE_UUID_VARIABLE, NULL);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
SWITCH_DECLARE(switch_status_t) switch_ivr_uuid_bridge(const char *originator_uuid, const char *originatee_uuid)
|
SWITCH_DECLARE(switch_status_t) switch_ivr_uuid_bridge(const char *originator_uuid, const char *originatee_uuid)
|
||||||
{
|
{
|
||||||
switch_core_session_t *originator_session, *originatee_session, *swap_session;
|
switch_core_session_t *originator_session, *originatee_session, *swap_session;
|
||||||
|
@ -939,6 +975,9 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_uuid_bridge(const char *originator_uu
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cleanup_proxy_mode(originator_session);
|
||||||
|
cleanup_proxy_mode(originatee_session);
|
||||||
|
|
||||||
/* override transmit state for originator_channel to bridge to originatee_channel
|
/* override transmit state for originator_channel to bridge to originatee_channel
|
||||||
* install pointer to originatee_session into originator_channel
|
* install pointer to originatee_session into originator_channel
|
||||||
* set CF_TRANSFER on both channels and change state to CS_SOFT_EXECUTE to
|
* set CF_TRANSFER on both channels and change state to CS_SOFT_EXECUTE to
|
||||||
|
|
Loading…
Reference in New Issue