add NaN/Inf protection now that bypass no longer de/activates
authorRobin Gareus <robin@gareus.org>
Sat, 27 Aug 2016 12:10:51 +0000 (14:10 +0200)
committerRobin Gareus <robin@gareus.org>
Sat, 27 Aug 2016 12:10:51 +0000 (14:10 +0200)
libs/plugins/a-eq.lv2/a-eq.c
libs/plugins/a-reverb.lv2/a-reverb.c

index deac7a641ee0e62043da6192d18b0aedd18121ee..d286552e033b41f43220c0e604cf052b0c978eb5 100644 (file)
 #include <stdbool.h>
 #include <stdio.h>
 
+#ifdef COMPILER_MSVC
+#include <float.h>
+#define isfinite_local(val) (bool)_finite((double)val)
+#else
+#define isfinite_local isfinite
+#endif
+
 #include "lv2/lv2plug.in/ns/lv2core/lv2.h"
 
 #ifdef LV2_EXTENDED
@@ -92,6 +99,13 @@ static void linear_svf_reset(struct linear_svf *self)
        self->s[0] = self->s[1] = 0.0;
 }
 
+static void linear_svf_protect(struct linear_svf *self)
+{
+       if (!isfinite_local (self->s[0]) || !isfinite_local (self->s[1])) {
+               linear_svf_reset (self);
+       }
+}
+
 typedef struct {
        float* f0[BANDS];
        float* g[BANDS];
@@ -432,6 +446,10 @@ run(LV2_Handle instance, uint32_t n_samples)
                offset += block;
        }
 
+       for (uint32_t j = 0; j < BANDS; j++) {
+               linear_svf_protect(&aeq->v_filter[j]);
+       }
+
 #ifdef LV2_EXTENDED
        if (aeq->need_expose && aeq->queue_draw) {
                aeq->need_expose = false;
index ed4a2474068c32feed71631dd624c6057813d7e4..40811bdf9116537756eda1e73be5a8a0561b2f0b 100644 (file)
 #define RV_NZ 7
 #define DENORMAL_PROTECT (1e-14)
 
+#ifdef COMPILER_MSVC
+#include <float.h>
+#define isfinite_local(val) (bool)_finite((double)val)
+#else
+#define isfinite_local isfinite
+#endif
+
 typedef struct {
        float* delays[2][RV_NZ]; /**< delay line buffer */
 
@@ -164,10 +171,15 @@ reverb (b_reverb* r,
        for (size_t i = 0; i < n_samples; ++i) {
                int j;
                float y;
-               const float xo0 = *xp0++;
-               const float xo1 = *xp1++;
+               float xo0 = *xp0++;
+               float xo1 = *xp1++;
+               if (!isfinite_local(xo0) || fabsf (xo0) > 10.f) { xo0 = 0; }
+               if (!isfinite_local(xo1) || fabsf (xo1) > 10.f) { xo1 = 0; }
+               xo0 += DENORMAL_PROTECT;
+               xo1 += DENORMAL_PROTECT;
                const float x0 = y_1_0 + (inputGain * xo0);
                const float x1 = y_1_1 + (inputGain * xo1);
+
                float xa = 0.0;
                float xb = 0.0;
                /* First we do four feedback comb filters (ie parallel delay lines,
@@ -220,6 +232,11 @@ reverb (b_reverb* r,
                *yp1++ = ((wet * y) + (dry * xo1));
        }
 
+       if (!isfinite_local(y_1_0)) { y_1_0 = 0; }
+       if (!isfinite_local(yy1_1)) { yy1_0 = 0; }
+       if (!isfinite_local(y_1_1)) { y_1_1 = 0; }
+       if (!isfinite_local(yy1_1)) { yy1_1 = 0; }
+
        r->y_1_0 = y_1_0 + DENORMAL_PROTECT;
        r->yy1_0 = yy1_0 + DENORMAL_PROTECT;
        r->y_1_1 = y_1_1 + DENORMAL_PROTECT;