mirror of
https://github.com/signalwire/freeswitch.git
synced 2026-07-19 02:31:53 +00:00
Merge branch 'master' into v1.4.beta
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -84,7 +84,7 @@
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<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;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<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)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>NO_ALSA;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
@@ -101,7 +101,7 @@
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<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;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<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)</AdditionalIncludeDirectories>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
@@ -117,7 +117,7 @@
|
||||
<TargetEnvironment>X64</TargetEnvironment>
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<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;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<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)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>NO_ALSA;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
@@ -139,7 +139,7 @@ rpcrt4.lib "..\..\..\..\debug\libtiff.lib" "..\..\..\..\libs\spandsp\src\debug\
|
||||
<TargetEnvironment>X64</TargetEnvironment>
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<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;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<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)</AdditionalIncludeDirectories>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<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;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<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)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>NO_ALSA;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
@@ -104,7 +104,7 @@
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<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;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<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)</AdditionalIncludeDirectories>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
@@ -120,7 +120,7 @@
|
||||
<TargetEnvironment>X64</TargetEnvironment>
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<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;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<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)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>NO_ALSA;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
@@ -140,7 +140,7 @@
|
||||
<TargetEnvironment>X64</TargetEnvironment>
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<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;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<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)</AdditionalIncludeDirectories>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 ;
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
+1
-2
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user