From 62000670e3b574cf7fd761ee081693735781e768 Mon Sep 17 00:00:00 2001
From: Nils Schneider <nils@nilsschneider.net>
Date: Sun, 14 Aug 2016 18:45:32 +0200
Subject: [PATCH] Support S24_P32/S32/FLOAT sample formats on Pulse

This is based on a patch from Ian Scott in 2014. It was never committed,
so I figured I'd fix the outstanding issue and resubmit it.

https://www.mail-archive.com/mpd-devel%40musicpd.org/msg00139.html
---
 NEWS                                     |  2 ++
 src/output/plugins/PulseOutputPlugin.cxx | 26 ++++++++++++++++++++----
 2 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/NEWS b/NEWS
index 9a7a69ec9..9b9ceadef 100644
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,6 @@
 ver 0.19.19 (not yet released)
+* output
+  - pulse: support 32 bit, 24 bit and floating point playback
 
 ver 0.19.18 (2016/08/05)
 * decoder
diff --git a/src/output/plugins/PulseOutputPlugin.cxx b/src/output/plugins/PulseOutputPlugin.cxx
index a9a84bc24..230114559 100644
--- a/src/output/plugins/PulseOutputPlugin.cxx
+++ b/src/output/plugins/PulseOutputPlugin.cxx
@@ -574,12 +574,30 @@ pulse_output_open(AudioOutput *ao, AudioFormat &audio_format,
 		return false;
 	}
 
-	/* MPD doesn't support the other pulseaudio sample formats, so
-	   we just force MPD to send us everything as 16 bit */
-	audio_format.format = SampleFormat::S16;
+	/* Use the sample formats that our version of PulseAudio and MPD
+	   have in common, otherwise force MPD to send 16 bit */
 
 	pa_sample_spec ss;
-	ss.format = PA_SAMPLE_S16NE;
+
+	switch (audio_format.format) {
+	case SampleFormat::FLOAT:
+		ss.format = PA_SAMPLE_FLOAT32NE;
+		break;
+	case SampleFormat::S32:
+		ss.format = PA_SAMPLE_S32NE;
+		break;
+	case SampleFormat::S24_P32:
+		ss.format = PA_SAMPLE_S24_32NE;
+		break;
+	case SampleFormat::S16:
+		ss.format = PA_SAMPLE_S16NE;
+		break;
+	default:
+		audio_format.format = SampleFormat::S16;
+		ss.format = PA_SAMPLE_S16NE;
+		break;
+	}
+
 	ss.rate = audio_format.sample_rate;
 	ss.channels = audio_format.channels;