From 09fbbdc366edb9d968a277c8635c9410417df099 Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@duempel.org>
Date: Tue, 26 Aug 2008 08:27:12 +0200
Subject: mp3: moved code to dither_buffer()

Preparing for simplifying and thus speeding up the dithering code:
moved dithering to a separate function which contains a trivial loop.
With this patch, only one sample is dithered at a time, but the
following patches will allow us to dither a whole block at a time,
without complicated buffer length checks.
---
 src/inputPlugins/mp3_plugin.c | 44 +++++++++++++++++++++++++++++--------------
 1 file changed, 30 insertions(+), 14 deletions(-)

(limited to 'src')

diff --git a/src/inputPlugins/mp3_plugin.c b/src/inputPlugins/mp3_plugin.c
index 87fbfb49c..9bdaedb4d 100644
--- a/src/inputPlugins/mp3_plugin.c
+++ b/src/inputPlugins/mp3_plugin.c
@@ -105,6 +105,30 @@ static signed long audio_linear_dither(unsigned int bits, mad_fixed_t sample,
 	return output >> scalebits;
 }
 
+static unsigned dither_buffer(mpd_sint16 *dest0, const struct mad_synth *synth,
+			      struct audio_dither *dither,
+			      unsigned int start, unsigned int end,
+			      unsigned int num_channels)
+{
+	mpd_sint16 *dest = dest0;
+	unsigned int i;
+
+	for (i = start; i < end; ++i) {
+		*dest++ = (mpd_sint16)
+			audio_linear_dither(16,
+					    synth->pcm.samples[0][i],
+					    dither);
+
+		if (num_channels == 2)
+			*dest++ = (mpd_sint16)
+				audio_linear_dither(16,
+						    synth->pcm.samples[1][i],
+						    dither);
+	}
+
+	return dest - dest0;
+}
+
 /* end of stolen stuff from mpg321 */
 
 static int mp3_plugin_init(void)
@@ -909,7 +933,7 @@ static int mp3Read(mp3DecodeData * data, struct decoder *decoder,
 			i = 0;
 
 		for (; i < (data->synth).pcm.length; i++) {
-			mpd_sint16 *sample;
+			unsigned int num_samples;
 
 			samplesLeft--;
 
@@ -921,19 +945,11 @@ static int mp3Read(mp3DecodeData * data, struct decoder *decoder,
 				return DECODE_BREAK;
 			}
 
-			sample = (mpd_sint16 *) data->outputPtr;
-			*sample = (mpd_sint16) audio_linear_dither(16,
-								   (data->synth).pcm.samples[0][i],
-								   &(data->dither));
-			data->outputPtr += 2;
-
-			if (MAD_NCHANNELS(&(data->frame).header) == 2) {
-				sample = (mpd_sint16 *) data->outputPtr;
-				*sample = (mpd_sint16) audio_linear_dither(16,
-									   (data->synth).pcm.samples[1][i],
-									   &(data->dither));
-				data->outputPtr += 2;
-			}
+			num_samples = dither_buffer((mpd_sint16 *) data->outputPtr,
+						    &data->synth, &data->dither,
+						    i, i + 1,
+						    MAD_NCHANNELS(&(data->frame).header));
+			data->outputPtr += 2 * num_samples;
 
 			if (data->outputPtr >= data->outputBufferEnd) {
 				enum decoder_command cmd;
-- 
cgit v1.2.3