]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
add adjustable buffering to mod_shout (see example in config file)
authorAnthony Minessale <anthony.minessale@gmail.com>
Sat, 9 Jun 2007 23:02:38 +0000 (23:02 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Sat, 9 Jun 2007 23:02:38 +0000 (23:02 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@5302 d0543943-73ff-0310-b7d9-9358b9ac24b2

conf/default_context.xml
src/include/switch_module_interfaces.h
src/mod/formats/mod_shout/mod_shout.c
src/switch_ivr_play_say.c

index 19d65a7d9dd2eea7d76944bae39dd4c35f4825a7..2efe1bc8274a7bbf007ee026284cbf9a46b2c610 100644 (file)
     </condition>
   </extension>
 
+  <extension name="9192">
+    <condition field="destination_number" expression="^9192$">
+      <!-- Maintain Buffer of 128k of audio (default is 64k) -->
+      <action application="set" data="stream_prebuffer=131072"/>
+      <!-- Play a stream -->
+      <action application="playback" data="shout://mp3.ihets.org/wfyihd132"/>
+    </condition>
+  </extension>
+
+
   <!-- Example extension for require auth per-call. -->
   <extension name="9191">
     <!-- Match the destination digits of 9191 -->
index 34392f077ebdcc5382ba45bf63049447bd53b74c..a8967536e9973a3a04375312870def401a73964e 100644 (file)
@@ -221,6 +221,8 @@ struct switch_file_handle {
        int speed;
        /*! the handle's memory pool */
        switch_memory_pool_t *memory_pool;
+       /*! pre-buffer x bytes for streams */
+       uint32_t prebuf;
        /*! private data for the format module to store handle specific info */
        void *private_info;
        char *handler;
index 40bac015a167646bba6e8e6a39229c914a12e864..d7b91cd3174ab1be7fb7f0ff8bee523dbee66d2b 100644 (file)
@@ -65,6 +65,7 @@ struct shout_context {
        int samplerate;
        uint8_t thread_running;
        uint8_t shout_init;
+    uint32_t prebuf;
 };
 
 typedef struct shout_context shout_context_t;
@@ -336,6 +337,10 @@ static size_t stream_callback(void *ptr, size_t size, size_t nmemb, void *data)
 
        error_check();
 
+    if (context->prebuf) {
+        buf_size = context->prebuf;
+    }
+
        /* make sure we aren't over zealous by slowing down the stream when the buffer is too full */
        for (;;) {
                error_check();
@@ -350,10 +355,11 @@ static size_t stream_callback(void *ptr, size_t size, size_t nmemb, void *data)
                switch_mutex_unlock(context->audio_mutex);
 
                if (used < buf_size) {
+            //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Buffered %u/%u!\n", used, buf_size);
                        break;
                }
 
-               switch_yield(1000000);
+               switch_yield(500000);
        }
 
        error_check();
@@ -556,6 +562,7 @@ static switch_status_t shout_file_open(switch_file_handle_t *handle, char *path)
                InitMP3(&context->mp, OUTSCALE, context->samplerate);
                if (handle->handler) {
                        context->stream_url = switch_core_sprintf(context->memory_pool, "http://%s", path);
+            context->prebuf = handle->prebuf;
                        launch_read_stream_thread(context);
                } else {
                        if (switch_file_open(&context->fd, path, SWITCH_FOPEN_READ, SWITCH_FPROT_UREAD | SWITCH_FPROT_UWRITE, handle->memory_pool) !=
index 339e7fa592827e9078ead237120b99ab8982a1ab..ea33923c448f9f684ca7e143ffede205dce9d58f 100644 (file)
@@ -505,6 +505,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_file(switch_core_session_t *sess
        char *ext;
        char *prefix;
        char *timer_name;
+       char *prebuf;
 
        channel = switch_core_session_get_channel(session);
        assert(channel != NULL);
@@ -512,6 +513,7 @@ 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) {
                return SWITCH_STATUS_FALSE;
        }
@@ -552,6 +554,15 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_file(switch_core_session_t *sess
                fh->samples = 0;
        }
 
+       if ((prebuf = switch_channel_get_variable(channel, "stream_prebuffer"))) {
+               int maybe = atoi(prebuf);
+               if (maybe > 0) {
+                       fh->prebuf = maybe;
+               }
+       }
+       
+
+
        if (switch_core_file_open(fh,
                                                          file,
                                                          read_codec->implementation->number_of_channels,