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

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@4591 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
Anthony Minessale 2007-03-14 18:53:32 +00:00
parent c99d8c9b08
commit e93047ad81
7 changed files with 127 additions and 38 deletions

View File

@ -1,3 +1,4 @@
BASE=../../../..
MODNAME=mod_shout
LAME=lame-3.97
SHOUT=libshout-2.2.2
@ -12,7 +13,7 @@ SHOUTLA=$(SHOUT_DIR)/src/libshout.la
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)

View File

@ -88,7 +88,7 @@ int decode_header(struct frame *fr,unsigned long newhead)
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 @@ int decode_header(struct frame *fr,unsigned long newhead)
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 @@ int decode_header(struct frame *fr,unsigned long newhead)
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 @@ int decode_header(struct frame *fr,unsigned long newhead)
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 @@ int decode_header(struct frame *fr,unsigned long newhead)
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 @@ void print_header(struct frame *fr)
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 @@ void print_header_compact(struct frame *fr)
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],

View File

@ -28,10 +28,10 @@ static unsigned long ntom_step = NTOM_MUL;
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 @@ int synth_ntom_set_step(long m,long n)
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);
}

View File

@ -5,7 +5,6 @@
#include "mpg123.h"
#include "mpglib.h"
void InitMP3Constants(void)
{
init_layer3_const();
@ -55,7 +54,7 @@ static struct buf *addbuf(struct mpstr *mp,char *buf,int size)
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 @@ static int read_buf_byte(int *error, struct mpstr *mp)
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 decodeMP3(struct mpstr *mp,char *in,int isize,char *out,
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 @@ int decodeMP3(struct mpstr *mp,char *in,int isize,char *out,
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 @@ int decodeMP3(struct mpstr *mp,char *in,int isize,char *out,
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 @@ int set_pointer(struct mpstr *mp, long backstep)
{
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;

View File

@ -324,7 +324,7 @@ static int III_get_side_info_1(struct mpstr *mp, struct III_sideinfo *si,int ste
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 @@ static int III_get_side_info_1(struct mpstr *mp, struct III_sideinfo *si,int ste
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 @@ static int III_get_side_info_2(struct mpstr *mp, struct III_sideinfo *si,int ste
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 @@ static int III_get_side_info_2(struct mpstr *mp, struct III_sideinfo *si,int ste
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 @@ static int III_dequantize_sample(struct mpstr *mp, real xr[SBLIMIT][SSLIMIT],int
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 @@ static int III_dequantize_sample_ms(real xr[2][SBLIMIT][SSLIMIT],int *scf,
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 @@ int do_layer3(struct mpstr *mp,unsigned char *pcm_sample,int *pcm_point)
return (MP3_ERR);
#else
//printf("Not supported\n");
debug_printf("%d Not supported\n", __LINE__);
#endif
}
@ -1941,7 +1941,7 @@ int do_layer3(struct mpstr *mp,unsigned char *pcm_sample,int *pcm_point)
#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 @@ int do_layer3(struct mpstr *mp,unsigned char *pcm_sample,int *pcm_point)
#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
}

View File

@ -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 @@ struct shout_context {
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 @@ static inline void free_context(shout_context_t *context)
{
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 void log_msg(char const *fmt, va_list ap)
}
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;
decodeMP3(&context->mp, data, realsize, context->decode_buf, sizeof(context->decode_buf), &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;
}
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 @@ static void *SWITCH_THREAD_FUNC stream_thread(switch_thread_t *thread, void *obj
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 @@ static switch_status_t shout_file_open(switch_file_handle_t *handle, char *path)
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_seek(switch_file_handle_t *handle, unsigned in
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 @@ SWITCH_MOD_DECLARE(switch_status_t) switch_module_load(const switch_loadable_mod
*module_interface = &shout_module_interface;
shout_init();
InitMP3Constants();
/* indicate that the module should continue to be loaded */
return SWITCH_STATUS_SUCCESS;

View File

@ -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;