Author: titmuss
Date: Fri Dec 19 15:19:15 2008
New Revision: 3587

URL: http://svn.slimdevices.com?rev=3587&root=Jive&view=rev
Log:
Bug: 10130
Description:
Fix crash with mp3 mono files.


Modified:
    7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_mad.c
    7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_priv.h

Modified: 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_mad.c
URL: 
http://svn.slimdevices.com/7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_mad.c?rev=3587&root=Jive&r1=3586&r2=3587&view=diff
==============================================================================
--- 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_mad.c 
(original)
+++ 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_mad.c Fri Dec 
19 15:19:15 2008
@@ -20,7 +20,7 @@
  */
 #define INPUT_BUFFER_SIZE 2890
 
-#define OUTPUT_BUFFER_FRAMES 2*32*36
+#define OUTPUT_BUFFER_FRAMES 2048
 #define OUTPUT_BUFFER_BYTES (OUTPUT_BUFFER_FRAMES * sizeof(sample_t))
 
 #define ID3_TAG_FLAG_FOOTERPRESENT 0x10
@@ -313,7 +313,7 @@
 
 static void decode_mad_output(struct decode_mad *self) {
        struct mad_pcm *pcm;
-       sample_t *buf;
+       sample_t *buf, *buf_end;
        mad_fixed_t *left, *right;
        int i, offset = 0;
 
@@ -346,31 +346,17 @@
                self->sample_rate = self->frame.header.samplerate;
 
                buf = self->output_buffer;
+               buf_end = self->output_buffer + OUTPUT_BUFFER_FRAMES;
 
                left = pcm->samples[0];
-               right = pcm->samples[1];
 
                if (pcm->channels == 2) {
-                       /* stero */
-                       assert(SAMPLES_TO_BYTES(pcm->length) <= 
OUTPUT_BUFFER_BYTES);
-
-                       for (i=0; i<pcm->length; i++) {
-                               *buf++ = mad_fixed_to_32bit(*left++);
-                               *buf++ = mad_fixed_to_32bit(*right++);
-                       }
+                       /* stereo */
+                       right = pcm->samples[1];
                }
                else {
                        /* mono */
-                       sample_t s;
-
-                       assert(SAMPLES_TO_BYTES(pcm->length * 2) <= 
OUTPUT_BUFFER_BYTES);
-
-                       for (i=0; i<pcm->length; i++) {
-                               s = mad_fixed_to_32bit(*left++);
-
-                               *buf++ = s;
-                               *buf++ = s;
-                       }
+                       right = pcm->samples[0];
                }
 
                /* skip samples for the encoder delay */
@@ -384,8 +370,22 @@
                        DEBUG_TRACE("Skip encoder_delay=%d pcm->length=%d 
offset=%d", self->encoder_delay, pcm->length, offset);
                }
 
-               decode_output_samples(self->output_buffer + (offset * 2),
-                                     pcm->length - offset,
+               for (i=offset; i<pcm->length; i++) {
+                       *buf++ = mad_fixed_to_32bit(*left++);
+                       *buf++ = mad_fixed_to_32bit(*right++);
+
+                       if (buf == buf_end) {
+                               decode_output_samples(self->output_buffer,
+                                                     (buf - 
self->output_buffer) / 2,
+                                                     self->sample_rate,
+                                                     FALSE);
+
+                               buf = self->output_buffer;
+                       }
+               }
+
+               decode_output_samples(self->output_buffer,
+                                     (buf - self->output_buffer) / 2,
                                      self->sample_rate,
                                      FALSE);
        }

Modified: 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_priv.h
URL: 
http://svn.slimdevices.com/7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_priv.h?rev=3587&root=Jive&r1=3586&r2=3587&view=diff
==============================================================================
--- 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_priv.h 
(original)
+++ 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_priv.h Fri 
Dec 19 15:19:15 2008
@@ -116,7 +116,7 @@
 
 #define DECODE_FIFO_SIZE (10 * 2 * 44100 * sizeof(sample_t)) 
 #define SAMPLES_TO_BYTES(n)  (2 * (n) * sizeof(sample_t))
-#define BYTES_TO_SAMPLES(n)  (n / (2 * sizeof(sample_t)))
+#define BYTES_TO_SAMPLES(n)  ((n) / (2 * sizeof(sample_t)))
 
 /* State variables for the current track */
 extern u32_t decode_num_tracks_started;

_______________________________________________
Jive-checkins mailing list
[email protected]
http://lists.slimdevices.com/cgi-bin/mailman/listinfo/jive-checkins

Reply via email to