From 0064924ba59e660e63ef3009a27033eb0e6b90ea Mon Sep 17 00:00:00 2001 From: Brian West Date: Mon, 2 Feb 2009 18:11:41 +0000 Subject: [PATCH] look for more sound files at various rates git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@11601 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- src/mod/formats/mod_sndfile/mod_sndfile.c | 48 ++++++++++++++--------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/src/mod/formats/mod_sndfile/mod_sndfile.c b/src/mod/formats/mod_sndfile/mod_sndfile.c index c6c473800e..c9697dfb02 100644 --- a/src/mod/formats/mod_sndfile/mod_sndfile.c +++ b/src/mod/formats/mod_sndfile/mod_sndfile.c @@ -62,8 +62,12 @@ static switch_status_t sndfile_file_open(switch_file_handle_t *handle, const cha char *ext; struct format_map *map = NULL; switch_status_t status = SWITCH_STATUS_SUCCESS; - char *alt_path = NULL, *next, *last, *ldup = NULL; + char *alt_path = NULL, *last, *ldup = NULL; size_t alt_len = 0; + int rates[4] = {8000, 16000, 32000, 48000}; + int i; + char ps[2] = {'/', '\\'}; + int x; if ((ext = strrchr(path, '.')) == 0) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid Format\n"); @@ -146,26 +150,32 @@ static switch_status_t sndfile_file_open(switch_file_handle_t *handle, const cha switch_zmalloc(alt_path, alt_len); switch_copy_string(alt_path, path, alt_len); - if ((last = strrchr(alt_path, '/'))) { - next = ++last; - ldup = strdup(last); - switch_assert(ldup); - switch_snprintf(next, alt_len - (last - alt_path), "%d%s%s", handle->samplerate, SWITCH_PATH_SEPARATOR, ldup); - if ((context->handle = sf_open(alt_path, mode, &context->sfinfo))) { - path = alt_path; + + for (x = 0; x < 2; x++) { + if ((last = strrchr(alt_path, ps[x]))) { + last++; + ldup = strdup(last); + switch_assert(ldup); + switch_snprintf(last, alt_len - (last - alt_path), "%d%s%s", handle->samplerate, SWITCH_PATH_SEPARATOR, ldup); + if ((context->handle = sf_open(alt_path, mode, &context->sfinfo))) { + path = alt_path; + } else { + /* Try to find the file at the highest rate possible if we can't find one that matches the exact rate. + If we don't find any, we will default back to the original file name. + */ + for (i = 3; i > 0; i--) { + switch_snprintf(last, alt_len - (last - alt_path), "%d%s%s", rates[i], SWITCH_PATH_SEPARATOR, ldup); + if ((context->handle = sf_open(alt_path, mode, &context->sfinfo))) { + path = alt_path; + break; + } + } + } } - } -#ifdef WIN32 - else if ((last = strrchr(alt_path, '\\'))) { - next = ++last; - ldup = strdup(last); - switch_assert(ldup); - switch_snprintf(next, alt_len - (last - alt_path), "%d%s%s", handle->samplerate, SWITCH_PATH_SEPARATOR, ldup); - if ((context->handle = sf_open(alt_path, mode, &context->sfinfo))) { - path = alt_path; - } - } +#ifndef WIN32 + break; #endif + } if (!context->handle) { if ((context->handle = sf_open(path, mode, &context->sfinfo)) == 0) {