[Freeswitch-svn] [commit] r6880 - freeswitch/trunk/src/mod/formats/mod_local_stream
Freeswitch SVN
anthm at freeswitch.org
Tue Dec 18 16:51:34 EST 2007
Author: anthm
Date: Tue Dec 18 16:51:34 2007
New Revision: 6880
Modified:
freeswitch/trunk/src/mod/formats/mod_local_stream/mod_local_stream.c
Log:
add shuffle to directory
Modified: freeswitch/trunk/src/mod/formats/mod_local_stream/mod_local_stream.c
==============================================================================
--- freeswitch/trunk/src/mod/formats/mod_local_stream/mod_local_stream.c (original)
+++ freeswitch/trunk/src/mod/formats/mod_local_stream/mod_local_stream.c Tue Dec 18 16:51:34 2007
@@ -55,7 +55,6 @@
};
typedef struct local_stream_context local_stream_context_t;
-
struct local_stream_source {
char *name;
char *location;
@@ -70,9 +69,21 @@
switch_dir_t *dir_handle;
switch_mutex_t *mutex;
switch_memory_pool_t *pool;
+ int shuffle;
};
typedef struct local_stream_source local_stream_source_t;
+static unsigned int S = 0;
+
+static int do_rand(void)
+{
+ srand(getpid() + ++S);
+ double r = ((double)rand() / ((double)(RAND_MAX)+(double)(1)));
+ int index = (r * 9) + 1;
+ return index;
+}
+
+
static void *SWITCH_THREAD_FUNC read_stream_thread(switch_thread_t *thread, void *obj)
{
local_stream_source_t *source = obj;
@@ -84,7 +95,7 @@
switch_buffer_t *audio_buffer;
switch_byte_t *dist_buf;
switch_size_t used;
-
+ int skip = 0;
if (!source->prebuf) {
source->prebuf = DEFAULT_PREBUFFER_SIZE;
@@ -93,6 +104,10 @@
switch_buffer_create_dynamic(&audio_buffer, 1024, source->prebuf + 10, 0);
dist_buf = switch_core_alloc(source->pool, source->prebuf + 10);
+ if (source->shuffle) {
+ skip = do_rand();
+ }
+
while(RUNNING) {
const char *fname;
@@ -101,7 +116,7 @@
return NULL;
}
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "open directory: %s\n", source->location);
+ //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "open directory: %s\n", source->location);
switch_yield(1000000);
while(RUNNING) {
@@ -137,6 +152,11 @@
}
+ if (skip > 0) {
+ skip--;
+ continue;
+ }
+
fname = path_buf;
fh.prebuf = source->prebuf;
@@ -188,7 +208,9 @@
}
switch_core_timer_destroy(&timer);
-
+ if (source->shuffle) {
+ skip = do_rand();
+ }
}
switch_dir_close(source->dir_handle);
@@ -318,28 +340,6 @@
switch_mutex_unlock(context->audio_mutex);
handle->sample_count += *len;
return SWITCH_STATUS_SUCCESS;
-#if 0
- local_stream_context_t *context = handle->private_info;
- switch_size_t bytes = 0;
- size_t need = *len * 2;
-
-
- switch_mutex_lock(context->audio_mutex);
- if ((bytes = switch_buffer_read(context->audio_buffer, data, need))) {
- *len = bytes / 2;
- } else {
- if (need > context->source->samples * 2) {
- need = context->source->samples * 2;
- }
-
- memset(data, 0, need);
- *len = need / 2;
- }
- switch_mutex_unlock(context->audio_mutex);
-
- handle->sample_count += *len;
- return SWITCH_STATUS_SUCCESS;
-#endif
}
static switch_status_t local_stream_file_write(switch_file_handle_t *handle, void *data, size_t *len)
@@ -411,6 +411,8 @@
if (tmp == 8000 || tmp == 16000) {
source->rate = tmp;
}
+ } else if (!strcasecmp(var, "shuffle")) {
+ source->shuffle = switch_true(val);
} else if (!strcasecmp(var, "prebuf")) {
int tmp = atoi(val);
if (tmp > 0) {
More information about the Freeswitch-svn
mailing list