aboutsummaryrefslogtreecommitdiffstats
path: root/src/inputPlugins
diff options
context:
space:
mode:
Diffstat (limited to 'src/inputPlugins')
-rw-r--r--src/inputPlugins/mp3_plugin.c44
1 files changed, 30 insertions, 14 deletions
diff --git a/src/inputPlugins/mp3_plugin.c b/src/inputPlugins/mp3_plugin.c
index 11d543199..87c8d6ea9 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)
@@ -934,7 +958,7 @@ static int mp3Read(mp3DecodeData * data, ReplayGainInfo ** replayGainInfo)
i = 0;
for (; i < (data->synth).pcm.length; i++) {
- mpd_sint16 *sample;
+ unsigned int num_samples;
samplesLeft--;
@@ -946,19 +970,11 @@ static int mp3Read(mp3DecodeData * data, ReplayGainInfo ** replayGainInfo)
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 dc_action action = ob_send(