From 9263ef1f722dc6ba094bce0115b6176959989751 Mon Sep 17 00:00:00 2001 From: Brian West Date: Sat, 10 Mar 2007 02:36:55 +0000 Subject: [PATCH] add url syntax for playback git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@4501 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- src/include/switch_types.h | 2 ++ src/include/switch_utils.h | 4 ++-- src/switch_core.c | 16 ++++++++++++---- src/switch_ivr.c | 25 +++++++++++++++---------- 4 files changed, 31 insertions(+), 16 deletions(-) diff --git a/src/include/switch_types.h b/src/include/switch_types.h index 0ad18ed7af..4d5e2c4047 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -105,6 +105,8 @@ SWITCH_BEGIN_EXTERN_C #define SWITCH_PATH_SEPARATOR "/" #endif +#define SWITCH_URL_SEPARATOR "://" + #ifndef SWITCH_PREFIX_DIR #define SWITCH_PREFIX_DIR "." #endif diff --git a/src/include/switch_utils.h b/src/include/switch_utils.h index ab58c80bb0..8584b41c7d 100644 --- a/src/include/switch_utils.h +++ b/src/include/switch_utils.h @@ -54,9 +54,9 @@ SWITCH_BEGIN_EXTERN_C codec->implementation->microseconds_per_frame / 1000) #ifdef WIN32 -#define switch_is_file_path(file) (*(file +1) == ':' || *file == '/') +#define switch_is_file_path(file) (*(file +1) == ':' || *file == '/' || strstr(file, SWITCH_URL_SEPARATOR)) #else -#define switch_is_file_path(file) (*file == '/') +#define switch_is_file_path(file) ((*file == '/') || strstr(file, SWITCH_URL_SEPARATOR)) #endif /*! diff --git a/src/switch_core.c b/src/switch_core.c index 5634d0c644..7f55ee5e21 100644 --- a/src/switch_core.c +++ b/src/switch_core.c @@ -1019,12 +1019,20 @@ SWITCH_DECLARE(switch_status_t) switch_core_file_open(switch_file_handle_t *fh, { char *ext; switch_status_t status; + char stream_name[128] = ""; + char *rhs = NULL; - if ((ext = strrchr(file_path, '.')) == 0) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid Format\n"); - return SWITCH_STATUS_FALSE; + if ((rhs = strstr(file_path, SWITCH_URL_SEPARATOR))) { + switch_copy_string(stream_name, file_path, (rhs+1) - file_path); + ext = stream_name; + file_path = rhs + 3; + } else { + if ((ext = strrchr(file_path, '.')) == 0) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid Format\n"); + return SWITCH_STATUS_FALSE; + } + ext++; } - ext++; if ((fh->file_interface = switch_loadable_module_get_file_interface(ext)) == 0) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "invalid file format [%s]!\n", ext); diff --git a/src/switch_ivr.c b/src/switch_ivr.c index 7dbf35d57e..3e3fc121f7 100644 --- a/src/switch_ivr.c +++ b/src/switch_ivr.c @@ -1112,15 +1112,19 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_file(switch_core_session_t *sess prefix = switch_channel_get_variable(channel, "sound_prefix"); timer_name = switch_channel_get_variable(channel, "timer_name"); - if (file) { - if (prefix && *file != '/' && *file != '\\' && *(file+1) != ':') { - char *new_file; - uint32_t len; - len = (uint32_t)strlen(file) + (uint32_t)strlen(prefix) + 10; - new_file = switch_core_session_alloc(session, len); - snprintf(new_file, len, "%s/%s", prefix, file); - file = new_file; - } + if (!file) { + return SWITCH_STATUS_FALSE; + } + + if (!strstr(file, SWITCH_URL_SEPARATOR)) { + if (prefix && *file != '/' && *file != '\\' && *(file+1) != ':') { + char *new_file; + uint32_t len; + len = (uint32_t)strlen(file) + (uint32_t)strlen(prefix) + 10; + new_file = switch_core_session_alloc(session, len); + snprintf(new_file, len, "%s/%s", prefix, file); + file = new_file; + } if ((ext = strrchr(file, '.'))) { ext++; @@ -1135,6 +1139,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_file(switch_core_session_t *sess asis = 1; } } + if (!fh) { fh = &lfh; @@ -1146,7 +1151,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_file(switch_core_session_t *sess sample_start = fh->samples; fh->samples = 0; } - + if (switch_core_file_open(fh, file, SWITCH_FILE_FLAG_READ | SWITCH_FILE_DATA_SHORT,