]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
omfg
authorAnthony Minessale <anthony.minessale@gmail.com>
Thu, 24 Jul 2008 23:15:07 +0000 (23:15 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Thu, 24 Jul 2008 23:15:07 +0000 (23:15 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@9173 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/mod/formats/mod_shout/layer3.c
src/mod/formats/mod_shout/mod_shout.c

index 0c8ca54e2d36d74d14be3c68095ab1412afc34a2..4814240ad57afe10630a2c8542a7d60d0768375e 100644 (file)
@@ -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;
 }
 
index e619ed2e3009348c5e9852ce21c004b5a9878806..d8821c7fa12f93e163a67e59c885397f9a4c0a96 100644 (file)
@@ -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);