From 69a0b86173f0bbe58753c912075bb3ee382417db Mon Sep 17 00:00:00 2001
From: Warren Dukes <warren.dukes@gmail.com>
Date: Mon, 10 May 2004 22:31:23 +0000
Subject: [PATCH] trash XMMS resampling, use ESD's instead, don't understand
 it, but it works

git-svn-id: https://svn.musicpd.org/mpd/trunk@979 09075e82-0dd4-0310-85a5-a0d7c8717e4f
---
 src/audio.c       |  2 ++
 src/flac_decode.c |  5 +++--
 src/ogg_decode.c  |  2 +-
 src/pcm_utils.c   | 56 +++++++++++++++++++----------------------------
 4 files changed, 28 insertions(+), 37 deletions(-)

diff --git a/src/audio.c b/src/audio.c
index 5de64b447..e340771ca 100644
--- a/src/audio.c
+++ b/src/audio.c
@@ -152,6 +152,8 @@ void initAudioConfig() {
         switch(audio_configFormat->sampleRate) {
         case 48000:
         case 44100:
+        case 32000:
+        case 16000:
                 break;
         default:
                 ERROR("sample rate %i can not be used for audio output\n",
diff --git a/src/flac_decode.c b/src/flac_decode.c
index 93c114068..c3780ef58 100644
--- a/src/flac_decode.c
+++ b/src/flac_decode.c
@@ -35,7 +35,8 @@
 #include <FLAC/metadata.h>
 
 typedef struct {
-	unsigned char chunk[CHUNK_SIZE];
+#define FLAC_CHUNK_SIZE 4080
+	unsigned char chunk[FLAC_CHUNK_SIZE];
 	int chunk_length;
 	float time;
 	int bitRate;
@@ -417,7 +418,7 @@ FLAC__StreamDecoderWriteStatus flacWrite(const FLAC__SeekableStreamDecoder *dec,
 			u16 = buf[c_chan][c_samp];
 			uc = (unsigned char *)&u16;
 			for(i=0;i<(data->dc->audioFormat.bits/8);i++) {
-				if(data->chunk_length>=CHUNK_SIZE) {
+				if(data->chunk_length>=FLAC_CHUNK_SIZE) {
 					if(flacSendChunk(data)<0) {
 						return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
 					}
diff --git a/src/ogg_decode.c b/src/ogg_decode.c
index 39f3bd89e..cda00e6cb 100644
--- a/src/ogg_decode.c
+++ b/src/ogg_decode.c
@@ -181,7 +181,7 @@ int ogg_decode(OutputBuffer * cb, DecoderControl * dc)
 		int current_section;
 		int eof = 0;
 		long ret;
-#define OGG_CHUNK_SIZE	64
+#define OGG_CHUNK_SIZE 4096
 		char chunk[OGG_CHUNK_SIZE];
 		int chunkpos = 0;
 		long bitRate = 0;
diff --git a/src/pcm_utils.c b/src/pcm_utils.c
index ba387a4b1..e0ebf2ecb 100644
--- a/src/pcm_utils.c
+++ b/src/pcm_utils.c
@@ -218,41 +218,29 @@ void pcm_convertAudioFormat(AudioFormat * inFormat, char * inBuffer, size_t
 	}
 	else {
 		/* only works if outFormat is 16-bit stereo! */
-		/* resampling code blatantly ripped from XMMS */
-		const int shift = sizeof(mpd_sint16);
-		int x1 = 0, frac;
-		mpd_sint32 i, in_samples, out_samples, x, delta;
-		mpd_sint16 * inptr = (mpd_sint16 *)dataChannelConv;
-		mpd_sint16 * outptr = (mpd_sint16 *)outBuffer;
-		mpd_uint32 nlen = (((dataChannelLen >> shift) * 
-				(outFormat->sampleRate)) / 
+		/* resampling code blatantly ripped from ESD */
+                mpd_sint32 rd_dat = 0;
+                mpd_uint32 wr_dat = 0;
+                mpd_sint16 lsample, rsample;
+                register mpd_sint16 * out = (mpd_sint16 *)outBuffer;
+                register mpd_sint16 * in = (mpd_sint16 *)dataChannelConv;
+                const int shift = sizeof(mpd_sint16);
+	        mpd_uint32 nlen = ((( dataChannelLen >> shift) * 
+                                (mpd_uint32)(outFormat->sampleRate)) /
 				inFormat->sampleRate);
-		nlen <<= shift;
-		in_samples = dataChannelLen >> shift;
-		out_samples = nlen >> shift;
-                //printf("in_samples=%i out_samples=%i\n",in_samples,out_samples);
-		delta = ((in_samples-1) << 12) / (out_samples-1);
-		for(x = 0, i = 0; i < out_samples; i++) {
-                        //int i1,i2,i3,i4;
-			x1 = (x >> 12) << 12;
-			frac = x - x1;
-                        /*        i1 = (x1 >> 12) << 1;
-                                i2 = ((x1 >> 12) + 1) << 1;
-                                i3 = ((x1 >> 12) << 1) + 1;
-                                i4 = (((x1 >> 12) + 1) << 1) + 1;
-                                printf("%i,%i,%i,%i\n",i1,i2,i3,i4);*/
-			*outptr++ = 
-				((inptr[(x1 >> 12) << 1] * 
-				((1<<12) - frac) +
-				inptr[((x1 >> 12) + 1) << 1 ] *
-				frac) >> 12);
-			*outptr++ =
-				((inptr[((x1 >> 12) << 1) + 1] *
-				((1<<12) - frac) +
-				inptr[(((x1 >> 12) + 1) << 1) + 1] *
-				frac) >> 12);
-			x += delta;
-		}
+                nlen <<= shift;
+
+                while( wr_dat < nlen / shift) {
+                        rd_dat = wr_dat * inFormat->sampleRate / 
+                                outFormat->sampleRate;
+                        rd_dat &= ~1;
+
+                        lsample = in[ rd_dat++ ];
+                        rsample = in[ rd_dat++ ];
+
+                        out[ wr_dat++ ] = lsample;
+                        out[ wr_dat++ ] = rsample;
+                }
 	}
 
 	return;