From b1977f2e363cea583c3fd5ed7f6cee9675e7d43f Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Sat, 5 Jan 2008 22:17:26 +0000 Subject: [PATCH] update git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@7103 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- src/include/switch_channel.h | 2 +- .../applications/mod_dptools/mod_dptools.c | 10 +++---- src/mod/endpoints/mod_sofia/mod_sofia.c | 18 +++++++++++++ src/mod/endpoints/mod_sofia/sofia_glue.c | 27 +++++++++++++------ src/switch_channel.c | 14 ++++++++-- src/switch_ivr_bridge.c | 1 - 6 files changed, 55 insertions(+), 17 deletions(-) diff --git a/src/include/switch_channel.h b/src/include/switch_channel.h index 146690f205..00b9b78cc6 100644 --- a/src/include/switch_channel.h +++ b/src/include/switch_channel.h @@ -75,7 +75,7 @@ SWITCH_DECLARE(switch_channel_state_t) switch_channel_get_running_state(switch_c SWITCH_DECLARE(uint8_t) switch_channel_ready(switch_channel_t *channel); SWITCH_DECLARE(void) switch_channel_wait_for_state(switch_channel_t *channel, switch_channel_t *other_channel, switch_channel_state_t want_state); -SWITCH_DECLARE(switch_status_t) switch_channel_wait_for_flag(switch_channel_t *channel, switch_channel_flag_t want_flag, uint32_t to); +SWITCH_DECLARE(switch_status_t) switch_channel_wait_for_flag(switch_channel_t *channel, switch_channel_flag_t want_flag, switch_bool_t pres, uint32_t to); SWITCH_DECLARE(switch_channel_state_t) switch_channel_perform_set_state(switch_channel_t *channel, const char *file, const char *func, int line, switch_channel_state_t state); diff --git a/src/mod/applications/mod_dptools/mod_dptools.c b/src/mod/applications/mod_dptools/mod_dptools.c index 8408a625ae..fa9f9d6f10 100644 --- a/src/mod/applications/mod_dptools/mod_dptools.c +++ b/src/mod/applications/mod_dptools/mod_dptools.c @@ -1273,11 +1273,11 @@ SWITCH_STANDARD_APP(record_function) if (l) { if (*l == '+') { l++; - if (l) { - limit = atoi(l); - if (limit < 0) { - limit = 0; - } + } + if (l) { + limit = atoi(l); + if (limit < 0) { + limit = 0; } } } diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index b85bc2c052..31b68378b1 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -252,11 +252,29 @@ switch_status_t sofia_on_hangup(switch_core_session_t *session) cause = switch_channel_get_cause(channel); if (switch_test_flag(tech_pvt, TFLAG_SIP_HOLD) && cause != SWITCH_CAUSE_ATTENDED_TRANSFER) { + const char *buuid; + switch_core_session_t *bsession; + switch_channel_t *bchannel; + const char *lost_ext; if (tech_pvt->max_missed_packets) { switch_rtp_set_max_missed_packets(tech_pvt->rtp_session, tech_pvt->max_missed_packets); } switch_channel_presence(tech_pvt->channel, "unknown", "unhold"); + + if ((buuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE))) { + if ((bsession = switch_core_session_locate(buuid))) { + bchannel = switch_core_session_get_channel(bsession); + if (switch_channel_test_flag(bchannel, CF_BROADCAST)) { + if ((lost_ext = switch_channel_get_variable(bchannel, "left_hanging_extension"))) { + switch_ivr_session_transfer(bsession, lost_ext, NULL, NULL); + } + switch_channel_stop_broadcast(bchannel); + } + switch_core_session_rwunlock(bsession); + } + } + switch_clear_flag_locked(tech_pvt, TFLAG_SIP_HOLD); } diff --git a/src/mod/endpoints/mod_sofia/sofia_glue.c b/src/mod/endpoints/mod_sofia/sofia_glue.c index 68366dff48..6b28c0a3c2 100644 --- a/src/mod/endpoints/mod_sofia/sofia_glue.c +++ b/src/mod/endpoints/mod_sofia/sofia_glue.c @@ -1395,24 +1395,35 @@ uint8_t sofia_glue_negotiate_sdp(switch_core_session_t *session, sdp_session_t * } if (stream) { - switch_ivr_displace_session(tech_pvt->session, stream, 0, "rl"); + //switch_ivr_displace_session(tech_pvt->session, stream, 0, "rl"); + switch_ivr_broadcast(switch_channel_get_variable(tech_pvt->channel, SWITCH_SIGNAL_BOND_VARIABLE), stream, SMF_ECHO_ALEG | SMF_LOOP); } } } else { if (switch_test_flag(tech_pvt, TFLAG_SIP_HOLD)) { - const char *stream; + const char *uuid; + switch_core_session_t *b_session; + + //const char *stream; if (tech_pvt->max_missed_packets) { switch_rtp_set_max_missed_packets(tech_pvt->rtp_session, tech_pvt->max_missed_packets); } - if (!(stream = switch_channel_get_variable(tech_pvt->channel, SWITCH_HOLD_MUSIC_VARIABLE))) { - stream = tech_pvt->profile->hold_music; - } + if ((uuid = switch_channel_get_variable(tech_pvt->channel, SWITCH_SIGNAL_BOND_VARIABLE)) && (b_session = switch_core_session_locate(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, 2000); + switch_core_session_rwunlock(b_session); + } - if (stream) { - switch_ivr_stop_displace_session(tech_pvt->session, stream); - } + //if (!(stream = switch_channel_get_variable(tech_pvt->channel, SWITCH_HOLD_MUSIC_VARIABLE))) { + //stream = tech_pvt->profile->hold_music; + //} + + //if (stream) { + //switch_ivr_stop_displace_session(tech_pvt->session, stream); + //} switch_clear_flag_locked(tech_pvt, TFLAG_SIP_HOLD); switch_channel_presence(tech_pvt->channel, "unknown", "unhold"); diff --git a/src/switch_channel.c b/src/switch_channel.c index 0672560d4e..637b4232e9 100644 --- a/src/switch_channel.c +++ b/src/switch_channel.c @@ -550,14 +550,24 @@ SWITCH_DECLARE(void) switch_channel_wait_for_state(switch_channel_t *channel, sw } } -SWITCH_DECLARE(switch_status_t) switch_channel_wait_for_flag(switch_channel_t *channel, switch_channel_flag_t want_flag, uint32_t to) +SWITCH_DECLARE(switch_status_t) switch_channel_wait_for_flag(switch_channel_t *channel, switch_channel_flag_t want_flag, switch_bool_t pres, uint32_t to) { if (to) { to++; } - while(!switch_test_flag(channel, want_flag)) { + for(;;) { + if (pres) { + if (switch_test_flag(channel, want_flag)) { + break; + } + } else { + if (!switch_test_flag(channel, want_flag)) { + break; + } + } + switch_yield(1000); if (to && !--to) { return SWITCH_STATUS_TIMEOUT; diff --git a/src/switch_ivr_bridge.c b/src/switch_ivr_bridge.c index a415ecb6b9..6d24c0f0a0 100644 --- a/src/switch_ivr_bridge.c +++ b/src/switch_ivr_bridge.c @@ -222,7 +222,6 @@ static void *audio_bridge_thread(switch_thread_t * thread, void *obj) end: switch_core_session_kill_channel(session_b, SWITCH_SIG_BREAK); - switch_channel_stop_broadcast(chan_b); switch_core_session_reset(session_a); 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));