typedef enum {
TFLAG_IO = (1 << 0),
- TFLAG_USEME = (1 << 1),
+ TFLAG_CHANGE_MEDIA = (1 << 1),
TFLAG_OUTBOUND = (1 << 2),
TFLAG_READING = (1 << 3),
TFLAG_WRITING = (1 << 4),
if (!tech_pvt->local_sdp_str) {
tech_absorb_sdp(tech_pvt);
}
-
do_invite(session);
}
break;
}
}
-static void pass_sdp(switch_channel_t *channel, char *sdp)
+static void pass_sdp(private_object_t *tech_pvt, char *sdp)
{
char *val;
+ switch_channel_t *channel;
switch_core_session_t *other_session;
switch_channel_t *other_channel;
+ channel = switch_core_session_get_channel(tech_pvt->session);
+ assert(channel != NULL);
+
if ((val = switch_channel_get_variable(channel, SWITCH_ORIGINATOR_VARIABLE)) && (other_session = switch_core_session_locate(val))) {
other_channel = switch_core_session_get_channel(other_session);
assert(other_channel != NULL);
if (!switch_channel_get_variable(other_channel, SWITCH_B_SDP_VARIABLE)) {
switch_channel_set_variable(other_channel, SWITCH_B_SDP_VARIABLE, sdp);
}
- if (
+ if (!switch_test_flag(tech_pvt, TFLAG_CHANGE_MEDIA) && (
switch_channel_test_flag(other_channel, CF_OUTBOUND) &&
switch_channel_test_flag(other_channel, CF_NOMEDIA) &&
switch_channel_test_flag(channel, CF_OUTBOUND) &&
- switch_channel_test_flag(channel, CF_NOMEDIA)) {
+ switch_channel_test_flag(channel, CF_NOMEDIA))) {
switch_ivr_nomedia(val, SMF_FORCE);
+ switch_set_flag_locked(tech_pvt, TFLAG_CHANGE_MEDIA);
}
switch_core_session_rwunlock(other_session);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Remote SDP:\n%s\n", r_sdp);
tech_pvt->remote_sdp_str = switch_core_session_strdup(session, (char *)r_sdp);
switch_channel_set_variable(channel, SWITCH_R_SDP_VARIABLE, (char *) r_sdp);
- pass_sdp(channel, (char *) r_sdp);
+ pass_sdp(tech_pvt, (char *) r_sdp);
}
}
if (tech_pvt && r_sdp) {
if (r_sdp) {
if (switch_test_flag(tech_pvt, TFLAG_NOMEDIA)) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "What should i do?\n%s\n", r_sdp);
return;
} else {
sdp_parser_t *parser = sdp_parse(tech_pvt->home, r_sdp, (int)strlen(r_sdp), 0);
switch_ivr_parse_event(session, event);
switch_event_destroy(&event);
}
-
+
if (switch_channel_has_dtmf(channel)) {
char dtmf[128];
switch_channel_dequeue_dtmf(channel, dtmf, sizeof(dtmf));
if (!switch_channel_test_flag(channel, CF_ORIGINATOR)) {
- switch_channel_set_flag(channel, CF_TAGGED);
return SWITCH_STATUS_FALSE;
}
- if ((other_session = switch_channel_get_private(channel, "_uuid_bridge_"))) {
+ if ((other_session = switch_channel_get_private(channel, SWITCH_UUID_BRIDGE))) {
switch_channel_t *other_channel = switch_core_session_get_channel(other_session);
switch_channel_state_t state = switch_channel_get_state(other_channel);
switch_channel_state_t mystate = switch_channel_get_state(channel);
switch_channel_clear_flag(channel, CF_TRANSFER);
- switch_channel_set_private(channel, "_uuid_bridge_", NULL);
+ switch_channel_set_private(channel, SWITCH_UUID_BRIDGE, NULL);
while (mystate <= CS_HANGUP && state <= CS_HANGUP && !switch_channel_test_flag(other_channel, CF_TAGGED)) {
switch_yield(1000);
{
switch_channel_t *channel;
int nomedia;
- switch_core_session_t *session;
+ switch_core_session_t *session, *master;
switch_event_t *event;
- switch_core_session_t *other_session;
+ switch_core_session_t *other_session = NULL;
char *other_uuid = NULL;
if ((session = switch_core_session_locate(uuid))) {
char *app;
-
+ master = session;
+
channel = switch_core_session_get_channel(session);
assert(channel != NULL);
app = "playback";
}
- if ((flags & SMF_ECHO_BRIDGED) && (other_uuid = switch_channel_get_variable(channel, SWITCH_BRIDGE_VARIABLE))
+ if ((flags & SMF_ECHO_BLEG) && (other_uuid = switch_channel_get_variable(channel, SWITCH_BRIDGE_VARIABLE))
&& (other_session = switch_core_session_locate(other_uuid))) {
if (switch_event_create(&event, SWITCH_EVENT_MESSAGE) == SWITCH_STATUS_SUCCESS) {
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "call-command", "execute");
switch_core_session_queue_private_event(other_session, &event);
}
switch_core_session_rwunlock(other_session);
+ master = other_session;
other_session = NULL;
}
-
- if (switch_event_create(&event, SWITCH_EVENT_MESSAGE) == SWITCH_STATUS_SUCCESS) {
- switch_event_add_header(event, SWITCH_STACK_BOTTOM, "call-command", "execute");
- switch_event_add_header(event, SWITCH_STACK_BOTTOM, "execute-app-name", app);
- switch_event_add_header(event, SWITCH_STACK_BOTTOM, "execute-app-arg", "%s", path);
- switch_core_session_queue_private_event(session, &event);
+
+ if ((flags & SMF_ECHO_ALEG)) {
+ if (switch_event_create(&event, SWITCH_EVENT_MESSAGE) == SWITCH_STATUS_SUCCESS) {
+ switch_event_add_header(event, SWITCH_STACK_BOTTOM, "call-command", "execute");
+ switch_event_add_header(event, SWITCH_STACK_BOTTOM, "execute-app-name", app);
+ switch_event_add_header(event, SWITCH_STACK_BOTTOM, "execute-app-arg", "%s", path);
+ switch_core_session_queue_private_event(session, &event);
+ }
+ master = session;
}
if (nomedia) {
if (switch_event_create(&event, SWITCH_EVENT_MESSAGE) == SWITCH_STATUS_SUCCESS) {
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "call-command", "nomedia");
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "nomedia-uuid", "%s", uuid);
- switch_core_session_queue_private_event(session, &event);
+ switch_core_session_queue_private_event(master, &event);
}
}
switch_core_session_t *session, *other_session;
switch_core_session_message_t msg = {0};
switch_status_t status = SWITCH_STATUS_GENERR;
-
+ uint8_t swap = 0;
+
msg.message_id = SWITCH_MESSAGE_INDICATE_MEDIA;
msg.from = __FILE__;
if ((session = switch_core_session_locate(uuid))) {
channel = switch_core_session_get_channel(session);
assert(channel != NULL);
+ if ((flags & SMF_REBRIDGE) && !switch_channel_test_flag(channel, CF_ORIGINATOR)) {
+ swap = 1;
+ }
if (switch_channel_test_flag(channel, CF_NOMEDIA)) {
status = SWITCH_STATUS_SUCCESS;
switch_channel_clear_flag(channel, CF_NOMEDIA);
switch_core_session_receive_message(session, &msg);
- if ((flags & SMF_REBRIDGE) && (other_uuid = switch_channel_get_variable(channel, SWITCH_BRIDGE_VARIABLE))
+
+ if ((flags & SMF_REBRIDGE) && (other_uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BRIDGE_VARIABLE))
&& (other_session = switch_core_session_locate(other_uuid))) {
other_channel = switch_core_session_get_channel(other_session);
assert(other_channel != NULL);
switch_core_session_rwunlock(session);
if (other_channel) {
- switch_ivr_uuid_bridge(uuid, other_uuid);
+ if (swap) {
+ switch_ivr_uuid_bridge(other_uuid, uuid);
+ } else {
+ switch_ivr_uuid_bridge(uuid, other_uuid);
+ }
}
}
switch_core_session_t *session, *other_session = NULL;
switch_core_session_message_t msg = {0};
switch_status_t status = SWITCH_STATUS_GENERR;
+ uint8_t swap = 0;
msg.message_id = SWITCH_MESSAGE_INDICATE_NOMEDIA;
msg.from = __FILE__;
channel = switch_core_session_get_channel(session);
assert(channel != NULL);
+ if ((flags & SMF_REBRIDGE) && !switch_channel_test_flag(channel, CF_ORIGINATOR)) {
+ swap = 1;
+ }
+
if ((flags & SMF_FORCE) || !switch_channel_test_flag(channel, CF_NOMEDIA)) {
switch_channel_set_flag(channel, CF_NOMEDIA);
switch_core_session_receive_message(session, &msg);
}
if (other_channel) {
switch_channel_clear_state_handler(channel, NULL);
- switch_ivr_signal_bridge(session, other_session);
+ if (swap) {
+ switch_ivr_signal_bridge(other_session, session);
+ } else {
+ switch_ivr_signal_bridge(session, other_session);
+ }
switch_core_session_rwunlock(other_session);
}
}
channel = switch_core_session_get_channel(session);
assert(channel != NULL);
switch_channel_clear_flag(channel, CF_TRANSFER);
-
+
switch_channel_set_variable(channel, SWITCH_BRIDGE_VARIABLE, switch_channel_get_variable(channel, SWITCH_SIGNAL_BRIDGE_VARIABLE));
return SWITCH_STATUS_SUCCESS;
caller_channel = switch_core_session_get_channel(session);
assert(caller_channel != NULL);
- switch_channel_set_flag(caller_channel, CF_ORIGINATOR);
-
peer_channel = switch_core_session_get_channel(peer_session);
assert(peer_channel != NULL);
+ switch_channel_set_flag(caller_channel, CF_ORIGINATOR);
+
switch_channel_clear_state_handler(caller_channel, NULL);
switch_channel_clear_state_handler(peer_channel, NULL);
switch_channel_set_flag(originator_channel, CF_ORIGINATOR);
switch_channel_add_state_handler(originator_channel, &uuid_bridge_state_handlers);
switch_channel_add_state_handler(originatee_channel, &uuid_bridge_state_handlers);
- switch_channel_set_private(originator_channel, "_uuid_bridge_", originatee_session);
+ switch_channel_set_flag(originatee_channel, CF_TAGGED);
+ switch_channel_set_private(originator_channel, SWITCH_UUID_BRIDGE, originatee_session);
/* switch_channel_set_state_flag sets flags you want to be set when the next state change happens */
switch_channel_set_state_flag(originator_channel, CF_TRANSFER);
/* change the states and let the chips fall where they may */
switch_channel_set_state(originator_channel, CS_TRANSMIT);
switch_channel_set_state(originatee_channel, CS_TRANSMIT);
-
+
status = SWITCH_STATUS_SUCCESS;
+
+ while(switch_channel_get_state(originatee_channel) < CS_HANGUP && switch_channel_test_flag(originatee_channel, CF_TAGGED)) {
+ switch_yield(20000);
+ }
} else {
switch_core_session_rwunlock(originator_session);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "no channel for originatee uuid %s\n", originatee_uuid);