[commit] r13065 - in freeswitch/trunk/src: . include mod/endpoints/mod_sofia
Author: anthm Date: Thu Apr 16 17:13:55 2009 New Revision: 13065 Log: autoflush on bridge and add bridge_hangup_cause variable to indicate the hangup cause of the last bridged channel Modified: freeswitch/trunk/src/include/switch_rtp.h freeswitch/trunk/src/include/switch_types.h freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c freeswitch/trunk/src/switch_ivr_bridge.c freeswitch/trunk/src/switch_rtp.c Modified: freeswitch/trunk/src/include/switch_rtp.h ============================================================================== --- freeswitch/trunk/src/include/switch_rtp.h (original) +++ freeswitch/trunk/src/include/switch_rtp.h Thu Apr 16 17:13:55 2009 @@ -351,7 +351,7 @@ */ SWITCH_DECLARE(switch_status_t) switch_rtp_zerocopy_read_frame(switch_rtp_t *rtp_session, switch_frame_t *frame, switch_io_flag_t io_flags); -SWITCH_DECLARE(void) rtp_flush_read_buffer(switch_rtp_t *rtp_session); +SWITCH_DECLARE(void) rtp_flush_read_buffer(switch_rtp_t *rtp_session, switch_rtp_flush_t flush); /*! \brief Enable VAD on an RTP Session Modified: freeswitch/trunk/src/include/switch_types.h ============================================================================== --- freeswitch/trunk/src/include/switch_types.h (original) +++ freeswitch/trunk/src/include/switch_types.h Thu Apr 16 17:13:55 2009 @@ -110,6 +110,7 @@ #define SWITCH_PATH_SEPARATOR "/" #endif #define SWITCH_URL_SEPARATOR "://" +#define SWITCH_BRIDGE_HANGUP_CAUSE_VARIABLE "bridge_hangup_cause" #define SWITCH_READ_TERMINATOR_USED_VARIABLE "read_terminator_used" #define SWITCH_SEND_SILENCE_WHEN_IDLE_VARIABLE "send_silence_when_idle" #define SWITCH_CURRENT_APPLICATION_VARIABLE "current_application" @@ -443,6 +444,11 @@ switch_rtp_numbers_t outbound; } switch_rtp_stats_t; +typedef enum { + SWITCH_RTP_FLUSH_ONCE, + SWITCH_RTP_FLUSH_STICK, + SWITCH_RTP_FLUSH_UNSTICK +} switch_rtp_flush_t; #define SWITCH_RTP_CNG_PAYLOAD 13 @@ -464,7 +470,7 @@ SWITCH_RTP_FLAG_DATAWAIT - Do not return from reads unless there is data even when non blocking SWITCH_RTP_FLAG_BUGGY_2833 - Emulate the bug in cisco equipment to allow interop SWITCH_RTP_FLAG_PASS_RFC2833 - Pass 2833 (ignore it) - SWITCH_RTP_FLAG_AUTO_CNG - Generate outbound CNG frames when idle + SWITCH_RTP_FLAG_AUTO_CNG - Generate outbound CNG frames when idle </pre> */ typedef enum { @@ -489,7 +495,8 @@ SWITCH_RTP_FLAG_PROXY_MEDIA = (1 << 18), SWITCH_RTP_FLAG_SHUTDOWN = (1 << 19), SWITCH_RTP_FLAG_FLUSH = (1 << 20), - SWITCH_RTP_FLAG_AUTOFLUSH = (1 << 21) + SWITCH_RTP_FLAG_AUTOFLUSH = (1 << 21), + SWITCH_RTP_FLAG_STICKY_FLUSH = (1 << 22) } switch_rtp_flag_enum_t; typedef uint32_t switch_rtp_flag_t; Modified: freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c ============================================================================== --- freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c (original) +++ freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c Thu Apr 16 17:13:55 2009 @@ -1015,10 +1015,18 @@ goto end; case SWITCH_MESSAGE_INDICATE_BRIDGE: + if (switch_rtp_ready(tech_pvt->rtp_session)) { + rtp_flush_read_buffer(tech_pvt->rtp_session, SWITCH_RTP_FLUSH_STICK); + } + goto end; case SWITCH_MESSAGE_INDICATE_UNBRIDGE: + if (switch_rtp_ready(tech_pvt->rtp_session)) { + rtp_flush_read_buffer(tech_pvt->rtp_session, SWITCH_RTP_FLUSH_UNSTICK); + } + goto end; case SWITCH_MESSAGE_INDICATE_AUDIO_SYNC: if (switch_rtp_ready(tech_pvt->rtp_session)) { - rtp_flush_read_buffer(tech_pvt->rtp_session); + rtp_flush_read_buffer(tech_pvt->rtp_session, SWITCH_RTP_FLUSH_ONCE); } goto end; Modified: freeswitch/trunk/src/switch_ivr_bridge.c ============================================================================== --- freeswitch/trunk/src/switch_ivr_bridge.c (original) +++ freeswitch/trunk/src/switch_ivr_bridge.c Thu Apr 16 17:13:55 2009 @@ -829,6 +829,7 @@ int br = 0; int inner_bridge = switch_channel_test_flag(caller_channel, CF_INNER_BRIDGE); const char *var; + switch_call_cause_t cause; switch_channel_set_flag(caller_channel, CF_ORIGINATOR); @@ -961,6 +962,14 @@ switch_cond_next(); } + if ((cause = switch_channel_get_cause(caller_channel))) { + switch_channel_set_variable(peer_channel, SWITCH_BRIDGE_HANGUP_CAUSE_VARIABLE, switch_channel_cause2str(cause)); + } + + if ((cause = switch_channel_get_cause(peer_channel))) { + switch_channel_set_variable(caller_channel, SWITCH_BRIDGE_HANGUP_CAUSE_VARIABLE, switch_channel_cause2str(cause)); + } + switch_core_session_rwunlock(peer_session); } else { Modified: freeswitch/trunk/src/switch_rtp.c ============================================================================== --- freeswitch/trunk/src/switch_rtp.c (original) +++ freeswitch/trunk/src/switch_rtp.c Thu Apr 16 17:13:55 2009 @@ -1330,10 +1330,20 @@ } } -SWITCH_DECLARE(void) rtp_flush_read_buffer(switch_rtp_t *rtp_session) +SWITCH_DECLARE(void) rtp_flush_read_buffer(switch_rtp_t *rtp_session, switch_rtp_flush_t flush) { if (switch_rtp_ready(rtp_session) && !switch_test_flag(rtp_session, SWITCH_RTP_FLAG_PROXY_MEDIA)) { switch_set_flag_locked(rtp_session, SWITCH_RTP_FLAG_FLUSH); + switch (flush) { + case SWITCH_RTP_FLUSH_STICK: + switch_set_flag_locked(rtp_session, SWITCH_RTP_FLAG_STICKY_FLUSH); + break; + case SWITCH_RTP_FLUSH_UNSTICK: + switch_clear_flag_locked(rtp_session, SWITCH_RTP_FLAG_STICKY_FLUSH); + break; + default: + break; + } } } @@ -1459,7 +1469,7 @@ int do_cng = 0; if (rtp_session->timer.interval) { - if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_AUTOFLUSH)) { + if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_AUTOFLUSH) || switch_test_flag(rtp_session, SWITCH_RTP_FLAG_STICKY_FLUSH)) { if (switch_poll(rtp_session->read_pollfd, 1, &fdr, 1) == SWITCH_STATUS_SUCCESS) { hot_socket = 1; } @@ -1526,7 +1536,7 @@ } if (bytes && rtp_session->recv_msg.header.m && rtp_session->recv_msg.header.pt != rtp_session->te) { - rtp_flush_read_buffer(rtp_session); + rtp_flush_read_buffer(rtp_session, SWITCH_RTP_FLUSH_ONCE); } if (bytes && switch_test_flag(rtp_session, SWITCH_RTP_FLAG_AUTOADJ) && switch_sockaddr_get_port(rtp_session->from_addr)) {
participants (1)
-
FreeSWITCH SVN