]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
look for more sound files at various rates
authorBrian West <brian@freeswitch.org>
Mon, 2 Feb 2009 18:11:41 +0000 (18:11 +0000)
committerBrian West <brian@freeswitch.org>
Mon, 2 Feb 2009 18:11:41 +0000 (18:11 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@11601 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/mod/formats/mod_sndfile/mod_sndfile.c

index c6c473800e4511d9ef92378bcbf1b2a1be1cd91c..c9697dfb028fa1ca7424f4f886931371e0445262 100644 (file)
@@ -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;
-               }
-       }
-#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;
+
+       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;
+                                       }
+                               }
+                       }
                }
-       }
+#ifndef WIN32
+               break;
 #endif
+       }
 
        if (!context->handle) {
                if ((context->handle = sf_open(path, mode, &context->sfinfo)) == 0) {