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

Freeswitch SVN anthm at freeswitch.org
Wed Mar 14 14:53:32 EDT 2007


Author: anthm
Date: Wed Mar 14 14:53:32 2007
New Revision: 4591

Modified:
   freeswitch/trunk/src/mod/formats/mod_shout/Makefile
   freeswitch/trunk/src/mod/formats/mod_shout/common.c
   freeswitch/trunk/src/mod/formats/mod_shout/decode_ntom.c
   freeswitch/trunk/src/mod/formats/mod_shout/interface.c
   freeswitch/trunk/src/mod/formats/mod_shout/layer3.c
   freeswitch/trunk/src/mod/formats/mod_shout/mod_shout.c
   freeswitch/trunk/src/mod/formats/mod_shout/mpglib.h

Log:
these aren't the droids you're looking for....

Modified: freeswitch/trunk/src/mod/formats/mod_shout/Makefile
==============================================================================
--- freeswitch/trunk/src/mod/formats/mod_shout/Makefile	(original)
+++ freeswitch/trunk/src/mod/formats/mod_shout/Makefile	Wed Mar 14 14:53:32 2007
@@ -1,3 +1,4 @@
+BASE=../../../..
 MODNAME=mod_shout
 LAME=lame-3.97
 SHOUT=libshout-2.2.2
@@ -12,7 +13,7 @@
 CURLLA=$(CURL_DIR)/lib/libcurl.la
 
 LOCAL_CFLAGS=-I$(CURL_DIR)/include -I$(SHOUT_DIR)/include -I$(LAME_DIR)/include
-LOCAL_LIBADD=$(LAMELA) $(SHOUTLA) $(CURLLA)
+LOCAL_LIBADD=$(LAMELA) $(SHOUTLA) -lcurl
 
 MP3OBJS=common.o dct64_i386.o decode_ntom.o layer3.o tabinit.o interface.o
 LOCAL_OBJS=$(MP3OBJS)

Modified: freeswitch/trunk/src/mod/formats/mod_shout/common.c
==============================================================================
--- freeswitch/trunk/src/mod/formats/mod_shout/common.c	(original)
+++ freeswitch/trunk/src/mod/formats/mod_shout/common.c	Wed Mar 14 14:53:32 2007
@@ -88,7 +88,7 @@
     
     fr->lay = 4-((newhead>>17)&3);
     if( ((newhead>>10)&0x3) == 0x3) {
-      //printf("Stream error\n");
+		debug_printf("%d Stream error\n",  __LINE__);
       return (0);
     }
     if(fr->mpeg25) {
@@ -114,7 +114,7 @@
 
     if(!fr->bitrate_index)
     {
-      //printf("Free format not supported.\n");
+		debug_printf("%d Free format not supported.\n",  __LINE__);
       return (0);
     }
 
@@ -129,7 +129,7 @@
         fr->framesize /= freqs[fr->sampling_frequency];
         fr->framesize  = ((fr->framesize+fr->padding)<<2)-4;
 #else
-        //printf("Layer 1 not supported!\n");
+        debug_printf("%d Layer 1 not supported!\n",  __LINE__);
 #endif
         break;
       case 2:
@@ -142,7 +142,7 @@
         fr->framesize /= freqs[fr->sampling_frequency];
         fr->framesize += fr->padding - 4;
 #else
-        //printf("Layer 2 not supported!\n");
+        debug_printf("%d Layer 2 not supported!\n",  __LINE__);
 #endif
         break;
       case 3:
@@ -163,7 +163,7 @@
           fr->framesize = fr->framesize + fr->padding - 4;
         break; 
       default:
-        //printf("Sorry, unknown layer type.\n"); 
+		  debug_printf("%d Sorry, unknown layer type.\n",  __LINE__); 
         return (0);
     }
     return 1;
@@ -175,15 +175,15 @@
 	static char *modes[4] = { "Stereo", "Joint-Stereo", "Dual-Channel", "Single-Channel" };
 	static char *layers[4] = { "Unknown" , "I", "II", "III" };
 
-	//printf("MPEG %s, Layer: %s, Freq: %ld, mode: %s, modext: %d, BPF : %d\n", 
+	debug_printf("MPEG %s, Layer: %s, Freq: %ld, mode: %s, modext: %d, BPF : %d\n", 
 		fr->mpeg25 ? "2.5" : (fr->lsf ? "2.0" : "1.0"),
 		layers[fr->lay],freqs[fr->sampling_frequency],
 		modes[fr->mode],fr->mode_ext,fr->framesize+4);
-	//printf("Channels: %d, copyright: %s, original: %s, CRC: %s, emphasis: %d.\n",
+	debug_printf("Channels: %d, copyright: %s, original: %s, CRC: %s, emphasis: %d.\n",
 		fr->stereo,fr->copyright?"Yes":"No",
 		fr->original?"Yes":"No",fr->error_protection?"Yes":"No",
 		fr->emphasis);
-	//printf("Bitrate: %d Kbits/s, Extension value: %d\n",
+	debug_printf("Bitrate: %d Kbits/s, Extension value: %d\n",
 		tabsel_123[fr->lsf][fr->lay-1][fr->bitrate_index],fr->extension);
 }
 
@@ -192,7 +192,7 @@
 	static char *modes[4] = { "stereo", "joint-stereo", "dual-channel", "mono" };
 	static char *layers[4] = { "Unknown" , "I", "II", "III" };
  
-	//printf("MPEG %s layer %s, %d kbit/s, %ld Hz %s\n",
+	debug_printf("MPEG %s layer %s, %d kbit/s, %ld Hz %s\n",
 		fr->mpeg25 ? "2.5" : (fr->lsf ? "2.0" : "1.0"),
 		layers[fr->lay],
 		tabsel_123[fr->lsf][fr->lay-1][fr->bitrate_index],

Modified: freeswitch/trunk/src/mod/formats/mod_shout/decode_ntom.c
==============================================================================
--- freeswitch/trunk/src/mod/formats/mod_shout/decode_ntom.c	(original)
+++ freeswitch/trunk/src/mod/formats/mod_shout/decode_ntom.c	Wed Mar 14 14:53:32 2007
@@ -28,10 +28,10 @@
 int synth_ntom_set_step(long m,long n)
 {
 	if(param.verbose > 1)
-		//printf("Init rate converter: %ld->%ld\n",m,n);
+		debug_printf("Init rate converter: %ld->%ld\n",m,n);
 
 	if(n >= 96000 || m >= 96000 || m == 0 || n == 0) {
-		//printf("NtoM converter: illegal rates\n");
+		debug_printf("NtoM converter: %d illegal rates\n",  __LINE__);
 		return (1);
 	}
 
@@ -39,7 +39,7 @@
 	ntom_step = n / m;
 
 	if(ntom_step > 8*NTOM_MUL) {
-		//printf("max. 1:8 conversion allowed!\n");
+		debug_printf("%d max. 1:8 conversion allowed!\n",  __LINE__);
 		return (1);
 	}
 

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 14:53:32 2007
@@ -5,7 +5,6 @@
 #include "mpg123.h"
 #include "mpglib.h"
 
-
 void InitMP3Constants(void)
 {
 	init_layer3_const();
@@ -55,7 +54,7 @@
 
 	nbuf = malloc( sizeof(struct buf) );
 	if(!nbuf) {
-		//printf("Out of memory!\n");
+		debug_printf("%d Out of memory!\n",  __LINE__);
 		return NULL;
 	}
 	nbuf->pnt = malloc(size);
@@ -109,7 +108,7 @@
 		if(!mp->tail) {
 			/* We may pick up this error a few times*/
 			/* But things have gone pear shaped */
-			//printf("Fatal Buffer error!\n");
+			debug_printf("%d Fatal Buffer error!\n",  __LINE__);
 			*error = 1;
 			return (0);		
 		}
@@ -190,7 +189,7 @@
 	int down_sample_sblimit;
 
 	if(osize < 4608) {
-		//printf("To less out space\n");
+		debug_printf("%d To less out space\n",  __LINE__);
 		return MP3_ERR;
 	}
 
@@ -211,7 +210,7 @@
 		if(!head_check(mp->header) ) {
 			int i;
 
-			//printf("Junk at the beginning of frame %08lx\n",mp->header);
+			debug_printf("Junk at the beginning of frame %08lx\n",mp->header);
 			
 			/* step in byte steps through next 64K */
 			for(i=0;i<65536;i++) {
@@ -225,7 +224,7 @@
 					break;
 			}
 			if(i == 65536) {
-				//printf("Giving up searching valid MPEG header\n");
+				debug_printf("%d Giving up searching valid MPEG header\n",  __LINE__);
 				return MP3_ERR;
 			}
 		}
@@ -305,7 +304,7 @@
 {
   unsigned char *bsbufold;
   if(mp->fsizeold < 0 && backstep > 0) {
-    //printf("Can't step back %ld!\n",backstep);
+    debug_printf("Can't step back %ld!\n",backstep);
     return MP3_ERR;
   }
   bsbufold = mp->bsspace[mp->bsnum] + 512;

Modified: freeswitch/trunk/src/mod/formats/mod_shout/layer3.c
==============================================================================
--- freeswitch/trunk/src/mod/formats/mod_shout/layer3.c	(original)
+++ freeswitch/trunk/src/mod/formats/mod_shout/layer3.c	Wed Mar 14 14:53:32 2007
@@ -324,7 +324,7 @@
        gr_info->part2_3_length = getbits(mp, 12);
        gr_info->big_values = getbits_fast(mp, 9);
        if(gr_info->big_values > 288) {
-          //printf("big_values too large!\n");
+		   debug_printf("%d big_values too large!\n", __LINE__);
           gr_info->big_values = 288;
        }
        gr_info->pow2gain = gainpow2+256 - getbits_fast(mp, 8) + powdiff;
@@ -348,7 +348,7 @@
            gr_info->full_gain[i] = gr_info->pow2gain + (getbits_fast(mp, 3)<<3);
 
          if(gr_info->block_type == 0) {
-           //printf("Blocktype == 0 and window-switching == 1 not allowed.\n");
+			 debug_printf("%d Blocktype == 0 and window-switching == 1 not allowed.\n",  __LINE__);
            return (1);
          }
          /* region_count/start parameters are implicit in this case. */       
@@ -399,7 +399,7 @@
        gr_info->part2_3_length = getbits(mp, 12);
        gr_info->big_values = getbits_fast(mp, 9);
        if(gr_info->big_values > 288) {
-         //printf("big_values too large!\n");
+		   debug_printf("%d big_values too large!\n",  __LINE__);
          gr_info->big_values = 288;
        }
        gr_info->pow2gain = gainpow2+256 - getbits_fast(mp, 8) + powdiff;
@@ -423,7 +423,7 @@
            gr_info->full_gain[i] = gr_info->pow2gain + (getbits_fast(mp, 3)<<3);
 
          if(gr_info->block_type == 0) {
-           //printf("Blocktype == 0 and window-switching == 1 not allowed.\n");
+			 debug_printf("%d Blocktype == 0 and window-switching == 1 not allowed.\n",  __LINE__);
            return (1);
          }
          /* region_count/start parameters are implicit in this case. */       
@@ -963,7 +963,7 @@
   if(part2remain > 0)
     getbits(mp, part2remain);
   else if(part2remain < 0) {
-    //printf("mpg123: Can't rewind stream by %d bits!\n",-part2remain);
+	  debug_printf("mpg123: %d Can't rewind stream by %d bits!\n",-part2remain,  __LINE__);
     return 1; /* -> error */
   }
   return 0;
@@ -1374,7 +1374,7 @@
   if(part2remain > 0 )
     getbits(mp, part2remain);
   else if(part2remain < 0) {
-    //printf("mpg123_ms: Can't rewind stream by %d bits!\n",-part2remain);
+	  debug_printf("mpg123_ms: %d: Can't rewind stream by %d bits!\n",-part2remain,  __LINE__);
     return 1; /* -> error */
   }
   return 0;
@@ -1920,7 +1920,7 @@
 	   return (MP3_ERR);
    
 #else
-    //printf("Not supported\n");
+   debug_printf("%d Not supported\n",  __LINE__);
 #endif
   }
 
@@ -1941,7 +1941,7 @@
 #ifdef MPEG1
         part2bits = III_get_scale_factors_1(mp, scalefacs,gr_info);
 #else
-	//printf("Not supported\n");
+		debug_printf("%d Not supported\n",  __LINE__);
 #endif
       }
       if(III_dequantize_sample(mp, hybridIn[0], scalefacs,gr_info,sfreq,part2bits))
@@ -1956,7 +1956,7 @@
 #ifdef MPEG1
         part2bits = III_get_scale_factors_1(mp, scalefacs,gr_info);
 #else
-	//printf("Not supported\n");
+		debug_printf("%d Not supported\n",  __LINE__);
 #endif
       }
 

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 14:53:32 2007
@@ -39,7 +39,8 @@
 
 
 #define OUTSCALE 4096
-#define MP3BUFLEN OUTSCALE * 2
+#define MP3_SCACHE 16384
+#define MP3_DCACHE 8192
 
 static const char modname[] = "mod_shout";
 
@@ -51,10 +52,15 @@
     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 decode_buf[MP3BUFLEN];
+    //char encode_buf[MP3_SCACHE];
+    char decode_buf[MP3_DCACHE];
     struct mpstr mp;
+    int err;
+    int dlen;
 };
 
 typedef struct shout_context shout_context_t;
@@ -63,7 +69,13 @@
 {
     if (context) {
         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) {
@@ -158,17 +170,65 @@
 }
 
 
+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 dlen;
+    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;
+    int outlen;
+    int usedlen;
+
+
+    in = ptr;
+    inlen = realsize;
+    out = context->decode_buf;
+    outlen = sizeof(context->decode_buf);
+    usedlen = 0;
+
+    do {
+        decode_status = decodeMP3(&context->mp, in, inlen, out, outlen, &dlen);
+
+        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;
+        }
     
-    decodeMP3(&context->mp, data, realsize, context->decode_buf, sizeof(context->decode_buf), &dlen);
+        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, dlen);
+    switch_buffer_write(context->audio_buffer, context->decode_buf, usedlen);
     switch_mutex_unlock(context->audio_mutex);
+    out = context->decode_buf;
+    outlen = sizeof(context->decode_buf);
+
+    printf("doh\n");
+    
+    
+
 
 	return realsize;
 }
@@ -181,6 +241,7 @@
     CURL *curl_handle = NULL;
     shout_context_t *context = (shout_context_t *) obj;
 
+	curl_handle = curl_easy_init();
     curl_easy_setopt(curl_handle, CURLOPT_URL, context->stream_url);
     curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, stream_callback);
     curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)context);
@@ -244,7 +305,12 @@
             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);
@@ -354,13 +420,30 @@
 static switch_status_t shout_file_read(switch_file_handle_t *handle, void *data, size_t *len)
 {
 	shout_context_t *context = handle->private_info;
-    size_t bytes = *len;
+    size_t rb = 0, bytes = *len * sizeof(int16_t);
+
+    *len = 0;
 
     switch_mutex_lock(context->audio_mutex);
-    *len = switch_buffer_read(context->audio_buffer, data, bytes);
+    if (context->audio_buffer) {
+        rb = switch_buffer_read(context->audio_buffer, data, bytes);
+    } else {
+        context->err++;
+    }
     switch_mutex_unlock(context->audio_mutex);
 
-	return SWITCH_STATUS_FALSE;
+    if (context->err) {
+        return SWITCH_STATUS_FALSE;
+    }
+
+    if (rb) {
+        *len = rb / sizeof(int16_t);
+    } else {
+        memset(data, 255, bytes);
+        *len = bytes / sizeof(int16_t);
+    }
+
+	return SWITCH_STATUS_SUCCESS;
 }
 
 static switch_status_t shout_file_write(switch_file_handle_t *handle, void *data, size_t *len)
@@ -455,6 +538,7 @@
 	*module_interface = &shout_module_interface;
 
 	shout_init();
+    InitMP3Constants();
 
 	/* indicate that the module should continue to be loaded */
 	return SWITCH_STATUS_SUCCESS;

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 14:53:32 2007
@@ -1,3 +1,8 @@
+#ifndef DEBUG_MP3
+#define debug_printf(fmt,...) printf(fmt, ##__VA_ARGS__);
+#else
+#define debug_printf;
+#endif
 
 struct buf {
         unsigned char *pnt;



More information about the Freeswitch-svn mailing list