From 8b4829c2fe10cd4019ba8c352cf1d4d177e8a064 Mon Sep 17 00:00:00 2001
From: Max Kellermann <mk@cm4all.com>
Date: Fri, 24 Oct 2008 08:41:34 +0200
Subject: [PATCH] pcm_resample: support for libsamplerate < 0.1.3

libsamplerate 0.1.2 didn't have the 32 bit <-> float conversion
routines.  Emulate them in case they aren't supported.
---
 configure.ac                     |  5 +++++
 src/pcm_resample_libsamplerate.c | 20 ++++++++++++++++++++
 2 files changed, 25 insertions(+)

diff --git a/configure.ac b/configure.ac
index 76f4badb8..04b2b51c5 100644
--- a/configure.ac
+++ b/configure.ac
@@ -390,6 +390,11 @@ if test x$enable_lsr = xyes; then
 	                  [enable_lsr=no;AC_MSG_WARN([libsamplerate not found -- disabling])])
 fi
 
+if test x$enable_lsr = xyes; then
+	PKG_CHECK_MODULES([SAMPLERATE_013], [samplerate >= 0.1.3],,
+		[AC_DEFINE([HAVE_LIBSAMPLERATE_NOINT], 1, [libsamplerate doesn't provide src_int_to_float_array() (<0.1.3)])])
+fi
+
 AM_CONDITIONAL(HAVE_LIBSAMPLERATE, test x$enable_lsr = xyes)
 
 if test x$enable_fifo = xyes; then
diff --git a/src/pcm_resample_libsamplerate.c b/src/pcm_resample_libsamplerate.c
index 43a2a2f26..ced4a90b1 100644
--- a/src/pcm_resample_libsamplerate.c
+++ b/src/pcm_resample_libsamplerate.c
@@ -154,6 +154,26 @@ pcm_resample_16(uint8_t channels,
 	return data->output_frames_gen * sizeof(*dest_buffer) * channels;
 }
 
+#ifdef HAVE_LIBSAMPLERATE_NOINT
+
+/* libsamplerate introduced these functions in v0.1.3 */
+
+static void
+src_int_to_float_array(const int *in, float *out, int len)
+{
+	while (len-- > 0)
+		*out++ = *in++ / (float)(1 << (24 - 1));
+}
+
+static void
+src_float_to_int_array (const float *in, int *out, int len)
+{
+	while (len-- > 0)
+		*out++ = *in++ * (float)(1 << (24 - 1));
+}
+
+#endif
+
 size_t
 pcm_resample_24(uint8_t channels,
 		unsigned src_rate,