soxr: Use soxr_clear() if libsoxr version is 0.1.2 or later.
authorAndrey Semashev <andrey.semashev@gmail.com>
Sat, 31 Oct 2015 15:59:46 +0000 (18:59 +0300)
committerDavid Henningsson <david.henningsson@canonical.com>
Tue, 3 Nov 2015 05:39:50 +0000 (06:39 +0100)
The 0.1.2 version of libsoxr fixes soxr_process() crash after soxr_clear() is used, so check the library version at compile time and use soxr_clear() if possible.

src/pulsecore/resampler/soxr.c

index b5f00071b9c4e0b77b6d03a7c6c904aa66b9b839..b1b2e19dc968109c736d9e980774743df9544331 100644 (file)
@@ -64,17 +64,17 @@ static void resampler_soxr_free(pa_resampler *r) {
 }
 
 static void resampler_soxr_reset(pa_resampler *r) {
+#if SOXR_THIS_VERSION >= SOXR_VERSION(0, 1, 2)
+    pa_assert(r);
+
+    soxr_clear(r->impl.data);
+#else
+    /* With libsoxr prior to 0.1.2 soxr_clear() makes soxr_process() crash afterwards,
+     * so don't use this function and re-create the context instead. */
     soxr_t old_state;
 
     pa_assert(r);
 
-    /*
-     * soxr_clear() makes soxr_process() crash afterwards,
-     * so don't use this function until libsoxr is fixed.
-     *
-     * soxr_clear(r->impl.data);
-     */
-
     old_state = r->impl.data;
     r->impl.data = NULL;
 
@@ -85,6 +85,7 @@ static void resampler_soxr_reset(pa_resampler *r) {
         r->impl.data = old_state;
         pa_log_error("Failed to reset libsoxr context");
     }
+#endif
 }
 
 static void resampler_soxr_update_rates(pa_resampler *r) {