Author: anthm Date: Sat Jun 9 19:02:38 2007 New Revision: 5302 Modified: freeswitch/trunk/conf/default_context.xml freeswitch/trunk/src/include/switch_module_interfaces.h freeswitch/trunk/src/mod/formats/mod_shout/mod_shout.c freeswitch/trunk/src/switch_ivr_play_say.c Log: add adjustable buffering to mod_shout (see example in config file) Modified: freeswitch/trunk/conf/default_context.xml ============================================================================== --- freeswitch/trunk/conf/default_context.xml (original) +++ freeswitch/trunk/conf/default_context.xml Sat Jun 9 19:02:38 2007 @@ -19,6 +19,16 @@ </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 --> Modified: freeswitch/trunk/src/include/switch_module_interfaces.h ============================================================================== --- freeswitch/trunk/src/include/switch_module_interfaces.h (original) +++ freeswitch/trunk/src/include/switch_module_interfaces.h Sat Jun 9 19:02:38 2007 @@ -221,6 +221,8 @@ 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; Modified: freeswitch/trunk/src/mod/formats/mod_shout/mod_shout.c ============================================================================== --- freeswitch/trunk/src/mod/formats/mod_shout/mod_shout.c (original) +++ freeswitch/trunk/src/mod/formats/mod_shout/mod_shout.c Sat Jun 9 19:02:38 2007 @@ -65,6 +65,7 @@ int samplerate; uint8_t thread_running; uint8_t shout_init; + uint32_t prebuf; }; typedef struct shout_context shout_context_t; @@ -336,6 +337,10 @@ 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 @@ 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 @@ 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) != Modified: freeswitch/trunk/src/switch_ivr_play_say.c ============================================================================== --- freeswitch/trunk/src/switch_ivr_play_say.c (original) +++ freeswitch/trunk/src/switch_ivr_play_say.c Sat Jun 9 19:02:38 2007 @@ -505,6 +505,7 @@ char *ext; char *prefix; char *timer_name; + char *prebuf; channel = switch_core_session_get_channel(session); assert(channel != NULL); @@ -512,6 +513,7 @@ 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 @@ 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,