From ee5d3337a776f3d8af5cc6996023320b711f6b95 Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@duempel.org>
Date: Wed, 11 Nov 2009 21:49:00 +0100
Subject: [PATCH] decoder/wavpack: activate 32 bit support

MPD has been supporting 32 bit samples since version 0.15.  This patch
changes one check, and removes the 32->24 conversion code.

Note that WavPack floating point samples have 32 bits, and MPD doesn't
have a special check for floating point - therefore, this WavPack
plugin still returns 24 bit integer samples as before (until we have
float support in the MPD core).
---
 NEWS                         |  1 +
 src/decoder/wavpack_plugin.c | 20 +++++++-------------
 2 files changed, 8 insertions(+), 13 deletions(-)

diff --git a/NEWS b/NEWS
index 193d984f9..212f4a688 100644
--- a/NEWS
+++ b/NEWS
@@ -24,6 +24,7 @@ ver 0.16 (20??/??/??)
   - sidplay: support sub-tunes
   - sidplay: implemented songlength database
   - sidplay: support seeking
+  - wavpack: activate 32 bit support
 * encoders:
   - twolame: new encoder plugin based on libtwolame
 * output:
diff --git a/src/decoder/wavpack_plugin.c b/src/decoder/wavpack_plugin.c
index 3e7c0cef7..e2f0e9dfb 100644
--- a/src/decoder/wavpack_plugin.c
+++ b/src/decoder/wavpack_plugin.c
@@ -97,19 +97,11 @@ format_samples_int(int bytes_per_sample, void *buffer, uint32_t count)
 		}
 		break;
 	}
+
 	case 3:
+	case 4:
 		/* do nothing */
 		break;
-	case 4: {
-		uint32_t *dst = buffer;
-		assert_static(sizeof(*dst) <= sizeof(*src));
-
-		/* downsample to 24-bit */
-		while (count--) {
-			*dst++ = *src++ >> 8;
-		}
-		break;
-	}
 	}
 }
 
@@ -151,10 +143,12 @@ wavpack_decode(struct decoder *decoder, WavpackContext *wpc, bool can_seek,
 
 	/* round bitwidth to 8-bit units */
 	audio_format.bits = (audio_format.bits + 7) & (~7);
-	/* mpd handles max 24-bit samples */
-	if (audio_format.bits > 24) {
+	/* MPD handles max 32-bit samples */
+	if (audio_format.bits > 32)
+		audio_format.bits = 32;
+
+	if ((WavpackGetMode(wpc) & MODE_FLOAT) == MODE_FLOAT)
 		audio_format.bits = 24;
-	}
 
 	if (!audio_format_valid(&audio_format)) {
 		g_warning("Invalid audio format: %u:%u:%u\n",