[Freeswitch-svn] [commit] r4597 - freeswitch/trunk/src/mod/formats/mod_shout

Freeswitch SVN anthm at freeswitch.org
Wed Mar 14 19:19:13 EDT 2007


Author: anthm
Date: Wed Mar 14 19:19:13 2007
New Revision: 4597

Modified:
   freeswitch/trunk/src/mod/formats/mod_shout/interface.c
   freeswitch/trunk/src/mod/formats/mod_shout/mod_shout.c
   freeswitch/trunk/src/mod/formats/mod_shout/mpglib.h

Log:
stick a fork in it.... needs testing and tweaks but can now read and write to icecast via shout:// and or .mp3 files the traditional way

Modified: freeswitch/trunk/src/mod/formats/mod_shout/interface.c
==============================================================================
--- freeswitch/trunk/src/mod/formats/mod_shout/interface.c	(original)
+++ freeswitch/trunk/src/mod/formats/mod_shout/interface.c	Wed Mar 14 19:19:13 2007
@@ -13,7 +13,7 @@
 }
 
 
-BOOL InitMP3(struct mpstr *mp, long outscale) 
+BOOL InitMP3(struct mpstr *mp, long outscale, int samplerate) 
 {
 	/* quiet 4096 med 8192 */
 
@@ -26,7 +26,7 @@
 	mp->fr.single = 3; /* force mono */
 	mp->bsnum = 0;
 	mp->synth_bo = 1;
-	mp->outsamplerate = 8000;
+	mp->outsamplerate = samplerate;
 
 	make_decode_tables_scale(mp, outscale);
 
@@ -190,7 +190,7 @@
 
 	if(osize < 4608) {
 		debug_printf("%d To less out space\n",  __LINE__);
-		return MP3_ERR;
+		return MP3_TOOSMALL;
 	}
 
 	if(in) {

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	Wed Mar 14 19:19:13 2007
@@ -38,13 +38,14 @@
 #include <curl/curl.h>
 
 
-#define OUTSCALE 4096
+#define OUTSCALE 8192
 #define MP3_SCACHE 16384
 #define MP3_DCACHE 8192
 
 static const char modname[] = "mod_shout";
 
 
+
 static char *supported_formats[SWITCH_MAX_CODECS] = {0};
 
 struct shout_context {
@@ -52,32 +53,52 @@
     lame_global_flags *gfp;
     char *stream_url;
 	switch_mutex_t *audio_mutex;
-	switch_mutex_t *mp3_mutex;
 	switch_buffer_t *audio_buffer;
-	switch_buffer_t *mp3_buffer;
     switch_memory_pool_t *memory_pool;
-    //char encode_buf[MP3_SCACHE];
     char decode_buf[MP3_DCACHE];
     struct mpstr mp;
     int err;
+    int mp3err;
     int dlen;
+    switch_file_t *fd;
+    FILE *fp;
+    int samplerate;
 };
 
 typedef struct shout_context shout_context_t;
 
+
+static size_t decode_fd(shout_context_t *context, void *data, size_t bytes);
+
 static inline void free_context(shout_context_t *context)
 {
     if (context) {
+        int sanity = 0;
+
+        if (context->fd) {
+            switch_file_close(context->fd);
+            context->fd = NULL;
+        }
+
+        if (context->fp) {
+            unsigned char mp3buffer[1024];
+            int len;
+
+            while ((len = lame_encode_flush(context->gfp, mp3buffer, sizeof(mp3buffer))) > 0) {
+                fwrite(mp3buffer, 1, len, context->fp);
+            }
+            
+            lame_mp3_tags_fid(context->gfp, context->fp);
+            fclose(context->fp);
+            context->fp = NULL;
+        }
+
         if (context->audio_buffer) {
             switch_mutex_lock(context->audio_mutex);
             switch_buffer_destroy(&context->audio_buffer);
             switch_mutex_unlock(context->audio_mutex);
         }
 
-        if (context->mp3_buffer) {
-            switch_buffer_destroy(&context->mp3_buffer);
-        }
-
         if (context->shout) {
             shout_close(context->shout);
             context->shout = NULL;
@@ -87,6 +108,22 @@
             lame_close(context->gfp);
             context->gfp = NULL;
         }
+        if (context->stream_url) {
+            int err;
+
+            switch_mutex_lock(context->audio_mutex);
+            err = ++context->err;
+            switch_mutex_unlock(context->audio_mutex);
+            
+            while(context->err == err) {
+                switch_yield(1000000);
+                if (++sanity > 10) {
+                    break;
+                }
+            }
+
+            ExitMP3(&context->mp);
+        }
     }
 }
 
@@ -169,21 +206,119 @@
 	}
 }
 
+static size_t decode_fd(shout_context_t *context, void *data, size_t bytes)
+{
+    int decode_status = 0;
+    int dlen = 0;
+    int x = 0;
+    char *in;
+    int inlen;
+    char *out;
+    int outlen;
+    int usedlen;
+    char inbuf[MP3_SCACHE];
+    int done = 0;
+    
+    size_t lp;
+    size_t rb = 0;
+
+    while (switch_buffer_inuse(context->audio_buffer) < bytes) {
+        lp = sizeof(inbuf);
+        if ((switch_file_read(context->fd, inbuf, &lp) != SWITCH_STATUS_SUCCESS) || lp == 0) {
+            goto error;
+        }
+
+        inlen = (int) lp;
+        in = inbuf;
+        
+        out = context->decode_buf;
+        outlen = (int) sizeof(context->decode_buf);
+        usedlen = 0;
+        x =  0;
+        if (inlen < bytes) {
+            done = 1;
+        }
+
+        do {
+            decode_status = decodeMP3(&context->mp, in, inlen, out, outlen, &dlen);
+
+            if (context->err) {
+                goto error;
+            }
+
+            if (!x) {
+                in = NULL;
+                inlen = 0;
+                x++;
+            }
+            
+            if (decode_status == MP3_TOOSMALL) {
+                if (context->audio_buffer) {
+                    switch_buffer_write(context->audio_buffer, context->decode_buf, usedlen);
+                } else {
+                    goto error;
+                }
+                
+                out = context->decode_buf;
+                outlen = sizeof(context->decode_buf);
+                usedlen = 0;
+                continue;
+                
+            }
+
+            if (decode_status == MP3_ERR) {
+                if (++context->mp3err >= 20) {
+                    switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Decoder Error!\n");
+                }
+                dlen = 0;
+                continue;
+            }
+            
+            context->mp3err = 0;
+            
+            usedlen += dlen;        
+            out += dlen;
+            outlen -= dlen;
+            dlen = 0;
+            
+
+        } while (decode_status != MP3_NEED_MORE);
+        
+
+        if (context->audio_buffer) {
+            switch_buffer_write(context->audio_buffer, context->decode_buf, usedlen);
+        } else {
+            goto error;
+        }
+
+        if (done) {
+            break;
+        }
+    }
+
+    if (switch_buffer_inuse(context->audio_buffer) >= bytes) {
+        rb = switch_buffer_read(context->audio_buffer, data, bytes);
+        return rb;
+    }
+
+    return 0;
+    
+ error:
+    switch_mutex_lock(context->audio_mutex);
+    context->err++;
+    switch_mutex_unlock(context->audio_mutex);
+    return 0;
+
+}
 
-static int wtf = -1;
 
 static size_t stream_callback(void *ptr, size_t size, size_t nmemb, void *data)
 {
 	register unsigned int realsize = (unsigned int)(size * nmemb);
 	shout_context_t *context = data;
-    int rlen;
-    char grr[1024];
-    char *ass;
     int decode_status = 0;
     int dlen = 0;
-    int offset = 0;
     int x = 0;
-
     char *in;
     int inlen;
     char *out;
@@ -200,37 +335,65 @@
     do {
         decode_status = decodeMP3(&context->mp, in, inlen, out, outlen, &dlen);
 
+        if (context->err) {
+            goto error;
+        }
+
         if (!x) {
             in = NULL;
             inlen = 0;
             x++;
         }
         
-        if (decode_status == MP3_ERR) {
-            switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Decoder Error!\n");
-            context->err++;
-            return 0;
+        if (decode_status == MP3_TOOSMALL) {
+            switch_mutex_lock(context->audio_mutex);
+            if (context->audio_buffer) {
+                switch_buffer_write(context->audio_buffer, context->decode_buf, usedlen);
+            } else {
+                goto error;
+            }
+            out = context->decode_buf;
+            outlen = sizeof(context->decode_buf);
+            usedlen = 0;
+            switch_mutex_unlock(context->audio_mutex);
+            
+        } else if (decode_status == MP3_ERR) {
+
+            if (++context->mp3err >= 20) {
+                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Decoder Error!\n");
+                goto error;
+            }
+
+            ExitMP3(&context->mp);
+            InitMP3(&context->mp, OUTSCALE, context->samplerate);
+            
+            return realsize;
         }
-    
+
+        context->mp3err = 0;    
         usedlen += dlen;        
         out += dlen;
         outlen -= dlen;
         dlen = 0;
     } while (decode_status != MP3_NEED_MORE);
 
-    printf("WRITE %d\n", usedlen);
+
     switch_mutex_lock(context->audio_mutex);
-    switch_buffer_write(context->audio_buffer, context->decode_buf, usedlen);
+    if (context->audio_buffer) {
+        switch_buffer_write(context->audio_buffer, context->decode_buf, usedlen);
+    } else {
+        goto error;
+    }
     switch_mutex_unlock(context->audio_mutex);
-    out = context->decode_buf;
-    outlen = sizeof(context->decode_buf);
 
-    printf("doh\n");
-    
+	return realsize;
     
+ error:
+    switch_mutex_lock(context->audio_mutex);
+    context->err++;
+    switch_mutex_unlock(context->audio_mutex);
+    return 0;
 
-
-	return realsize;
 }
 
 
@@ -248,7 +411,10 @@
     curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "FreeSWITCH(mod_shout)/1.0");
     curl_easy_perform(curl_handle);
     curl_easy_cleanup(curl_handle);
-
+    switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Thread Done\n");
+    switch_mutex_lock(context->audio_mutex);
+    context->err++;
+    switch_mutex_unlock(context->audio_mutex);
     return NULL;
 }
 
@@ -274,115 +440,130 @@
 		return SWITCH_STATUS_MEMERR;
 	}
 
-	if (!(context->shout = shout_new())) {
-		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not allocate shout_t\n");
-		goto error;
-	}
-
-    if (!(context->gfp = lame_init())) {
-        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not allocate lame\n");
-        goto error;
-    }
-
     context->memory_pool = handle->memory_pool;
-
-    lame_set_num_channels(context->gfp, handle->channels);
-    lame_set_in_samplerate(context->gfp, handle->samplerate);
-    lame_set_brate(context->gfp, 24);
-    lame_set_mode(context->gfp, 3);
-    lame_set_quality(context->gfp, 2);   /* 2=high  5 = medium  7=low */
-
-    lame_set_errorf(context->gfp, log_error);
-    lame_set_debugf(context->gfp, log_debug);
-    lame_set_msgf(context->gfp, log_msg);
-    lame_set_bWriteVbrTag(context->gfp, 0);
-    lame_mp3_tags_fid(context->gfp, NULL);
-    lame_init_params(context->gfp);
-    lame_print_config(context->gfp);
-
+    context->samplerate = handle->codec_imp ? handle->codec_imp->samples_per_second : 8000;
+    
     if (switch_test_flag(handle, SWITCH_FILE_FLAG_READ)) {
         if (switch_buffer_create_dynamic(&context->audio_buffer, MY_BLOCK_SIZE, MY_BUF_LEN, 0) != SWITCH_STATUS_SUCCESS) {
             switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Memory Error!\n");
             goto error;
         }
-        if (switch_buffer_create_dynamic(&context->mp3_buffer, MY_BLOCK_SIZE, MY_BUF_LEN, 0) != SWITCH_STATUS_SUCCESS) {
-            switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Memory Error!\n");
-            goto error;
-        }
-        switch_mutex_init(&context->audio_mutex, SWITCH_MUTEX_NESTED, context->memory_pool);
-        switch_mutex_init(&context->mp3_mutex, SWITCH_MUTEX_NESTED, context->memory_pool);
-        InitMP3(&context->mp, OUTSCALE);
-        context->stream_url = switch_core_sprintf(context->memory_pool, "http://%s", path);
-        launch_stream_thread(context);
-    } else if (!switch_test_flag(handle, SWITCH_FILE_FLAG_WRITE)) {
-        username = switch_core_strdup(handle->memory_pool, path);
-        if (!(password = strchr(username, ':'))) {
-            err = "invalid url";
-            goto error;
-        }
-        *password++ = '\0';
         
-        if (!(host = strchr(password, '@'))) {
-            err = "invalid url";
-            goto error;
-        }
-        *host++ = '\0';
-    
-        if ((file = strchr(host, '/'))) {
-            *file++ = '\0';
+        switch_mutex_init(&context->audio_mutex, SWITCH_MUTEX_NESTED, context->memory_pool);
+        InitMP3(&context->mp, OUTSCALE, context->samplerate);
+        if (handle->handler) {
+            context->stream_url = switch_core_sprintf(context->memory_pool, "http://%s", path);
+            launch_stream_thread(context);
         } else {
-            switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid URL: %s\n", path);
+            if (switch_file_open(&context->fd, path, SWITCH_FOPEN_READ, 
+                                 SWITCH_FPROT_UREAD|SWITCH_FPROT_UWRITE, handle->memory_pool) != SWITCH_STATUS_SUCCESS) {
+                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error opening %s\n", path);
+                goto error;
+            }
+        }
+    } else if (switch_test_flag(handle, SWITCH_FILE_FLAG_WRITE)) {
+        if (!(context->gfp = lame_init())) {
+            switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not allocate lame\n");
             goto error;
         }
 
-        if (shout_set_host(context->shout, host) != SHOUTERR_SUCCESS) {
-            switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error setting hostname: %s\n", shout_get_error(context->shout));
-            goto error;
-        }
-
-        if (shout_set_protocol(context->shout, SHOUT_PROTOCOL_HTTP) != SHOUTERR_SUCCESS) {
-            switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error setting protocol: %s\n", shout_get_error(context->shout));
-            goto error;
-        }
+        lame_set_num_channels(context->gfp, handle->channels);
+        lame_set_in_samplerate(context->gfp, handle->samplerate);
+        lame_set_brate(context->gfp, 24);
+        lame_set_mode(context->gfp, 3);
+        lame_set_quality(context->gfp, 2);   /* 2=high  5 = medium  7=low */
+        
+        lame_set_errorf(context->gfp, log_error);
+        lame_set_debugf(context->gfp, log_debug);
+        lame_set_msgf(context->gfp, log_msg);
+        
+        lame_init_params(context->gfp);
+        lame_print_config(context->gfp);
+        
+        if (handle->handler) {
+            lame_set_bWriteVbrTag(context->gfp, 0);
+            lame_mp3_tags_fid(context->gfp, NULL);
+            
+            username = switch_core_strdup(handle->memory_pool, path);
+            if (!(password = strchr(username, ':'))) {
+                err = "invalid url";
+                goto error;
+            }
+            *password++ = '\0';
+        
+            if (!(host = strchr(password, '@'))) {
+                err = "invalid url";
+                goto error;
+            }
+            *host++ = '\0';
     
-        if (shout_set_port(context->shout, 8000) != SHOUTERR_SUCCESS) {
-            switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error setting port: %s\n", shout_get_error(context->shout));
-            goto error;
-        }
-
-        if (shout_set_password(context->shout, password) != SHOUTERR_SUCCESS) {
-            switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error setting password: %s\n", shout_get_error(context->shout));
-            goto error;
-        }
-
-        if (shout_set_mount(context->shout, file) != SHOUTERR_SUCCESS) {
-            switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error setting mount: %s\n", shout_get_error(context->shout));
-            goto error;
-        }
-
-        if (shout_set_user(context->shout, username) != SHOUTERR_SUCCESS) {
-            switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error setting user: %s\n", shout_get_error(context->shout));
-            goto error;
-        }
-
-        if (shout_set_url(context->shout, "mod_shout") != SHOUTERR_SUCCESS) {
-            switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error setting name: %s\n", shout_get_error(context->shout));
-            goto error;
-        }
-
-        if (shout_set_audio_info(context->shout, "bitrate", "24000") != SHOUTERR_SUCCESS) {
-            switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error setting user: %s\n", shout_get_error(context->shout));
-            goto error;
-        }
-
-        if (shout_set_format(context->shout, SHOUT_FORMAT_MP3) != SHOUTERR_SUCCESS) {
-            switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error setting user: %s\n", shout_get_error(context->shout));
-            goto error;
-        }
-
-        if (shout_open(context->shout) != SHOUTERR_SUCCESS) {
-            switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error opening stream: %s\n", shout_get_error(context->shout));
-            goto error;
+            if ((file = strchr(host, '/'))) {
+                *file++ = '\0';
+            } else {
+                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid URL: %s\n", path);
+                goto error;
+            }
+            
+            if (!(context->shout = shout_new())) {
+                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not allocate shout_t\n");
+                goto error;
+            }
+            
+            if (shout_set_host(context->shout, host) != SHOUTERR_SUCCESS) {
+                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error setting hostname: %s\n", shout_get_error(context->shout));
+                goto error;
+            }
+
+            if (shout_set_protocol(context->shout, SHOUT_PROTOCOL_HTTP) != SHOUTERR_SUCCESS) {
+                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error setting protocol: %s\n", shout_get_error(context->shout));
+                goto error;
+            }
+    
+            if (shout_set_port(context->shout, 8000) != SHOUTERR_SUCCESS) {
+                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error setting port: %s\n", shout_get_error(context->shout));
+                goto error;
+            }
+
+            if (shout_set_password(context->shout, password) != SHOUTERR_SUCCESS) {
+                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error setting password: %s\n", shout_get_error(context->shout));
+                goto error;
+            }
+
+            if (shout_set_mount(context->shout, file) != SHOUTERR_SUCCESS) {
+                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error setting mount: %s\n", shout_get_error(context->shout));
+                goto error;
+            }
+
+            if (shout_set_user(context->shout, username) != SHOUTERR_SUCCESS) {
+                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error setting user: %s\n", shout_get_error(context->shout));
+                goto error;
+            }
+
+            if (shout_set_url(context->shout, "mod_shout") != SHOUTERR_SUCCESS) {
+                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error setting name: %s\n", shout_get_error(context->shout));
+                goto error;
+            }
+
+            if (shout_set_audio_info(context->shout, "bitrate", "24000") != SHOUTERR_SUCCESS) {
+                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error setting user: %s\n", shout_get_error(context->shout));
+                goto error;
+            }
+
+            if (shout_set_format(context->shout, SHOUT_FORMAT_MP3) != SHOUTERR_SUCCESS) {
+                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error setting user: %s\n", shout_get_error(context->shout));
+                goto error;
+            }
+
+            if (shout_open(context->shout) != SHOUTERR_SUCCESS) {
+                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error opening stream: %s\n", shout_get_error(context->shout));
+                goto error;
+            }
+        } else {
+            /* lame being lame and all has FILE * coded into it's API for some functions so we gotta use it */
+            if (!(context->fp = fopen(path, "wb+"))) {
+                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error opening %s\n", path);
+                return SWITCH_STATUS_GENERR;
+            }
         }
     }
 
@@ -424,13 +605,19 @@
 
     *len = 0;
 
-    switch_mutex_lock(context->audio_mutex);
-    if (context->audio_buffer) {
-        rb = switch_buffer_read(context->audio_buffer, data, bytes);
+    if (context->fd) {
+        rb = decode_fd(context, data, bytes);
     } else {
-        context->err++;
+        switch_mutex_lock(context->audio_mutex);
+        if (context->audio_buffer) {
+            rb = switch_buffer_read(context->audio_buffer, data, bytes);
+        } else {
+            switch_mutex_lock(context->audio_mutex);
+            context->err++;
+            switch_mutex_unlock(context->audio_mutex);
+        }
+        switch_mutex_unlock(context->audio_mutex);
     }
-    switch_mutex_unlock(context->audio_mutex);
 
     if (context->err) {
         return SWITCH_STATUS_FALSE;
@@ -449,27 +636,33 @@
 static switch_status_t shout_file_write(switch_file_handle_t *handle, void *data, size_t *len)
 {
 	shout_context_t *context = handle->private_info;
-
-
     unsigned char mp3buf[2048] = "";
     long ret = 0;
     int rlen;
     int16_t *audio = data;
     int nsamples = *len;
+    
+    assert(context->gfp);
 
     if ((rlen = lame_encode_buffer(context->gfp, audio, NULL, nsamples, mp3buf, sizeof(mp3buf))) < 0) {
         switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "MP3 encode error %d!\n", rlen);
         return SWITCH_STATUS_FALSE;
     }
 
-    if (rlen) {
-        ret = shout_send(context->shout, mp3buf, rlen);
-        if (ret != SHOUTERR_SUCCESS) {
-            switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Send error: %s\n", shout_get_error(context->shout));
+    if (handle->handler) {
+        if (rlen) {
+            ret = shout_send(context->shout, mp3buf, rlen);
+            if (ret != SHOUTERR_SUCCESS) {
+                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Send error: %s\n", shout_get_error(context->shout));
+                return SWITCH_STATUS_FALSE;
+            }
+        }
+        shout_sync(context->shout);
+    } else {
+        if (fwrite(mp3buf, 1, rlen, context->fp) < 0) {
             return SWITCH_STATUS_FALSE;
         }
     }
-    shout_sync(context->shout);
 
     return SWITCH_STATUS_SUCCESS;
 }
@@ -530,6 +723,7 @@
 SWITCH_MOD_DECLARE(switch_status_t) switch_module_load(const switch_loadable_module_interface_t **module_interface, char *filename)
 {
     supported_formats[0] = "shout";
+    supported_formats[1] = "mp3";
 	shout_file_interface.extens = supported_formats;
 
     curl_global_init(CURL_GLOBAL_ALL);

Modified: freeswitch/trunk/src/mod/formats/mod_shout/mpglib.h
==============================================================================
--- freeswitch/trunk/src/mod/formats/mod_shout/mpglib.h	(original)
+++ freeswitch/trunk/src/mod/formats/mod_shout/mpglib.h	Wed Mar 14 19:19:13 2007
@@ -1,7 +1,7 @@
-#ifndef DEBUG_MP3
+#ifdef DEBUG_MP3
 #define debug_printf(fmt,...) printf(fmt, ##__VA_ARGS__);
 #else
-#define debug_printf;
+#define debug_printf(fmt,...)
 #endif
 
 struct buf {
@@ -47,10 +47,10 @@
 #define MP3_ERR -1
 #define MP3_OK  0
 #define MP3_NEED_MORE 1
-
+#define MP3_TOOSMALL 2
 
 void InitMP3Constants(void);
-BOOL InitMP3(struct mpstr *mp, long outscale);
+BOOL InitMP3(struct mpstr *mp, long outscale, int samplerate);
 int decodeMP3(struct mpstr *mp,char *inmemory,int inmemsize,
      char *outmemory,int outmemsize,int *done);
 void ExitMP3(struct mpstr *mp);



More information about the Freeswitch-svn mailing list