diff options
author | Robin Gareus <robin@gareus.org> | 2016-08-27 14:10:51 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2016-08-27 14:10:51 +0200 |
commit | 62de4d0c31a7bb2e5f9688a8576dc65039b51e8e (patch) | |
tree | bc91ad433b2c03dd487123395a98c5635824ba9e /libs/plugins/a-eq.lv2 | |
parent | 36776bafcdac6b86fb420785c7936c06c5ad7a29 (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.c | 18 |
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; |