[Freeswitch-svn] [commit] r8487 - freeswitch/trunk/src
Freeswitch SVN
anthm at freeswitch.org
Tue May 20 11:40:28 EDT 2008
Author: anthm
Date: Tue May 20 11:40:27 2008
New Revision: 8487
Modified:
freeswitch/trunk/src/switch_ivr_bridge.c
Log:
update
Modified: freeswitch/trunk/src/switch_ivr_bridge.c
==============================================================================
--- freeswitch/trunk/src/switch_ivr_bridge.c (original)
+++ freeswitch/trunk/src/switch_ivr_bridge.c Tue May 20 11:40:27 2008
@@ -99,7 +99,7 @@
uint32_t loop_count = 0;
const char *app_name = NULL, *app_arg = NULL;
const char *hook_var = NULL;
- int nosuspend = 0;
+ int inner_bridge = 0;
#ifdef SWITCH_VIDEO_IN_THREADS
struct vid_helper vh = { 0 };
uint32_t vid_launch = 0;
@@ -123,16 +123,24 @@
ans_b = switch_channel_test_flag(chan_b, CF_ANSWERED);
}
- switch_channel_set_flag(chan_a, CF_BRIDGED);
-
- nosuspend = switch_channel_test_flag(chan_a, CF_INNER_BRIDGE);
+ inner_bridge = switch_channel_test_flag(chan_a, CF_INNER_BRIDGE);
+
+ switch_channel_set_flag(chan_a, CF_BRIDGED);
+
+
+ switch_channel_wait_for_flag(chan_b, CF_BRIDGED, SWITCH_TRUE, 1000000);
+
for (;;) {
switch_channel_state_t b_state;
switch_status_t status;
switch_event_t *event;
loop_count++;
+ if (!switch_channel_test_flag(chan_b, CF_BRIDGED)) {
+ goto end_of_bridge_loop;
+ }
+
if (!switch_channel_ready(chan_a)) {
goto end_of_bridge_loop;
}
@@ -160,7 +168,7 @@
switch_core_session_kill_channel(session_b, SWITCH_SIG_BREAK);
}
- if (!nosuspend && (switch_channel_test_flag(chan_a, CF_SUSPEND) || switch_channel_test_flag(chan_b, CF_SUSPEND))) {
+ if (!inner_bridge && (switch_channel_test_flag(chan_a, CF_SUSPEND) || switch_channel_test_flag(chan_b, CF_SUSPEND))) {
status = switch_core_session_read_frame(session_a, &read_frame, SWITCH_IO_FLAG_NONE, stream_id);
if (!SWITCH_READ_ACCEPTABLE(status)) {
@@ -290,7 +298,7 @@
}
#endif
- if (!nosuspend) {
+ if (!inner_bridge) {
hook_var = switch_channel_get_variable(chan_a, SWITCH_API_BRIDGE_END_VARIABLE);
}
@@ -319,7 +327,7 @@
msg.from = __FILE__;
switch_core_session_receive_message(session_a, &msg);
- if (!nosuspend && switch_channel_get_state(chan_a) < CS_HANGUP) {
+ if (!inner_bridge && switch_channel_get_state(chan_a) < CS_HANGUP) {
if ((app_name = switch_channel_get_variable(chan_a, SWITCH_EXEC_AFTER_BRIDGE_APP_VARIABLE))) {
switch_caller_extension_t *extension = NULL;
if ((extension = switch_caller_extension_new(session_a, app_name, app_name)) == 0) {
@@ -345,7 +353,9 @@
switch_core_session_reset(session_a, SWITCH_TRUE);
switch_channel_set_variable(chan_a, SWITCH_BRIDGE_VARIABLE, NULL);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "BRIDGE THREAD DONE [%s]\n", switch_channel_get_name(chan_a));
- switch_channel_clear_flag(chan_a, CF_BRIDGED);
+ if (!inner_bridge) {
+ switch_channel_clear_flag(chan_a, CF_BRIDGED);
+ }
switch_core_session_rwunlock(session_b);
return NULL;
}
@@ -648,7 +658,7 @@
switch_channel_state_t state;
switch_event_t *event;
int br = 0;
- int nosuspend = switch_channel_test_flag(caller_channel, CF_INNER_BRIDGE);
+ int inner_bridge = switch_channel_test_flag(caller_channel, CF_INNER_BRIDGE);
switch_channel_set_flag(caller_channel, CF_ORIGINATOR);
switch_channel_clear_flag(caller_channel, CF_TRANSFER);
@@ -758,8 +768,7 @@
audio_bridge_thread(NULL, (void *) a_leg);
switch_channel_clear_flag(caller_channel, CF_ORIGINATOR);
- //make sure this doesnt break anything
-
+
if (!switch_channel_test_flag(peer_channel, CF_TRANSFER) && switch_channel_get_state(peer_channel) == CS_EXCHANGE_MEDIA) {
switch_channel_set_state(peer_channel, CS_RESET);
}
@@ -793,7 +802,7 @@
state = switch_channel_get_state(caller_channel);
- if (!switch_channel_test_flag(caller_channel, CF_TRANSFER) && !nosuspend) {
+ if (!switch_channel_test_flag(caller_channel, CF_TRANSFER) && !inner_bridge) {
if ((state != CS_EXECUTE && state != CS_PARK && state != CS_ROUTING) ||
(switch_channel_test_flag(peer_channel, CF_ANSWERED) && state < CS_HANGUP &&
switch_true(switch_channel_get_variable(caller_channel, SWITCH_HANGUP_AFTER_BRIDGE_VARIABLE)))) {
More information about the Freeswitch-svn
mailing list