summaryrefslogtreecommitdiff
path: root/libs/plugins/a-eq.lv2
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2016-08-27 14:10:51 +0200
committerRobin Gareus <robin@gareus.org>2016-08-27 14:10:51 +0200
commit62de4d0c31a7bb2e5f9688a8576dc65039b51e8e (patch)
treebc91ad433b2c03dd487123395a98c5635824ba9e /libs/plugins/a-eq.lv2
parent36776bafcdac6b86fb420785c7936c06c5ad7a29 (diff)
add NaN/Inf protection now that bypass no longer de/activates
Diffstat (limited to 'libs/plugins/a-eq.lv2')
-rw-r--r--libs/plugins/a-eq.lv2/a-eq.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/libs/plugins/a-eq.lv2/a-eq.c b/libs/plugins/a-eq.lv2/a-eq.c
index deac7a641e..d286552e03 100644
--- a/libs/plugins/a-eq.lv2/a-eq.c
+++ b/libs/plugins/a-eq.lv2/a-eq.c
@@ -23,6 +23,13 @@
#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;