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:
parent
c99d8c9b08
commit
e93047ad81
|
@ -1,3 +1,4 @@
|
||||||
|
BASE=../../../..
|
||||||
MODNAME=mod_shout
|
MODNAME=mod_shout
|
||||||
LAME=lame-3.97
|
LAME=lame-3.97
|
||||||
SHOUT=libshout-2.2.2
|
SHOUT=libshout-2.2.2
|
||||||
|
@ -12,7 +13,7 @@ SHOUTLA=$(SHOUT_DIR)/src/libshout.la
|
||||||
CURLLA=$(CURL_DIR)/lib/libcurl.la
|
CURLLA=$(CURL_DIR)/lib/libcurl.la
|
||||||
|
|
||||||
LOCAL_CFLAGS=-I$(CURL_DIR)/include -I$(SHOUT_DIR)/include -I$(LAME_DIR)/include
|
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
|
MP3OBJS=common.o dct64_i386.o decode_ntom.o layer3.o tabinit.o interface.o
|
||||||
LOCAL_OBJS=$(MP3OBJS)
|
LOCAL_OBJS=$(MP3OBJS)
|
||||||
|
|
|
@ -88,7 +88,7 @@ int decode_header(struct frame *fr,unsigned long newhead)
|
||||||
|
|
||||||
fr->lay = 4-((newhead>>17)&3);
|
fr->lay = 4-((newhead>>17)&3);
|
||||||
if( ((newhead>>10)&0x3) == 0x3) {
|
if( ((newhead>>10)&0x3) == 0x3) {
|
||||||
//printf("Stream error\n");
|
debug_printf("%d Stream error\n", __LINE__);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
if(fr->mpeg25) {
|
if(fr->mpeg25) {
|
||||||
|
@ -114,7 +114,7 @@ int decode_header(struct frame *fr,unsigned long newhead)
|
||||||
|
|
||||||
if(!fr->bitrate_index)
|
if(!fr->bitrate_index)
|
||||||
{
|
{
|
||||||
//printf("Free format not supported.\n");
|
debug_printf("%d Free format not supported.\n", __LINE__);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -129,7 +129,7 @@ int decode_header(struct frame *fr,unsigned long newhead)
|
||||||
fr->framesize /= freqs[fr->sampling_frequency];
|
fr->framesize /= freqs[fr->sampling_frequency];
|
||||||
fr->framesize = ((fr->framesize+fr->padding)<<2)-4;
|
fr->framesize = ((fr->framesize+fr->padding)<<2)-4;
|
||||||
#else
|
#else
|
||||||
//printf("Layer 1 not supported!\n");
|
debug_printf("%d Layer 1 not supported!\n", __LINE__);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
|
@ -142,7 +142,7 @@ int decode_header(struct frame *fr,unsigned long newhead)
|
||||||
fr->framesize /= freqs[fr->sampling_frequency];
|
fr->framesize /= freqs[fr->sampling_frequency];
|
||||||
fr->framesize += fr->padding - 4;
|
fr->framesize += fr->padding - 4;
|
||||||
#else
|
#else
|
||||||
//printf("Layer 2 not supported!\n");
|
debug_printf("%d Layer 2 not supported!\n", __LINE__);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
|
@ -163,7 +163,7 @@ int decode_header(struct frame *fr,unsigned long newhead)
|
||||||
fr->framesize = fr->framesize + fr->padding - 4;
|
fr->framesize = fr->framesize + fr->padding - 4;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
//printf("Sorry, unknown layer type.\n");
|
debug_printf("%d Sorry, unknown layer type.\n", __LINE__);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
return 1;
|
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 *modes[4] = { "Stereo", "Joint-Stereo", "Dual-Channel", "Single-Channel" };
|
||||||
static char *layers[4] = { "Unknown" , "I", "II", "III" };
|
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"),
|
fr->mpeg25 ? "2.5" : (fr->lsf ? "2.0" : "1.0"),
|
||||||
layers[fr->lay],freqs[fr->sampling_frequency],
|
layers[fr->lay],freqs[fr->sampling_frequency],
|
||||||
modes[fr->mode],fr->mode_ext,fr->framesize+4);
|
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->stereo,fr->copyright?"Yes":"No",
|
||||||
fr->original?"Yes":"No",fr->error_protection?"Yes":"No",
|
fr->original?"Yes":"No",fr->error_protection?"Yes":"No",
|
||||||
fr->emphasis);
|
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);
|
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 *modes[4] = { "stereo", "joint-stereo", "dual-channel", "mono" };
|
||||||
static char *layers[4] = { "Unknown" , "I", "II", "III" };
|
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"),
|
fr->mpeg25 ? "2.5" : (fr->lsf ? "2.0" : "1.0"),
|
||||||
layers[fr->lay],
|
layers[fr->lay],
|
||||||
tabsel_123[fr->lsf][fr->lay-1][fr->bitrate_index],
|
tabsel_123[fr->lsf][fr->lay-1][fr->bitrate_index],
|
||||||
|
|
|
@ -28,10 +28,10 @@ static unsigned long ntom_step = NTOM_MUL;
|
||||||
int synth_ntom_set_step(long m,long n)
|
int synth_ntom_set_step(long m,long n)
|
||||||
{
|
{
|
||||||
if(param.verbose > 1)
|
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) {
|
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);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ int synth_ntom_set_step(long m,long n)
|
||||||
ntom_step = n / m;
|
ntom_step = n / m;
|
||||||
|
|
||||||
if(ntom_step > 8*NTOM_MUL) {
|
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);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
#include "mpg123.h"
|
#include "mpg123.h"
|
||||||
#include "mpglib.h"
|
#include "mpglib.h"
|
||||||
|
|
||||||
|
|
||||||
void InitMP3Constants(void)
|
void InitMP3Constants(void)
|
||||||
{
|
{
|
||||||
init_layer3_const();
|
init_layer3_const();
|
||||||
|
@ -55,7 +54,7 @@ static struct buf *addbuf(struct mpstr *mp,char *buf,int size)
|
||||||
|
|
||||||
nbuf = malloc( sizeof(struct buf) );
|
nbuf = malloc( sizeof(struct buf) );
|
||||||
if(!nbuf) {
|
if(!nbuf) {
|
||||||
//printf("Out of memory!\n");
|
debug_printf("%d Out of memory!\n", __LINE__);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
nbuf->pnt = malloc(size);
|
nbuf->pnt = malloc(size);
|
||||||
|
@ -109,7 +108,7 @@ static int read_buf_byte(int *error, struct mpstr *mp)
|
||||||
if(!mp->tail) {
|
if(!mp->tail) {
|
||||||
/* We may pick up this error a few times*/
|
/* We may pick up this error a few times*/
|
||||||
/* But things have gone pear shaped */
|
/* But things have gone pear shaped */
|
||||||
//printf("Fatal Buffer error!\n");
|
debug_printf("%d Fatal Buffer error!\n", __LINE__);
|
||||||
*error = 1;
|
*error = 1;
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
@ -190,7 +189,7 @@ int decodeMP3(struct mpstr *mp,char *in,int isize,char *out,
|
||||||
int down_sample_sblimit;
|
int down_sample_sblimit;
|
||||||
|
|
||||||
if(osize < 4608) {
|
if(osize < 4608) {
|
||||||
//printf("To less out space\n");
|
debug_printf("%d To less out space\n", __LINE__);
|
||||||
return MP3_ERR;
|
return MP3_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -211,7 +210,7 @@ int decodeMP3(struct mpstr *mp,char *in,int isize,char *out,
|
||||||
if(!head_check(mp->header) ) {
|
if(!head_check(mp->header) ) {
|
||||||
int i;
|
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 */
|
/* step in byte steps through next 64K */
|
||||||
for(i=0;i<65536;i++) {
|
for(i=0;i<65536;i++) {
|
||||||
|
@ -225,7 +224,7 @@ int decodeMP3(struct mpstr *mp,char *in,int isize,char *out,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if(i == 65536) {
|
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;
|
return MP3_ERR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -305,7 +304,7 @@ int set_pointer(struct mpstr *mp, long backstep)
|
||||||
{
|
{
|
||||||
unsigned char *bsbufold;
|
unsigned char *bsbufold;
|
||||||
if(mp->fsizeold < 0 && backstep > 0) {
|
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;
|
return MP3_ERR;
|
||||||
}
|
}
|
||||||
bsbufold = mp->bsspace[mp->bsnum] + 512;
|
bsbufold = mp->bsspace[mp->bsnum] + 512;
|
||||||
|
|
|
@ -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->part2_3_length = getbits(mp, 12);
|
||||||
gr_info->big_values = getbits_fast(mp, 9);
|
gr_info->big_values = getbits_fast(mp, 9);
|
||||||
if(gr_info->big_values > 288) {
|
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->big_values = 288;
|
||||||
}
|
}
|
||||||
gr_info->pow2gain = gainpow2+256 - getbits_fast(mp, 8) + powdiff;
|
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);
|
gr_info->full_gain[i] = gr_info->pow2gain + (getbits_fast(mp, 3)<<3);
|
||||||
|
|
||||||
if(gr_info->block_type == 0) {
|
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);
|
return (1);
|
||||||
}
|
}
|
||||||
/* region_count/start parameters are implicit in this case. */
|
/* 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->part2_3_length = getbits(mp, 12);
|
||||||
gr_info->big_values = getbits_fast(mp, 9);
|
gr_info->big_values = getbits_fast(mp, 9);
|
||||||
if(gr_info->big_values > 288) {
|
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->big_values = 288;
|
||||||
}
|
}
|
||||||
gr_info->pow2gain = gainpow2+256 - getbits_fast(mp, 8) + powdiff;
|
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);
|
gr_info->full_gain[i] = gr_info->pow2gain + (getbits_fast(mp, 3)<<3);
|
||||||
|
|
||||||
if(gr_info->block_type == 0) {
|
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);
|
return (1);
|
||||||
}
|
}
|
||||||
/* region_count/start parameters are implicit in this case. */
|
/* 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)
|
if(part2remain > 0)
|
||||||
getbits(mp, part2remain);
|
getbits(mp, part2remain);
|
||||||
else if(part2remain < 0) {
|
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 1; /* -> error */
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1374,7 +1374,7 @@ static int III_dequantize_sample_ms(real xr[2][SBLIMIT][SSLIMIT],int *scf,
|
||||||
if(part2remain > 0 )
|
if(part2remain > 0 )
|
||||||
getbits(mp, part2remain);
|
getbits(mp, part2remain);
|
||||||
else if(part2remain < 0) {
|
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 1; /* -> error */
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1920,7 +1920,7 @@ int do_layer3(struct mpstr *mp,unsigned char *pcm_sample,int *pcm_point)
|
||||||
return (MP3_ERR);
|
return (MP3_ERR);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
//printf("Not supported\n");
|
debug_printf("%d Not supported\n", __LINE__);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1941,7 +1941,7 @@ int do_layer3(struct mpstr *mp,unsigned char *pcm_sample,int *pcm_point)
|
||||||
#ifdef MPEG1
|
#ifdef MPEG1
|
||||||
part2bits = III_get_scale_factors_1(mp, scalefacs,gr_info);
|
part2bits = III_get_scale_factors_1(mp, scalefacs,gr_info);
|
||||||
#else
|
#else
|
||||||
//printf("Not supported\n");
|
debug_printf("%d Not supported\n", __LINE__);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
if(III_dequantize_sample(mp, hybridIn[0], scalefacs,gr_info,sfreq,part2bits))
|
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
|
#ifdef MPEG1
|
||||||
part2bits = III_get_scale_factors_1(mp, scalefacs,gr_info);
|
part2bits = III_get_scale_factors_1(mp, scalefacs,gr_info);
|
||||||
#else
|
#else
|
||||||
//printf("Not supported\n");
|
debug_printf("%d Not supported\n", __LINE__);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -39,7 +39,8 @@
|
||||||
|
|
||||||
|
|
||||||
#define OUTSCALE 4096
|
#define OUTSCALE 4096
|
||||||
#define MP3BUFLEN OUTSCALE * 2
|
#define MP3_SCACHE 16384
|
||||||
|
#define MP3_DCACHE 8192
|
||||||
|
|
||||||
static const char modname[] = "mod_shout";
|
static const char modname[] = "mod_shout";
|
||||||
|
|
||||||
|
@ -51,10 +52,15 @@ struct shout_context {
|
||||||
lame_global_flags *gfp;
|
lame_global_flags *gfp;
|
||||||
char *stream_url;
|
char *stream_url;
|
||||||
switch_mutex_t *audio_mutex;
|
switch_mutex_t *audio_mutex;
|
||||||
|
switch_mutex_t *mp3_mutex;
|
||||||
switch_buffer_t *audio_buffer;
|
switch_buffer_t *audio_buffer;
|
||||||
|
switch_buffer_t *mp3_buffer;
|
||||||
switch_memory_pool_t *memory_pool;
|
switch_memory_pool_t *memory_pool;
|
||||||
char decode_buf[MP3BUFLEN];
|
//char encode_buf[MP3_SCACHE];
|
||||||
|
char decode_buf[MP3_DCACHE];
|
||||||
struct mpstr mp;
|
struct mpstr mp;
|
||||||
|
int err;
|
||||||
|
int dlen;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct shout_context shout_context_t;
|
typedef struct shout_context shout_context_t;
|
||||||
|
@ -63,7 +69,13 @@ static inline void free_context(shout_context_t *context)
|
||||||
{
|
{
|
||||||
if (context) {
|
if (context) {
|
||||||
if (context->audio_buffer) {
|
if (context->audio_buffer) {
|
||||||
|
switch_mutex_lock(context->audio_mutex);
|
||||||
switch_buffer_destroy(&context->audio_buffer);
|
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) {
|
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)
|
static size_t stream_callback(void *ptr, size_t size, size_t nmemb, void *data)
|
||||||
{
|
{
|
||||||
register unsigned int realsize = (unsigned int)(size * nmemb);
|
register unsigned int realsize = (unsigned int)(size * nmemb);
|
||||||
shout_context_t *context = data;
|
shout_context_t *context = data;
|
||||||
int dlen;
|
int rlen;
|
||||||
|
char grr[1024];
|
||||||
decodeMP3(&context->mp, data, realsize, context->decode_buf, sizeof(context->decode_buf), &dlen);
|
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_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);
|
switch_mutex_unlock(context->audio_mutex);
|
||||||
|
out = context->decode_buf;
|
||||||
|
outlen = sizeof(context->decode_buf);
|
||||||
|
|
||||||
|
printf("doh\n");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return realsize;
|
return realsize;
|
||||||
}
|
}
|
||||||
|
@ -181,6 +241,7 @@ static void *SWITCH_THREAD_FUNC stream_thread(switch_thread_t *thread, void *obj
|
||||||
CURL *curl_handle = NULL;
|
CURL *curl_handle = NULL;
|
||||||
shout_context_t *context = (shout_context_t *) obj;
|
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_URL, context->stream_url);
|
||||||
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, stream_callback);
|
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, stream_callback);
|
||||||
curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)context);
|
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");
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Memory Error!\n");
|
||||||
goto error;
|
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->audio_mutex, SWITCH_MUTEX_NESTED, context->memory_pool);
|
||||||
|
switch_mutex_init(&context->mp3_mutex, SWITCH_MUTEX_NESTED, context->memory_pool);
|
||||||
InitMP3(&context->mp, OUTSCALE);
|
InitMP3(&context->mp, OUTSCALE);
|
||||||
context->stream_url = switch_core_sprintf(context->memory_pool, "http://%s", path);
|
context->stream_url = switch_core_sprintf(context->memory_pool, "http://%s", path);
|
||||||
launch_stream_thread(context);
|
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)
|
static switch_status_t shout_file_read(switch_file_handle_t *handle, void *data, size_t *len)
|
||||||
{
|
{
|
||||||
shout_context_t *context = handle->private_info;
|
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);
|
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);
|
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)
|
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;
|
*module_interface = &shout_module_interface;
|
||||||
|
|
||||||
shout_init();
|
shout_init();
|
||||||
|
InitMP3Constants();
|
||||||
|
|
||||||
/* indicate that the module should continue to be loaded */
|
/* indicate that the module should continue to be loaded */
|
||||||
return SWITCH_STATUS_SUCCESS;
|
return SWITCH_STATUS_SUCCESS;
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
#ifndef DEBUG_MP3
|
||||||
|
#define debug_printf(fmt,...) printf(fmt, ##__VA_ARGS__);
|
||||||
|
#else
|
||||||
|
#define debug_printf;
|
||||||
|
#endif
|
||||||
|
|
||||||
struct buf {
|
struct buf {
|
||||||
unsigned char *pnt;
|
unsigned char *pnt;
|
||||||
|
|
Loading…
Reference in New Issue