From a5a15beac2eedeccbb11e4f2f28878f5df00c38b Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@duempel.org>
Date: Mon, 2 Mar 2009 16:41:10 +0100
Subject: pcm_convert: added 32 bit support

All PCM sub libraries have 32 bit support now.  Add support to the
glue function pcm_convert().
---
 src/pcm_convert.c | 42 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)

diff --git a/src/pcm_convert.c b/src/pcm_convert.c
index dbef443dd..cf4676489 100644
--- a/src/pcm_convert.c
+++ b/src/pcm_convert.c
@@ -123,6 +123,43 @@ pcm_convert_24(struct pcm_convert_state *state,
 	return buf;
 }
 
+static const int32_t *
+pcm_convert_32(struct pcm_convert_state *state,
+	       const struct audio_format *src_format,
+	       const void *src_buffer, size_t src_size,
+	       const struct audio_format *dest_format,
+	       size_t *dest_size_r)
+{
+	const int32_t *buf;
+	size_t len;
+
+	assert(dest_format->bits == 32);
+
+	buf = pcm_convert_to_32(&state->format_buffer, src_format->bits,
+				src_buffer, src_size, &len);
+	if (!buf)
+		g_error("pcm_convert_to_32() failed");
+
+	if (src_format->channels != dest_format->channels) {
+		buf = pcm_convert_channels_32(&state->channels_buffer,
+					      dest_format->channels,
+					      src_format->channels,
+					      buf, len, &len);
+		if (!buf)
+			g_error("pcm_convert_channels_32() failed");
+	}
+
+	if (src_format->sample_rate != dest_format->sample_rate)
+		buf = pcm_resample_32(&state->resample,
+				      dest_format->channels,
+				      src_format->sample_rate, buf, len,
+				      dest_format->sample_rate,
+				      &len);
+
+	*dest_size_r = len;
+	return buf;
+}
+
 const void *
 pcm_convert(struct pcm_convert_state *state,
 	    const struct audio_format *src_format,
@@ -141,6 +178,11 @@ pcm_convert(struct pcm_convert_state *state,
 				      src_format, src, src_size,
 				      dest_format, dest_size_r);
 
+	case 32:
+		return pcm_convert_32(state,
+				      src_format, src, src_size,
+				      dest_format, dest_size_r);
+
 	default:
 		g_error("cannot convert to %u bit\n", dest_format->bits);
 		return 0;
-- 
cgit v1.2.3