[Freeswitch-branches] [commit] r11430 - in freeswitch/branches/1.0/src: . mod/formats/mod_local_stream mod/languages/mod_managed mod/languages/mod_managed/managed
FreeSWITCH SVN
mikej at freeswitch.org
Thu Jan 22 15:14:07 PST 2009
Author: mikej
Date: Thu Jan 22 17:14:07 2009
New Revision: 11430
Log:
core: fix double close of file handles and add recording of native files (r:11108-11113)
Modified:
freeswitch/branches/1.0/src/mod/formats/mod_local_stream/mod_local_stream.c
freeswitch/branches/1.0/src/mod/languages/mod_managed/freeswitch_wrap.cxx
freeswitch/branches/1.0/src/mod/languages/mod_managed/managed/swig.cs
freeswitch/branches/1.0/src/switch_core_file.c
freeswitch/branches/1.0/src/switch_ivr_play_say.c
Modified: freeswitch/branches/1.0/src/mod/formats/mod_local_stream/mod_local_stream.c
==============================================================================
--- freeswitch/branches/1.0/src/mod/formats/mod_local_stream/mod_local_stream.c (original)
+++ freeswitch/branches/1.0/src/mod/formats/mod_local_stream/mod_local_stream.c Thu Jan 22 17:14:07 2009
@@ -251,7 +251,7 @@
done:
- if (fh.file_interface) {
+ if (switch_test_flag((&fh), SWITCH_FILE_OPEN)) {
switch_core_file_close(&fh);
}
Modified: freeswitch/branches/1.0/src/mod/languages/mod_managed/freeswitch_wrap.cxx
==============================================================================
--- freeswitch/branches/1.0/src/mod/languages/mod_managed/freeswitch_wrap.cxx (original)
+++ freeswitch/branches/1.0/src/mod/languages/mod_managed/freeswitch_wrap.cxx Thu Jan 22 17:14:07 2009
@@ -1510,6 +1510,17 @@
}
+SWIGEXPORT int SWIGSTDCALL CSharp_SWITCH_DEFAULT_FILE_BUFFER_LEN_get() {
+ int jresult ;
+ int result;
+
+ result = (int) 65536;
+
+ jresult = result;
+ return jresult;
+}
+
+
SWIGEXPORT void SWIGSTDCALL CSharp_switch_dtmf_t_digit_set(void * jarg1, char jarg2) {
switch_dtmf_t *arg1 = (switch_dtmf_t *) 0 ;
char arg2 ;
@@ -6143,13 +6154,15 @@
}
-SWIGEXPORT void SWIGSTDCALL CSharp_switch_core_session_reset(void * jarg1, int jarg2) {
+SWIGEXPORT void SWIGSTDCALL CSharp_switch_core_session_reset(void * jarg1, int jarg2, int jarg3) {
switch_core_session_t *arg1 = (switch_core_session_t *) 0 ;
switch_bool_t arg2 ;
+ switch_bool_t arg3 ;
arg1 = (switch_core_session_t *)jarg1;
arg2 = (switch_bool_t)jarg2;
- switch_core_session_reset(arg1,arg2);
+ arg3 = (switch_bool_t)jarg3;
+ switch_core_session_reset(arg1,arg2,arg3);
}
@@ -13093,6 +13106,81 @@
}
+SWIGEXPORT void SWIGSTDCALL CSharp_switch_file_handle_pre_buffer_set(void * jarg1, void * jarg2) {
+ switch_file_handle *arg1 = (switch_file_handle *) 0 ;
+ switch_buffer_t *arg2 = (switch_buffer_t *) 0 ;
+
+ arg1 = (switch_file_handle *)jarg1;
+ arg2 = (switch_buffer_t *)jarg2;
+ if (arg1) (arg1)->pre_buffer = arg2;
+
+}
+
+
+SWIGEXPORT void * SWIGSTDCALL CSharp_switch_file_handle_pre_buffer_get(void * jarg1) {
+ void * jresult ;
+ switch_file_handle *arg1 = (switch_file_handle *) 0 ;
+ switch_buffer_t *result = 0 ;
+
+ arg1 = (switch_file_handle *)jarg1;
+ result = (switch_buffer_t *) ((arg1)->pre_buffer);
+ jresult = (void *)result;
+ return jresult;
+}
+
+
+SWIGEXPORT void SWIGSTDCALL CSharp_switch_file_handle_pre_buffer_data_set(void * jarg1, void * jarg2) {
+ switch_file_handle *arg1 = (switch_file_handle *) 0 ;
+ unsigned char *arg2 = (unsigned char *) 0 ;
+
+ arg1 = (switch_file_handle *)jarg1;
+ arg2 = (unsigned char *)jarg2;
+ if (arg1) (arg1)->pre_buffer_data = arg2;
+
+}
+
+
+SWIGEXPORT void * SWIGSTDCALL CSharp_switch_file_handle_pre_buffer_data_get(void * jarg1) {
+ void * jresult ;
+ switch_file_handle *arg1 = (switch_file_handle *) 0 ;
+ unsigned char *result = 0 ;
+
+ arg1 = (switch_file_handle *)jarg1;
+ result = (unsigned char *) ((arg1)->pre_buffer_data);
+ jresult = (void *)result;
+ return jresult;
+}
+
+
+SWIGEXPORT void SWIGSTDCALL CSharp_switch_file_handle_pre_buffer_datalen_set(void * jarg1, void * jarg2) {
+ switch_file_handle *arg1 = (switch_file_handle *) 0 ;
+ switch_size_t arg2 ;
+ switch_size_t *argp2 ;
+
+ arg1 = (switch_file_handle *)jarg1;
+ argp2 = (switch_size_t *)jarg2;
+ if (!argp2) {
+ SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Attempt to dereference null switch_size_t", 0);
+ return ;
+ }
+ arg2 = *argp2;
+ if (arg1) (arg1)->pre_buffer_datalen = arg2;
+
+}
+
+
+SWIGEXPORT void * SWIGSTDCALL CSharp_switch_file_handle_pre_buffer_datalen_get(void * jarg1) {
+ void * jresult ;
+ switch_file_handle *arg1 = (switch_file_handle *) 0 ;
+ switch_size_t result;
+
+ arg1 = (switch_file_handle *)jarg1;
+ result = ((arg1)->pre_buffer_datalen);
+ jresult = new switch_size_t((switch_size_t &)result);
+ return jresult;
+}
+
+
SWIGEXPORT void SWIGSTDCALL CSharp_switch_file_handle_file_set(void * jarg1, char * jarg2) {
switch_file_handle *arg1 = (switch_file_handle *) 0 ;
char *arg2 = (char *) 0 ;
@@ -18377,6 +18465,26 @@
}
+SWIGEXPORT void SWIGSTDCALL CSharp_switch_channel_event_set_basic_data(void * jarg1, void * jarg2) {
+ switch_channel_t *arg1 = (switch_channel_t *) 0 ;
+ switch_event_t *arg2 = (switch_event_t *) 0 ;
+
+ arg1 = (switch_channel_t *)jarg1;
+ arg2 = (switch_event_t *)jarg2;
+ switch_channel_event_set_basic_data(arg1,arg2);
+}
+
+
+SWIGEXPORT void SWIGSTDCALL CSharp_switch_channel_event_set_extended_data(void * jarg1, void * jarg2) {
+ switch_channel_t *arg1 = (switch_channel_t *) 0 ;
+ switch_event_t *arg2 = (switch_event_t *) 0 ;
+
+ arg1 = (switch_channel_t *)jarg1;
+ arg2 = (switch_event_t *)jarg2;
+ switch_channel_event_set_extended_data(arg1,arg2);
+}
+
+
SWIGEXPORT char * SWIGSTDCALL CSharp_switch_channel_expand_variables(void * jarg1, char * jarg2) {
char * jresult ;
switch_channel_t *arg1 = (switch_channel_t *) 0 ;
Modified: freeswitch/branches/1.0/src/mod/languages/mod_managed/managed/swig.cs
==============================================================================
--- freeswitch/branches/1.0/src/mod/languages/mod_managed/managed/swig.cs (original)
+++ freeswitch/branches/1.0/src/mod/languages/mod_managed/managed/swig.cs Thu Jan 22 17:14:07 2009
@@ -1344,8 +1344,8 @@
return ret;
}
- public static void switch_core_session_reset(SWIGTYPE_p_switch_core_session session, switch_bool_t flush_dtmf) {
- freeswitchPINVOKE.switch_core_session_reset(SWIGTYPE_p_switch_core_session.getCPtr(session), (int)flush_dtmf);
+ public static void switch_core_session_reset(SWIGTYPE_p_switch_core_session session, switch_bool_t flush_dtmf, switch_bool_t reset_read_codec) {
+ freeswitchPINVOKE.switch_core_session_reset(SWIGTYPE_p_switch_core_session.getCPtr(session), (int)flush_dtmf, (int)reset_read_codec);
}
public static switch_status_t switch_core_session_write_frame(SWIGTYPE_p_switch_core_session session, switch_frame frame, uint flags, int stream_id) {
@@ -2581,6 +2581,14 @@
freeswitchPINVOKE.switch_channel_event_set_data(SWIGTYPE_p_switch_channel.getCPtr(channel), switch_event.getCPtr(arg1));
}
+ public static void switch_channel_event_set_basic_data(SWIGTYPE_p_switch_channel channel, switch_event arg1) {
+ freeswitchPINVOKE.switch_channel_event_set_basic_data(SWIGTYPE_p_switch_channel.getCPtr(channel), switch_event.getCPtr(arg1));
+ }
+
+ public static void switch_channel_event_set_extended_data(SWIGTYPE_p_switch_channel channel, switch_event arg1) {
+ freeswitchPINVOKE.switch_channel_event_set_extended_data(SWIGTYPE_p_switch_channel.getCPtr(channel), switch_event.getCPtr(arg1));
+ }
+
public static string switch_channel_expand_variables(SWIGTYPE_p_switch_channel channel, string arg1) {
string ret = freeswitchPINVOKE.switch_channel_expand_variables(SWIGTYPE_p_switch_channel.getCPtr(channel), arg1);
return ret;
@@ -4109,6 +4117,7 @@
public static readonly string SWITCH_SPEECH_KEY = freeswitchPINVOKE.SWITCH_SPEECH_KEY_get();
public static readonly string SWITCH_UUID_BRIDGE = freeswitchPINVOKE.SWITCH_UUID_BRIDGE_get();
public static readonly int SWITCH_BITS_PER_BYTE = freeswitchPINVOKE.SWITCH_BITS_PER_BYTE_get();
+ public static readonly int SWITCH_DEFAULT_FILE_BUFFER_LEN = freeswitchPINVOKE.SWITCH_DEFAULT_FILE_BUFFER_LEN_get();
public static readonly int SWITCH_MAX_STACKS = freeswitchPINVOKE.SWITCH_MAX_STACKS_get();
public static readonly int SWITCH_THREAD_STACKSIZE = freeswitchPINVOKE.SWITCH_THREAD_STACKSIZE_get();
public static readonly int SWITCH_SYSTEM_THREAD_STACKSIZE = freeswitchPINVOKE.SWITCH_SYSTEM_THREAD_STACKSIZE_get();
@@ -4690,6 +4699,9 @@
[DllImport("mod_managed", EntryPoint="CSharp_SWITCH_BITS_PER_BYTE_get")]
public static extern int SWITCH_BITS_PER_BYTE_get();
+ [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_DEFAULT_FILE_BUFFER_LEN_get")]
+ public static extern int SWITCH_DEFAULT_FILE_BUFFER_LEN_get();
+
[DllImport("mod_managed", EntryPoint="CSharp_switch_dtmf_t_digit_set")]
public static extern void switch_dtmf_t_digit_set(HandleRef jarg1, char jarg2);
@@ -5798,7 +5810,7 @@
public static extern int switch_core_session_write_video_frame(HandleRef jarg1, HandleRef jarg2, uint jarg3, int jarg4);
[DllImport("mod_managed", EntryPoint="CSharp_switch_core_session_reset")]
- public static extern void switch_core_session_reset(HandleRef jarg1, int jarg2);
+ public static extern void switch_core_session_reset(HandleRef jarg1, int jarg2, int jarg3);
[DllImport("mod_managed", EntryPoint="CSharp_switch_core_session_write_frame")]
public static extern int switch_core_session_write_frame(HandleRef jarg1, HandleRef jarg2, uint jarg3, int jarg4);
@@ -7438,6 +7450,24 @@
[DllImport("mod_managed", EntryPoint="CSharp_switch_file_handle_dbuflen_get")]
public static extern IntPtr switch_file_handle_dbuflen_get(HandleRef jarg1);
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_file_handle_pre_buffer_set")]
+ public static extern void switch_file_handle_pre_buffer_set(HandleRef jarg1, HandleRef jarg2);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_file_handle_pre_buffer_get")]
+ public static extern IntPtr switch_file_handle_pre_buffer_get(HandleRef jarg1);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_file_handle_pre_buffer_data_set")]
+ public static extern void switch_file_handle_pre_buffer_data_set(HandleRef jarg1, HandleRef jarg2);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_file_handle_pre_buffer_data_get")]
+ public static extern IntPtr switch_file_handle_pre_buffer_data_get(HandleRef jarg1);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_file_handle_pre_buffer_datalen_set")]
+ public static extern void switch_file_handle_pre_buffer_datalen_set(HandleRef jarg1, HandleRef jarg2);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_file_handle_pre_buffer_datalen_get")]
+ public static extern IntPtr switch_file_handle_pre_buffer_datalen_get(HandleRef jarg1);
+
[DllImport("mod_managed", EntryPoint="CSharp_switch_file_handle_file_set")]
public static extern void switch_file_handle_file_set(HandleRef jarg1, string jarg2);
@@ -8743,6 +8773,12 @@
[DllImport("mod_managed", EntryPoint="CSharp_switch_channel_event_set_data")]
public static extern void switch_channel_event_set_data(HandleRef jarg1, HandleRef jarg2);
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_channel_event_set_basic_data")]
+ public static extern void switch_channel_event_set_basic_data(HandleRef jarg1, HandleRef jarg2);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_channel_event_set_extended_data")]
+ public static extern void switch_channel_event_set_extended_data(HandleRef jarg1, HandleRef jarg2);
+
[DllImport("mod_managed", EntryPoint="CSharp_switch_channel_expand_variables")]
public static extern string switch_channel_expand_variables(HandleRef jarg1, string jarg2);
@@ -19956,7 +19992,9 @@
SWITCH_FILE_NATIVE = (1 << 9),
SWITCH_FILE_SEEK = (1 << 10),
SWITCH_FILE_OPEN = (1 << 11),
- SWITCH_FILE_CALLBACK = (1 << 12)
+ SWITCH_FILE_CALLBACK = (1 << 12),
+ SWITCH_FILE_DONE = (1 << 13),
+ SWITCH_FILE_BUFFER_DONE = (1 << 14)
}
}
@@ -20304,6 +20342,40 @@
}
}
+ public SWIGTYPE_p_switch_buffer pre_buffer {
+ set {
+ freeswitchPINVOKE.switch_file_handle_pre_buffer_set(swigCPtr, SWIGTYPE_p_switch_buffer.getCPtr(value));
+ }
+ get {
+ IntPtr cPtr = freeswitchPINVOKE.switch_file_handle_pre_buffer_get(swigCPtr);
+ SWIGTYPE_p_switch_buffer ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_switch_buffer(cPtr, false);
+ return ret;
+ }
+ }
+
+ public SWIGTYPE_p_unsigned_char pre_buffer_data {
+ set {
+ freeswitchPINVOKE.switch_file_handle_pre_buffer_data_set(swigCPtr, SWIGTYPE_p_unsigned_char.getCPtr(value));
+ }
+ get {
+ IntPtr cPtr = freeswitchPINVOKE.switch_file_handle_pre_buffer_data_get(swigCPtr);
+ SWIGTYPE_p_unsigned_char ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_unsigned_char(cPtr, false);
+ return ret;
+ }
+ }
+
+ public SWIGTYPE_p_switch_size_t pre_buffer_datalen {
+ set {
+ freeswitchPINVOKE.switch_file_handle_pre_buffer_datalen_set(swigCPtr, SWIGTYPE_p_switch_size_t.getCPtr(value));
+ if (freeswitchPINVOKE.SWIGPendingException.Pending) throw freeswitchPINVOKE.SWIGPendingException.Retrieve();
+ }
+ get {
+ SWIGTYPE_p_switch_size_t ret = new SWIGTYPE_p_switch_size_t(freeswitchPINVOKE.switch_file_handle_pre_buffer_datalen_get(swigCPtr), true);
+ if (freeswitchPINVOKE.SWIGPendingException.Pending) throw freeswitchPINVOKE.SWIGPendingException.Retrieve();
+ return ret;
+ }
+ }
+
public string file {
set {
freeswitchPINVOKE.switch_file_handle_file_set(swigCPtr, value);
Modified: freeswitch/branches/1.0/src/switch_core_file.c
==============================================================================
--- freeswitch/branches/1.0/src/switch_core_file.c (original)
+++ freeswitch/branches/1.0/src/switch_core_file.c Thu Jan 22 17:14:07 2009
@@ -132,7 +132,7 @@
{
switch_status_t status = SWITCH_STATUS_FALSE;
switch_size_t want, got, orig_len = *len;
-
+
switch_assert(fh != NULL);
switch_assert(fh->file_interface != NULL);
@@ -155,19 +155,21 @@
if (fh->pre_buffer) {
switch_size_t rlen;
+ int asis = switch_test_flag(fh, SWITCH_FILE_NATIVE);
+
if (!switch_test_flag(fh, SWITCH_FILE_BUFFER_DONE)) {
if (!switch_buffer_inuse(fh->pre_buffer)) {
- rlen = fh->pre_buffer_datalen / 2;
+ rlen = asis ? fh->pre_buffer_datalen : fh->pre_buffer_datalen / 2;
if ((status = fh->file_interface->file_read(fh, fh->pre_buffer_data, &rlen)) != SWITCH_STATUS_SUCCESS || !rlen) {
switch_set_flag(fh, SWITCH_FILE_BUFFER_DONE);
} else {
- switch_buffer_write(fh->pre_buffer, fh->pre_buffer_data, rlen * 2);
+ switch_buffer_write(fh->pre_buffer, fh->pre_buffer_data, asis ? rlen : rlen * 2);
}
}
}
- rlen = switch_buffer_read(fh->pre_buffer, data, *len * 2);
- *len = rlen / 2;
+ rlen = switch_buffer_read(fh->pre_buffer, data, asis ? *len : *len * 2);
+ *len = asis ? rlen : rlen / 2;
if (*len == 0) {
switch_set_flag(fh, SWITCH_FILE_DONE);
@@ -278,13 +280,14 @@
if (fh->pre_buffer) {
switch_size_t rlen, blen;
switch_status_t status = SWITCH_STATUS_SUCCESS;
+ int asis = switch_test_flag(fh, SWITCH_FILE_NATIVE);
- switch_buffer_write(fh->pre_buffer, data, *len * 2);
+ switch_buffer_write(fh->pre_buffer, data, asis ? *len : *len * 2);
rlen = switch_buffer_inuse(fh->pre_buffer);
if (rlen >= fh->pre_buffer_datalen) {
blen = switch_buffer_read(fh->pre_buffer, fh->pre_buffer_data, fh->pre_buffer_datalen);
- blen /= 2;
+ if (!asis) blen /= 2;
if ((status = fh->file_interface->file_write(fh, fh->pre_buffer_data, &blen)) != SWITCH_STATUS_SUCCESS) {
*len = 0;
}
@@ -346,6 +349,10 @@
switch_assert(fh != NULL);
switch_assert(fh->file_interface != NULL);
+ if (!switch_test_flag(fh, SWITCH_FILE_OPEN)) {
+ return SWITCH_STATUS_FALSE;
+ }
+
switch_clear_flag(fh, SWITCH_FILE_OPEN);
status = fh->file_interface->file_close(fh);
@@ -356,9 +363,11 @@
if (fh->pre_buffer) {
if (switch_test_flag(fh, SWITCH_FILE_FLAG_WRITE)) {
switch_size_t rlen, blen;
+ int asis = switch_test_flag(fh, SWITCH_FILE_NATIVE);
+
while((rlen = switch_buffer_inuse(fh->pre_buffer))) {
blen = switch_buffer_read(fh->pre_buffer, fh->pre_buffer_data, fh->pre_buffer_datalen);
- blen /= 2;
+ if (asis) blen /= 2;
if (fh->file_interface->file_write(fh, fh->pre_buffer_data, &blen) != SWITCH_STATUS_SUCCESS) {
break;
}
Modified: freeswitch/branches/1.0/src/switch_ivr_play_say.c
==============================================================================
--- freeswitch/branches/1.0/src/switch_ivr_play_say.c (original)
+++ freeswitch/branches/1.0/src/switch_ivr_play_say.c Thu Jan 22 17:14:07 2009
@@ -384,6 +384,7 @@
const char *vval;
time_t start = 0;
uint32_t org_silence_hits = 0;
+ int asis = 0;
switch_assert(read_codec != NULL);
@@ -396,6 +397,30 @@
fh->channels = read_codec->implementation->number_of_channels;
fh->native_rate = read_codec->implementation->actual_samples_per_second;
+
+
+ if (!strstr(file, SWITCH_URL_SEPARATOR)) {
+ char *ext;
+ const char *prefix;
+
+ prefix = switch_channel_get_variable(channel, "sound_prefix");
+ if (!prefix) {
+ prefix = SWITCH_GLOBAL_dirs.base_dir;
+ }
+
+ if (!switch_is_file_path(file)) {
+ file = switch_core_session_sprintf(session, "%s%s%s", prefix, SWITCH_PATH_SEPARATOR, file);
+ }
+ if ((ext = strrchr(file, '.'))) {
+ ext++;
+ } else {
+ ext = read_codec->implementation->iananame;
+ file = switch_core_session_sprintf(session, "%s.%s", file, ext);
+ asis = 1;
+ }
+ }
+
+
if (switch_core_file_open(fh,
file,
fh->channels,
@@ -406,6 +431,10 @@
return SWITCH_STATUS_GENERR;
}
+ if (switch_test_flag(fh, SWITCH_FILE_NATIVE)) {
+ asis = 1;
+ }
+
switch_channel_pre_answer(channel);
if ((p = switch_channel_get_variable(channel, "RECORD_TITLE"))) {
@@ -444,37 +473,43 @@
switch_channel_set_variable(channel, "RECORD_DATE", NULL);
}
- codec_name = "L16";
- if (switch_core_codec_init(&codec,
- codec_name,
- NULL,
- read_codec->implementation->actual_samples_per_second,
- read_codec->implementation->microseconds_per_packet / 1000,
- read_codec->implementation->number_of_channels,
- SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL,
- switch_core_session_get_pool(session)) == SWITCH_STATUS_SUCCESS) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Raw Codec Activated\n");
- switch_core_session_set_read_codec(session, &codec);
- } else {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,
- "Raw Codec Activation Failed %s@%uhz %u channels %dms\n", codec_name, fh->samplerate,
- fh->channels, read_codec->implementation->microseconds_per_packet / 1000);
- switch_core_file_close(fh);
- switch_core_session_reset(session, SWITCH_TRUE, SWITCH_TRUE);
- return SWITCH_STATUS_GENERR;
+ if (!asis) {
+ codec_name = "L16";
+ if (switch_core_codec_init(&codec,
+ codec_name,
+ NULL,
+ read_codec->implementation->actual_samples_per_second,
+ read_codec->implementation->microseconds_per_packet / 1000,
+ read_codec->implementation->number_of_channels,
+ SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL,
+ switch_core_session_get_pool(session)) == SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Raw Codec Activated\n");
+ switch_core_session_set_read_codec(session, &codec);
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,
+ "Raw Codec Activation Failed %s@%uhz %u channels %dms\n", codec_name, fh->samplerate,
+ fh->channels, read_codec->implementation->microseconds_per_packet / 1000);
+ switch_core_file_close(fh);
+ switch_core_session_reset(session, SWITCH_TRUE, SWITCH_TRUE);
+ return SWITCH_STATUS_GENERR;
+ }
}
if (limit) {
start = switch_timestamp(NULL);
}
-
+
if (fh->thresh) {
- if (fh->silence_hits) {
- fh->silence_hits = fh->samplerate * fh->silence_hits / read_codec->implementation->samples_per_packet;
+ if (asis) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Can't detect silence on a native recording.\n");
} else {
- fh->silence_hits = fh->samplerate * 3 / read_codec->implementation->samples_per_packet;
+ if (fh->silence_hits) {
+ fh->silence_hits = fh->samplerate * fh->silence_hits / read_codec->implementation->samples_per_packet;
+ } else {
+ fh->silence_hits = fh->samplerate * 3 / read_codec->implementation->samples_per_packet;
+ }
+ org_silence_hits = fh->silence_hits;
}
- org_silence_hits = fh->silence_hits;
}
for (;;) {
@@ -543,7 +578,7 @@
}
}
- if (fh->thresh) {
+ if (!asis && fh->thresh) {
int16_t *fdata = (int16_t *) read_frame->data;
uint32_t samples = read_frame->datalen / sizeof(*fdata);
uint32_t score, count = 0, j = 0;
@@ -571,8 +606,8 @@
if (!switch_test_flag(fh, SWITCH_FILE_PAUSE) && !switch_test_flag(read_frame, SFF_CNG)) {
int16_t *data = read_frame->data;
- len = (switch_size_t) read_frame->datalen / 2;
-
+ len = (switch_size_t) asis ? read_frame->datalen : read_frame->datalen / 2;
+
if (switch_core_file_write(fh, data, &len) != SWITCH_STATUS_SUCCESS) {
break;
}
More information about the Freeswitch-branches
mailing list