Author: anthm Date: Mon Apr 27 09:15:55 2009 New Revision: 13162 Log: add loopback_bowout variable (set to false to skip auto-bowout) Modified: freeswitch/trunk/src/mod/endpoints/mod_loopback/mod_loopback.c Modified: freeswitch/trunk/src/mod/endpoints/mod_loopback/mod_loopback.c ============================================================================== --- freeswitch/trunk/src/mod/endpoints/mod_loopback/mod_loopback.c (original) +++ freeswitch/trunk/src/mod/endpoints/mod_loopback/mod_loopback.c Mon Apr 27 09:15:55 2009 @@ -640,21 +640,27 @@ ) { const char *a_uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE); const char *b_uuid = switch_channel_get_variable(tech_pvt->other_channel, SWITCH_SIGNAL_BOND_VARIABLE); - + const char *vetoa, *vetob; + switch_set_flag_locked(tech_pvt, TFLAG_BOWOUT); switch_set_flag_locked(tech_pvt->other_tech_pvt, TFLAG_BOWOUT); + + vetoa = switch_channel_get_variable(tech_pvt->channel, "loopback_bowout"); + vetob = switch_channel_get_variable(tech_pvt->other_tech_pvt->channel, "loopback_bowout"); + + if ((!vetoa || switch_true(vetoa)) && (!vetob || switch_true(vetob))) { + switch_clear_flag_locked(tech_pvt, TFLAG_WRITE); + switch_clear_flag_locked(tech_pvt->other_tech_pvt, TFLAG_WRITE); + + if (a_uuid && b_uuid) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "%s detected bridge on both ends, attempting direct connection.\n", switch_channel_get_name(channel)); - switch_clear_flag_locked(tech_pvt, TFLAG_WRITE); - switch_clear_flag_locked(tech_pvt->other_tech_pvt, TFLAG_WRITE); - - if (a_uuid && b_uuid) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, - "%s detected bridge on both ends, attempting direct connection.\n", switch_channel_get_name(channel)); - - /* channel_masquerade eat your heart out....... */ - switch_ivr_uuid_bridge(a_uuid, b_uuid); - switch_mutex_unlock(tech_pvt->mutex); - return SWITCH_STATUS_SUCCESS; + /* channel_masquerade eat your heart out....... */ + switch_ivr_uuid_bridge(a_uuid, b_uuid); + switch_mutex_unlock(tech_pvt->mutex); + return SWITCH_STATUS_SUCCESS; + } } } @@ -675,9 +681,10 @@ if (switch_queue_trypush(tech_pvt->other_tech_pvt->frame_queue, clone) != SWITCH_STATUS_SUCCESS) { switch_frame_free(&clone); } + + switch_set_flag_locked(tech_pvt->other_tech_pvt, TFLAG_WRITE); } - switch_set_flag_locked(tech_pvt->other_tech_pvt, TFLAG_WRITE); status = SWITCH_STATUS_SUCCESS; }