diff --git a/src/include/switch_core_media.h b/src/include/switch_core_media.h index 6379a88e6f..8483738286 100644 --- a/src/include/switch_core_media.h +++ b/src/include/switch_core_media.h @@ -144,8 +144,6 @@ typedef struct switch_core_media_params_s { char *sdp_username; - switch_mutex_t *mutex; - switch_payload_t te; switch_payload_t recv_te; diff --git a/src/mod/applications/mod_fifo/mod_fifo.c b/src/mod/applications/mod_fifo/mod_fifo.c index 1ff920eedb..bcec97bbb4 100644 --- a/src/mod/applications/mod_fifo/mod_fifo.c +++ b/src/mod/applications/mod_fifo/mod_fifo.c @@ -4178,7 +4178,7 @@ static switch_status_t load_config(int reload, int del_all) node = create_node(name, imp, globals.sql_mutex); } - if ((val = switch_xml_attr(fifo, "outbound_name")) && !zstr(val)) { + if ((val = switch_xml_attr(fifo, "outbound_name"))) { node->outbound_name = switch_core_strdup(node->pool, val); } diff --git a/src/mod/applications/mod_spandsp/mod_spandsp_modem.h b/src/mod/applications/mod_spandsp/mod_spandsp_modem.h index 717cb909c4..81c46bae78 100644 --- a/src/mod/applications/mod_spandsp/mod_spandsp_modem.h +++ b/src/mod/applications/mod_spandsp/mod_spandsp_modem.h @@ -32,6 +32,7 @@ */ #ifndef WIN32 +#undef HAVE_STDLIB_H #include "switch_private.h" #endif #if defined(HAVE_OPENPTY) || defined(HAVE_DEV_PTMX) || defined(HAVE_POSIX_OPENPT) || WIN32 diff --git a/src/mod/endpoints/mod_gsmopen/mod_gsmopen.2010.vcxproj b/src/mod/endpoints/mod_gsmopen/mod_gsmopen.2010.vcxproj index c71b738775..7014e8b1d9 100644 --- a/src/mod/endpoints/mod_gsmopen/mod_gsmopen.2010.vcxproj +++ b/src/mod/endpoints/mod_gsmopen/mod_gsmopen.2010.vcxproj @@ -84,7 +84,7 @@ - gsmlib\gsmlib-1.10-patched-13ubuntu;libctb-0.16\include;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src\msvc;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src;%(RootDir)%(Directory)..\..\..\..\libs\tiff-4.0.2\libtiff;%(AdditionalIncludeDirectories) + gsmlib\gsmlib-1.10-patched-13ubuntu;libctb-0.16\include;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src\msvc;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src;%(RootDir)%(Directory)..\..\..\..\libs\tiff-4.0.2\libtiff;%(RootDir)%(Directory)..\..\..\..\libs\jpeg-8d;%(AdditionalIncludeDirectories) NO_ALSA;%(PreprocessorDefinitions) @@ -101,7 +101,7 @@ - gsmlib\gsmlib-1.10-patched-13ubuntu;libctb-0.16\include;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src\msvc;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src;%(RootDir)%(Directory)..\..\..\..\libs\tiff-4.0.2\libtiff;%(AdditionalIncludeDirectories) + gsmlib\gsmlib-1.10-patched-13ubuntu;libctb-0.16\include;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src\msvc;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src;%(RootDir)%(Directory)..\..\..\..\libs\tiff-4.0.2\libtiff;%(RootDir)%(Directory)..\..\..\..\libs\jpeg-8d;%(AdditionalIncludeDirectories) @@ -117,7 +117,7 @@ X64 - gsmlib\gsmlib-1.10-patched-13ubuntu;libctb-0.16\include;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src\msvc;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src;%(RootDir)%(Directory)..\..\..\..\libs\tiff-4.0.2\libtiff;%(AdditionalIncludeDirectories) + gsmlib\gsmlib-1.10-patched-13ubuntu;libctb-0.16\include;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src\msvc;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src;%(RootDir)%(Directory)..\..\..\..\libs\tiff-4.0.2\libtiff;%(RootDir)%(Directory)..\..\..\..\libs\jpeg-8d;%(AdditionalIncludeDirectories) NO_ALSA;%(PreprocessorDefinitions) @@ -139,7 +139,7 @@ rpcrt4.lib "..\..\..\..\debug\libtiff.lib" "..\..\..\..\libs\spandsp\src\debug\ X64 - gsmlib\gsmlib-1.10-patched-13ubuntu;libctb-0.16\include;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src\msvc;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src;%(RootDir)%(Directory)..\..\..\..\libs\tiff-4.0.2\libtiff;%(AdditionalIncludeDirectories) + gsmlib\gsmlib-1.10-patched-13ubuntu;libctb-0.16\include;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src\msvc;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src;%(RootDir)%(Directory)..\..\..\..\libs\tiff-4.0.2\libtiff;%(RootDir)%(Directory)..\..\..\..\libs\jpeg-8d;%(AdditionalIncludeDirectories) diff --git a/src/mod/endpoints/mod_gsmopen/mod_gsmopen.2012.vcxproj b/src/mod/endpoints/mod_gsmopen/mod_gsmopen.2012.vcxproj index 30cb1f9fb2..004558e6b4 100644 --- a/src/mod/endpoints/mod_gsmopen/mod_gsmopen.2012.vcxproj +++ b/src/mod/endpoints/mod_gsmopen/mod_gsmopen.2012.vcxproj @@ -88,7 +88,7 @@ - gsmlib\gsmlib-1.10-patched-13ubuntu;libctb-0.16\include;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src\msvc;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src;%(RootDir)%(Directory)..\..\..\..\libs\tiff-4.0.2\libtiff;%(AdditionalIncludeDirectories) + gsmlib\gsmlib-1.10-patched-13ubuntu;libctb-0.16\include;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src\msvc;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src;%(RootDir)%(Directory)..\..\..\..\libs\tiff-4.0.2\libtiff;%(RootDir)%(Directory)..\..\..\..\libs\jpeg-8d;%(AdditionalIncludeDirectories) NO_ALSA;%(PreprocessorDefinitions) @@ -104,7 +104,7 @@ - gsmlib\gsmlib-1.10-patched-13ubuntu;libctb-0.16\include;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src\msvc;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src;%(RootDir)%(Directory)..\..\..\..\libs\tiff-4.0.2\libtiff;%(AdditionalIncludeDirectories) + gsmlib\gsmlib-1.10-patched-13ubuntu;libctb-0.16\include;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src\msvc;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src;%(RootDir)%(Directory)..\..\..\..\libs\tiff-4.0.2\libtiff;%(RootDir)%(Directory)..\..\..\..\libs\jpeg-8d;%(AdditionalIncludeDirectories) @@ -120,7 +120,7 @@ X64 - gsmlib\gsmlib-1.10-patched-13ubuntu;libctb-0.16\include;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src\msvc;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src;%(RootDir)%(Directory)..\..\..\..\libs\tiff-4.0.2\libtiff;%(AdditionalIncludeDirectories) + gsmlib\gsmlib-1.10-patched-13ubuntu;libctb-0.16\include;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src\msvc;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src;%(RootDir)%(Directory)..\..\..\..\libs\tiff-4.0.2\libtiff;%(RootDir)%(Directory)..\..\..\..\libs\jpeg-8d;%(AdditionalIncludeDirectories) NO_ALSA;%(PreprocessorDefinitions) @@ -140,7 +140,7 @@ X64 - gsmlib\gsmlib-1.10-patched-13ubuntu;libctb-0.16\include;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src\msvc;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src;%(RootDir)%(Directory)..\..\..\..\libs\tiff-4.0.2\libtiff;%(AdditionalIncludeDirectories) + gsmlib\gsmlib-1.10-patched-13ubuntu;libctb-0.16\include;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src\msvc;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src;%(RootDir)%(Directory)..\..\..\..\libs\tiff-4.0.2\libtiff;%(RootDir)%(Directory)..\..\..\..\libs\jpeg-8d;%(AdditionalIncludeDirectories) diff --git a/src/mod/endpoints/mod_sofia/sofia_glue.c b/src/mod/endpoints/mod_sofia/sofia_glue.c index 65b1984543..c99cd91068 100644 --- a/src/mod/endpoints/mod_sofia/sofia_glue.c +++ b/src/mod/endpoints/mod_sofia/sofia_glue.c @@ -156,7 +156,6 @@ void sofia_glue_attach_private(switch_core_session_t *session, sofia_profile_t * tech_pvt->mparams.extsipip = profile->extsipip; tech_pvt->mparams.extrtpip = profile->extrtpip; tech_pvt->mparams.local_network = profile->local_network; - tech_pvt->mparams.mutex = tech_pvt->sofia_mutex; tech_pvt->mparams.sipip = profile->sipip; tech_pvt->mparams.jb_msec = profile->jb_msec; tech_pvt->mparams.rtcp_audio_interval_msec = profile->rtcp_audio_interval_msec; diff --git a/src/mod/languages/mod_managed/freeswitch_wrap.2010.cxx b/src/mod/languages/mod_managed/freeswitch_wrap.2010.cxx index c37bffb7a1..90c1a2e68c 100644 --- a/src/mod/languages/mod_managed/freeswitch_wrap.2010.cxx +++ b/src/mod/languages/mod_managed/freeswitch_wrap.2010.cxx @@ -13563,6 +13563,18 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_cert_verify(void * jarg1) { } +SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_session_refresh_video(void * jarg1) { + int jresult ; + switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; + switch_status_t result; + + arg1 = (switch_core_session_t *)jarg1; + result = (switch_status_t)switch_core_session_refresh_video(arg1); + jresult = result; + return jresult; +} + + SWIGEXPORT void SWIGSTDCALL CSharp_switch_loadable_module_interface_module_name_set(void * jarg1, char * jarg2) { switch_loadable_module_interface *arg1 = (switch_loadable_module_interface *) 0 ; char *arg2 = (char *) 0 ; @@ -35218,26 +35230,6 @@ SWIGEXPORT void * SWIGSTDCALL CSharp_switch_rtp_get_private(void * jarg1) { } -SWIGEXPORT int SWIGSTDCALL CSharp_switch_rtp_activate_stun_ping(void * jarg1, char * jarg2, unsigned short jarg3, unsigned long jarg4, int jarg5) { - int jresult ; - switch_rtp_t *arg1 = (switch_rtp_t *) 0 ; - char *arg2 = (char *) 0 ; - switch_port_t arg3 ; - uint32_t arg4 ; - switch_bool_t arg5 ; - switch_status_t result; - - arg1 = (switch_rtp_t *)jarg1; - arg2 = (char *)jarg2; - arg3 = (switch_port_t)jarg3; - arg4 = (uint32_t)jarg4; - arg5 = (switch_bool_t)jarg5; - result = (switch_status_t)switch_rtp_activate_stun_ping(arg1,(char const *)arg2,arg3,arg4,arg5); - jresult = result; - return jresult; -} - - SWIGEXPORT void SWIGSTDCALL CSharp_switch_rtp_intentional_bugs(void * jarg1, int jarg2) { switch_rtp_t *arg1 = (switch_rtp_t *) 0 ; switch_rtp_bug_flag_t arg2 ; @@ -35312,6 +35304,14 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_rtp_has_dtls() { } +SWIGEXPORT void SWIGSTDCALL CSharp_switch_rtp_video_refresh(void * jarg1) { + switch_rtp_t *arg1 = (switch_rtp_t *) 0 ; + + arg1 = (switch_rtp_t *)jarg1; + switch_rtp_video_refresh(arg1); +} + + SWIGEXPORT void SWIGSTDCALL CSharp_switch_log_node_t_data_set(void * jarg1, char * jarg2) { switch_log_node_t *arg1 = (switch_log_node_t *) 0 ; char *arg2 = (char *) 0 ; diff --git a/src/mod/languages/mod_managed/managed/swig.2010.cs b/src/mod/languages/mod_managed/managed/swig.2010.cs index 44e6f034b9..ac74b01bb2 100644 --- a/src/mod/languages/mod_managed/managed/swig.2010.cs +++ b/src/mod/languages/mod_managed/managed/swig.2010.cs @@ -3127,6 +3127,11 @@ public class freeswitch { return ret; } + public static switch_status_t switch_core_session_refresh_video(SWIGTYPE_p_switch_core_session session) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_session_refresh_video(SWIGTYPE_p_switch_core_session.getCPtr(session)); + return ret; + } + public static switch_status_t switch_loadable_module_init(switch_bool_t autoload) { switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_loadable_module_init((int)autoload); return ret; @@ -6042,11 +6047,6 @@ public class freeswitch { return ret; } - public static switch_status_t switch_rtp_activate_stun_ping(SWIGTYPE_p_switch_rtp rtp_session, string stun_ip, ushort stun_port, uint packet_count, switch_bool_t funny) { - switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_rtp_activate_stun_ping(SWIGTYPE_p_switch_rtp.getCPtr(rtp_session), stun_ip, stun_port, packet_count, (int)funny); - return ret; - } - public static void switch_rtp_intentional_bugs(SWIGTYPE_p_switch_rtp rtp_session, switch_rtp_bug_flag_t bugs) { freeswitchPINVOKE.switch_rtp_intentional_bugs(SWIGTYPE_p_switch_rtp.getCPtr(rtp_session), (int)bugs); } @@ -6076,6 +6076,10 @@ public class freeswitch { return ret; } + public static void switch_rtp_video_refresh(SWIGTYPE_p_switch_rtp rtp_session) { + freeswitchPINVOKE.switch_rtp_video_refresh(SWIGTYPE_p_switch_rtp.getCPtr(rtp_session)); + } + public static switch_status_t switch_log_init(SWIGTYPE_p_apr_pool_t pool, switch_bool_t colorize) { switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_log_init(SWIGTYPE_p_apr_pool_t.getCPtr(pool), (int)colorize); return ret; @@ -10339,6 +10343,9 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_core_cert_verify")] public static extern int switch_core_cert_verify(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_core_session_refresh_video")] + public static extern int switch_core_session_refresh_video(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_loadable_module_interface_module_name_set")] public static extern void switch_loadable_module_interface_module_name_set(HandleRef jarg1, string jarg2); @@ -15463,9 +15470,6 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_rtp_get_private")] public static extern IntPtr switch_rtp_get_private(HandleRef jarg1); - [DllImport("mod_managed", EntryPoint="CSharp_switch_rtp_activate_stun_ping")] - public static extern int switch_rtp_activate_stun_ping(HandleRef jarg1, string jarg2, ushort jarg3, uint jarg4, int jarg5); - [DllImport("mod_managed", EntryPoint="CSharp_switch_rtp_intentional_bugs")] public static extern void switch_rtp_intentional_bugs(HandleRef jarg1, int jarg2); @@ -15484,6 +15488,9 @@ class freeswitchPINVOKE { [DllImport("mod_managed", EntryPoint="CSharp_switch_rtp_has_dtls")] public static extern int switch_rtp_has_dtls(); + [DllImport("mod_managed", EntryPoint="CSharp_switch_rtp_video_refresh")] + public static extern void switch_rtp_video_refresh(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_log_node_t_data_set")] public static extern void switch_log_node_t_data_set(HandleRef jarg1, string jarg2); @@ -25819,6 +25826,7 @@ public enum switch_channel_flag_t { CF_DTLS, CF_VERBOSE_SDP, CF_DTLS_OK, + CF_VIDEO_PASSIVE, CF_FLAG_MAX } diff --git a/src/switch_core_media.c b/src/switch_core_media.c index eb2f2eccf5..97ad761167 100644 --- a/src/switch_core_media.c +++ b/src/switch_core_media.c @@ -174,7 +174,7 @@ struct switch_media_handle_s { int payload_space; char *origin; - + switch_mutex_t *mutex; const switch_codec_implementation_t *negotiated_codecs[SWITCH_MAX_CODECS]; int num_negotiated_codecs; @@ -1036,6 +1036,8 @@ SWITCH_DECLARE(switch_status_t) switch_media_handle_create(switch_media_handle_t session->media_handle->engines[SWITCH_MEDIA_TYPE_VIDEO].read_frame.buflen = SWITCH_RTP_MAX_BUF_LEN; session->media_handle->mparams = params; + switch_mutex_init(&session->media_handle->mutex, SWITCH_MUTEX_NESTED, switch_core_session_get_pool(session)); + session->media_handle->engines[SWITCH_MEDIA_TYPE_AUDIO].ssrc = (uint32_t) ((intptr_t) &session->media_handle->engines[SWITCH_MEDIA_TYPE_AUDIO] + (uint32_t) time(NULL)); @@ -5022,10 +5024,10 @@ SWITCH_DECLARE(void)switch_core_media_set_local_sdp(switch_core_session_t *sessi return; } - if (smh->mparams->mutex) switch_mutex_lock(smh->mparams->mutex); + if (smh->mutex) switch_mutex_lock(smh->mutex); smh->mparams->local_sdp_str = dup ? switch_core_session_strdup(session, sdp_str) : (char *) sdp_str; switch_channel_set_variable(session->channel, "rtp_local_sdp_str", smh->mparams->local_sdp_str); - if (smh->mparams->mutex) switch_mutex_unlock(smh->mparams->mutex); + if (smh->mutex) switch_mutex_unlock(smh->mutex); } @@ -6612,7 +6614,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_receive_message(switch_core_se } - if (smh->mparams->mutex) switch_mutex_lock(smh->mparams->mutex); + if (smh->mutex) switch_mutex_lock(smh->mutex); if (switch_channel_down(session->channel)) { @@ -6698,7 +6700,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_receive_message(switch_core_se end_lock: - if (smh->mparams->mutex) switch_mutex_unlock(smh->mparams->mutex); + if (smh->mutex) switch_mutex_unlock(smh->mutex); end: diff --git a/src/switch_ivr_async.c b/src/switch_ivr_async.c index b7a6c01288..a3cb808ec0 100644 --- a/src/switch_ivr_async.c +++ b/src/switch_ivr_async.c @@ -1022,6 +1022,11 @@ struct record_helper { int native; uint32_t packet_len; int min_sec; + int final_timeout_ms; + int initial_timeout_ms; + int silence_threshold; + int silence_timeout_ms; + switch_time_t silence_time; int rready; int wready; switch_time_t last_read_time; @@ -1030,6 +1035,34 @@ struct record_helper { switch_codec_implementation_t read_impl; }; + +static switch_bool_t is_silence_frame(switch_frame_t *frame, int silence_threshold, switch_codec_implementation_t *codec_impl) +{ + int16_t *fdata = (int16_t *) frame->data; + uint32_t samples = frame->datalen / sizeof(*fdata); + switch_bool_t is_silence = SWITCH_TRUE; + uint32_t channel_num = 0; + + int divisor = 0; + if (!(divisor = codec_impl->samples_per_second / 8000)) { + divisor = 1; + } + + /* is silence only if every channel is silent */ + for (channel_num = 0; channel_num < codec_impl->number_of_channels && is_silence; channel_num++) { + uint32_t count = 0, j = channel_num; + double energy = 0; + for (count = 0; count < samples; count++) { + energy += abs(fdata[j]); + j += codec_impl->number_of_channels; + } + is_silence &= (uint32_t) (energy / (samples / divisor)) < silence_threshold; + } + + return is_silence; +} + + static switch_bool_t record_callback(switch_media_bug_t *bug, void *user_data, switch_abc_type_t type) { switch_core_session_t *session = switch_core_media_bug_get_session(bug); @@ -1048,6 +1081,8 @@ static switch_bool_t record_callback(switch_media_bug_t *bug, void *user_data, s switch_channel_event_set_data(channel, event); switch_event_fire(&event); } + rh->silence_time = switch_micro_time_now(); + rh->silence_timeout_ms = rh->initial_timeout_ms; switch_core_session_get_read_impl(session, &rh->read_impl); @@ -1204,6 +1239,7 @@ static switch_bool_t record_callback(switch_media_bug_t *bug, void *user_data, s status = switch_core_media_bug_read(bug, &frame, SWITCH_FALSE); if (status == SWITCH_STATUS_SUCCESS || status == SWITCH_STATUS_BREAK) { + len = (switch_size_t) frame.datalen / 2; if (len && switch_core_file_write(rh->fh, mask ? null_data : data, &len) != SWITCH_STATUS_SUCCESS && rh->hangup_on_error) { @@ -1212,6 +1248,32 @@ static switch_bool_t record_callback(switch_media_bug_t *bug, void *user_data, s switch_core_session_reset(session, SWITCH_TRUE, SWITCH_TRUE); return SWITCH_FALSE; } + + /* check for silence timeout */ + if (rh->silence_threshold) { + switch_codec_implementation_t read_impl = { 0 }; + switch_core_session_get_read_impl(session, &read_impl); + if (is_silence_frame(&frame, rh->silence_threshold, &read_impl)) { + if (!rh->silence_time) { + /* start of silence */ + rh->silence_time = switch_micro_time_now(); + } else { + /* continuing silence */ + int duration_ms = (switch_micro_time_now() - rh->silence_time) / 1000; + if (rh->silence_timeout_ms > 0 && duration_ms >= rh->silence_timeout_ms) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Recording file %s timeout: %i >= %i\n", rh->file, duration_ms, rh->silence_timeout_ms); + switch_core_media_bug_set_flag(bug, SMBF_PRUNE); + } + } + } else { /* not silence */ + if (rh->silence_time) { + /* end of silence */ + rh->silence_time = 0; + /* switch from initial timeout to final timeout */ + rh->silence_timeout_ms = rh->final_timeout_ms; + } + } + } } } break; @@ -2080,6 +2142,29 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_record_session(switch_core_session_t } } + if ((p = switch_channel_get_variable(channel, "RECORD_INITIAL_TIMEOUT_MS"))) { + int tmp = atoi(p); + if (tmp >= 0) { + rh->initial_timeout_ms = tmp; + rh->silence_threshold = 200; + } + } + + if ((p = switch_channel_get_variable(channel, "RECORD_FINAL_TIMEOUT_MS"))) { + int tmp = atoi(p); + if (tmp >= 0) { + rh->final_timeout_ms = tmp; + rh->silence_threshold = 200; + } + } + + if ((p = switch_channel_get_variable(channel, "RECORD_SILENCE_THRESHOLD"))) { + int tmp = atoi(p); + if (tmp >= 0) { + rh->silence_threshold = tmp; + } + } + rh->hangup_on_error = hangup_on_error; if ((status = switch_core_media_bug_add(session, "session_record", file, diff --git a/src/switch_ivr_bridge.c b/src/switch_ivr_bridge.c index 0e51910cd8..9e718a1096 100644 --- a/src/switch_ivr_bridge.c +++ b/src/switch_ivr_bridge.c @@ -52,7 +52,7 @@ static void *SWITCH_THREAD_FUNC video_bridge_thread(switch_thread_t *thread, voi switch_channel_t *channel = switch_core_session_get_channel(vh->session_a); switch_channel_t *b_channel = switch_core_session_get_channel(vh->session_b); switch_status_t status; - switch_frame_t *read_frame; + switch_frame_t *read_frame = 0; const char *source = switch_channel_get_variable(channel, "source"); const char *b_source = switch_channel_get_variable(b_channel, "source"); @@ -286,7 +286,13 @@ static void *audio_bridge_thread(switch_thread_t *thread, void *obj) } if (bypass_media_after_bridge) { - if (switch_stristr("loopback", switch_channel_get_name(chan_a)) || switch_stristr("loopback", switch_channel_get_name(chan_b))) { + const char *source_a = switch_channel_get_variable(chan_a, "source"); + const char *source_b = switch_channel_get_variable(chan_b, "source"); + + if (!source_a) source_a = ""; + if (!source_b) source_b = ""; + + if (switch_stristr("loopback", source_a) || switch_stristr("loopback", source_b)) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session_a), SWITCH_LOG_WARNING, "Cannot bypass media while bridged to a loopback address.\n"); bypass_media_after_bridge = 0; } diff --git a/src/switch_rtp.c b/src/switch_rtp.c index 0e381d0825..9096e7e88c 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -1335,7 +1335,7 @@ static void send_fir(switch_rtp_t *rtp_session) rtp_session->rtcp_ext_send_msg.header.recv_ssrc = htonl(rtp_session->stats.rtcp.peer_ssrc); fir->ssrc = htonl(rtp_session->stats.rtcp.peer_ssrc); - fir->seq = htonl(rtp_session->fir_seq++); + fir->seq = (uint8_t) htonl(rtp_session->fir_seq++); switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(rtp_session->session), SWITCH_LOG_DEBUG1, "Sending RTCP FIR %d\n", rtp_session->fir_seq); @@ -1371,7 +1371,6 @@ static void send_fir(switch_rtp_t *rtp_session) break; case zrtp_status_drop: switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error: zRTP protection drop with code %d\n", stat); - ret = (int)rtcp_bytes; goto end; break; case zrtp_status_fail: