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