mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-06 14:54:56 +01:00
add NaN/Inf protection now that bypass no longer de/activates
This commit is contained in:
parent
36776bafcd
commit
62de4d0c31
2 changed files with 37 additions and 2 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -32,6 +32,13 @@
|
|||
#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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue