From 564dc7e493c2ebbe86019e73cfbb0877d52197fc Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 21 Oct 2010 22:35:24 -0500 Subject: [PATCH] return break in mod_sndfile when seek returns failure --- src/mod/formats/mod_sndfile/mod_sndfile.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/mod/formats/mod_sndfile/mod_sndfile.c b/src/mod/formats/mod_sndfile/mod_sndfile.c index a99759fc3b..a0ddba07d0 100644 --- a/src/mod/formats/mod_sndfile/mod_sndfile.c +++ b/src/mod/formats/mod_sndfile/mod_sndfile.c @@ -242,16 +242,23 @@ static switch_status_t sndfile_file_close(switch_file_handle_t *handle) static switch_status_t sndfile_file_seek(switch_file_handle_t *handle, unsigned int *cur_sample, int64_t samples, int whence) { sndfile_context *context = handle->private_info; - + sf_count_t count; + switch_status_t r = SWITCH_STATUS_SUCCESS; + if (!handle->seekable) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "File is not seekable\n"); return SWITCH_STATUS_NOTIMPL; } - *cur_sample = (unsigned int) sf_seek(context->handle, samples, whence); - handle->pos = *cur_sample; - - return SWITCH_STATUS_SUCCESS; + if ((count = sf_seek(context->handle, samples, whence)) == ((sf_count_t) -1)) { + r = SWITCH_STATUS_BREAK; + count = sf_seek(context->handle, -1, SEEK_END); + } + + *cur_sample = (unsigned int) count; + handle->pos = *cur_sample; + + return r; } static switch_status_t sndfile_file_read(switch_file_handle_t *handle, void *data, size_t *len)