From 03cc800f0c381d340f71515d195954b90314cdc5 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 24 Jul 2008 23:15:07 +0000 Subject: [PATCH] omfg git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@9173 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- src/mod/formats/mod_shout/layer3.c | 3 +++ src/mod/formats/mod_shout/mod_shout.c | 34 +++++++++++++++------------ 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/src/mod/formats/mod_shout/layer3.c b/src/mod/formats/mod_shout/layer3.c index 0c8ca54e2d..4814240ad5 100644 --- a/src/mod/formats/mod_shout/layer3.c +++ b/src/mod/formats/mod_shout/layer3.c @@ -985,12 +985,15 @@ static int III_dequantize_sample(struct mpstr *mp, real xr[SBLIMIT][SSLIMIT], in getbits(mp, 16); /* Dismiss stuffing Bits */ part2remain -= 16; } + if (part2remain > 0) getbits(mp, part2remain); +#if 0 else if (part2remain < 0) { debug_printf("mpg123: %d Can't rewind stream by %d bits!\n", -part2remain, __LINE__); return 1; /* -> error */ } +#endif return 0; } diff --git a/src/mod/formats/mod_shout/mod_shout.c b/src/mod/formats/mod_shout/mod_shout.c index e619ed2e30..d8821c7fa1 100644 --- a/src/mod/formats/mod_shout/mod_shout.c +++ b/src/mod/formats/mod_shout/mod_shout.c @@ -66,6 +66,7 @@ struct shout_context { uint8_t shout_init; uint32_t prebuf; int lame_ready; + int eof; }; typedef struct shout_context shout_context_t; @@ -232,11 +233,12 @@ static size_t decode_fd(shout_context_t *context, void *data, size_t bytes) size_t used; size_t lp; size_t rb = 0; - - while (switch_buffer_inuse(context->audio_buffer) < bytes) { + + while (!context->eof && 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; + context->eof++; + goto end; } inlen = (int) lp; @@ -253,7 +255,7 @@ static size_t decode_fd(shout_context_t *context, void *data, size_t bytes) do { decode_status = decodeMP3(&context->mp, in, inlen, out, outlen, &dlen); - + if (context->err) { goto error; } @@ -274,22 +276,20 @@ static size_t decode_fd(shout_context_t *context, void *data, size_t bytes) out = context->decode_buf; outlen = sizeof(context->decode_buf); usedlen = 0; + continue; - - } - - if (decode_status == MP3_ERR) { + + } else if (decode_status == MP3_ERR) { if (++context->mp3err >= 5) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Decoder Error!\n"); - goto error; + context->eof++; + goto end; } - - dlen = 0; continue; } context->mp3err = 0; - + usedlen += dlen; out += dlen; outlen -= dlen; @@ -309,16 +309,20 @@ static size_t decode_fd(shout_context_t *context, void *data, size_t bytes) } } + end: + used = switch_buffer_inuse(context->audio_buffer); - if (done || used >= bytes) { - rb = switch_buffer_read(context->audio_buffer, data, used); + if (context->eof || done || used >= bytes) { + if (!(rb = switch_buffer_read(context->audio_buffer, data, bytes))) { + goto error; + } return rb; } return 0; - error: + error: switch_mutex_lock(context->audio_mutex); context->err++; switch_mutex_unlock(context->audio_mutex);