diff --git a/src/include/switch_module_interfaces.h b/src/include/switch_module_interfaces.h index 17536c4966..ed0dcc3a57 100644 --- a/src/include/switch_module_interfaces.h +++ b/src/include/switch_module_interfaces.h @@ -317,7 +317,8 @@ struct switch_file_handle { 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; diff --git a/src/switch_core_file.c b/src/switch_core_file.c index 8cf75089cb..1cc3f20d69 100644 --- a/src/switch_core_file.c +++ b/src/switch_core_file.c @@ -177,6 +177,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_file_read(switch_file_handle_t *fh, 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 @@ SWITCH_DECLARE(switch_status_t) switch_core_file_read(switch_file_handle_t *fh, goto top; } + fh->samples_in += *len; + if (fh->channels > 1) { switch_mux_channels((int16_t *)data, *len, fh->channels); } @@ -317,11 +320,16 @@ SWITCH_DECLARE(switch_status_t) switch_core_file_write(switch_file_handle_t *fh, 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; } } diff --git a/src/switch_ivr_async.c b/src/switch_ivr_async.c index 881413c35b..14b5e03b8e 100644 --- a/src/switch_ivr_async.c +++ b/src/switch_ivr_async.c @@ -439,12 +439,23 @@ static switch_bool_t record_callback(switch_media_bug_t *bug, void *user_data, s 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) {