[Freeswitch-svn] [commit] r13065 - in freeswitch/trunk/src: . include mod/endpoints/mod_sofia
FreeSWITCH SVN
anthm at freeswitch.org
Thu Apr 16 15:13:55 PDT 2009
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)) {
More information about the Freeswitch-svn
mailing list