Author: anthm Date: Fri Mar 20 08:58:45 2009 New Revision: 12682 Log: FSCORE-339 Modified: freeswitch/trunk/src/include/switch_module_interfaces.h freeswitch/trunk/src/switch_core_file.c freeswitch/trunk/src/switch_ivr_async.c Modified: freeswitch/trunk/src/include/switch_module_interfaces.h ============================================================================== --- freeswitch/trunk/src/include/switch_module_interfaces.h (original) +++ freeswitch/trunk/src/include/switch_module_interfaces.h Fri Mar 20 08:58:45 2009 @@ -317,7 +317,8 @@ uint32_t thresh; uint32_t silence_hits; uint32_t offset_pos; - //uint32_t last_pos; + switch_size_t samples_in; + switch_size_t samples_out; int32_t vol; switch_audio_resampler_t *resampler; switch_buffer_t *buffer; Modified: freeswitch/trunk/src/switch_core_file.c ============================================================================== --- freeswitch/trunk/src/switch_core_file.c (original) +++ freeswitch/trunk/src/switch_core_file.c Fri Mar 20 08:58:45 2009 @@ -177,6 +177,7 @@ 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 { + fh->samples_in += rlen; if (fh->channels > 1) { switch_mux_channels((int16_t *)fh->pre_buffer_data, rlen, fh->channels); } @@ -202,6 +203,8 @@ goto top; } + fh->samples_in += *len; + if (fh->channels > 1) { switch_mux_channels((int16_t *)data, *len, fh->channels); } @@ -317,11 +320,16 @@ if ((status = fh->file_interface->file_write(fh, fh->pre_buffer_data, &blen)) != SWITCH_STATUS_SUCCESS) { *len = 0; } + fh->samples_out += blen; } return status; } else { - return fh->file_interface->file_write(fh, data, len); + switch_status_t status; + if ((status = fh->file_interface->file_write(fh, data, len)) == SWITCH_STATUS_SUCCESS) { + fh->samples_out += *len; + } + return status; } } Modified: freeswitch/trunk/src/switch_ivr_async.c ============================================================================== --- freeswitch/trunk/src/switch_ivr_async.c (original) +++ freeswitch/trunk/src/switch_ivr_async.c Fri Mar 20 08:58:45 2009 @@ -439,12 +439,23 @@ case SWITCH_ABC_TYPE_INIT: break; case SWITCH_ABC_TYPE_CLOSE: - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Stop recording file %s\n", rh->file); - switch_channel_set_private(channel, rh->file, NULL); + { + switch_codec_implementation_t read_impl = {0}; + switch_core_session_get_read_impl(session, &read_impl); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Stop recording file %s\n", rh->file); + switch_channel_set_private(channel, rh->file, NULL); + + if (rh->fh) { + switch_core_file_close(rh->fh); + } - if (rh->fh) { - switch_core_file_close(rh->fh); + if (rh->fh->samples_out < read_impl.samples_per_second * 3) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Discarding short file %s\n", rh->file); + switch_file_remove(rh->file, switch_core_session_get_pool(session)); + } } + break; case SWITCH_ABC_TYPE_READ_PING: if (rh->fh) {