summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Zammit <damien@zamaudio.com>2014-04-22 02:14:40 +1000
committerDamien Zammit <damien@zamaudio.com>2014-04-22 02:14:40 +1000
commit7d1afff2aed16930c5c669ebc66a13d1d830b7d5 (patch)
treeaf1ec703e54778375743145076de4a00e6167f42
parent6f67ee170f57beeffc6d29ecabd0a91bc58e1b2d (diff)
Fixed denormals and overflow in ZaMultiComp
Signed-off-by: Damien Zammit <damien@zamaudio.com>
-rw-r--r--plugins/ZaMultiComp/ZaMultiCompPlugin.cpp31
-rw-r--r--plugins/ZaMultiComp/ZaMultiCompPlugin.hpp3
2 files changed, 19 insertions, 15 deletions
diff --git a/plugins/ZaMultiComp/ZaMultiCompPlugin.cpp b/plugins/ZaMultiComp/ZaMultiCompPlugin.cpp
index 271e26c..fea6cc5 100644
--- a/plugins/ZaMultiComp/ZaMultiCompPlugin.cpp
+++ b/plugins/ZaMultiComp/ZaMultiCompPlugin.cpp
@@ -458,14 +458,14 @@ void ZaMultiCompPlugin::d_deactivate()
float ZaMultiCompPlugin::run_filter(int i, float in)
{
in = sanitize_denormal(in);
- w1[i] = sanitize_denormal(w1[i]);
- w2[i] = sanitize_denormal(w2[i]);
+ w1[i] = sanitize_denormal(w1[i]);
+ w2[i] = sanitize_denormal(w2[i]);
float tmp = in - w1[i] * b1[i] - w2[i] * b2[i];
- float out = tmp * a0[i] + w1[i] * a1[i] + w2[i] * a2[i];
+ float out = tmp * a0[i] + w1[i] * a1[i] + w2[i] * a2[i] + 1e-20f;
w2[i] = w1[i];
- w1[i] = tmp;
- return out;
+ w1[i] = sanitize_denormal(tmp);
+ return sanitize_denormal(out - 1e-20f);
}
void ZaMultiCompPlugin::set_lp_coeffs(float fc, float q, float sr, int i, float gain=1.0)
@@ -510,9 +510,9 @@ float ZaMultiCompPlugin::run_comp(int k, float in)
float out;
yg=0.f;
+ in = sanitize_denormal(in);
xg = (in==0.f) ? -160.f : to_dB(fabs(in));
- xg = sanitize_denormal(xg);
-
+ xg = sanitize_denormal(xg);
if (2.f*(xg-thresdb)<-width) {
yg = xg;
@@ -542,7 +542,7 @@ float ZaMultiCompPlugin::run_comp(int k, float in)
old_yl[k] = yl;
old_y1[k] = y1;
- return out;
+ return sanitize_denormal(out);
}
void ZaMultiCompPlugin::d_run(float** inputs, float** outputs, uint32_t frames)
@@ -569,19 +569,21 @@ void ZaMultiCompPlugin::d_run(float** inputs, float** outputs, uint32_t frames)
for (uint32_t i = 0; i < frames; ++i) {
float tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, fil1, fil2, fil3, fil4;
- float cmp1, cmp2, cmp3;
+ float cmp1, cmp2, cmp3, in;
int listenmode = 0;
- fil1 = run_filter(0, inputs[0][i]);
+ in = sanitize_denormal(inputs[0][i]);
+ in = (fabs(in) < DANGER) ? in : 0.f;
+ fil1 = run_filter(0, in);
tmp1 = run_filter(1, fil1);
cmp1 = (!tog1 && !listen1) ? 0.f : run_comp(0, tmp1);
tmp2 = tog1 ? cmp1 * from_dB(makeup[0]) : tmp1;
- fil2 = run_filter(2, inputs[0][i]);
+ fil2 = run_filter(2, in);
tmp3 = run_filter(3, fil2);
fil3 = run_filter(4, tmp3);
tmp4 = run_filter(5, fil3);
cmp2 = (!tog2 && !listen2) ? 0.f : run_comp(1, tmp4);
tmp3 = (tog2) ? cmp2 * from_dB(makeup[1]) : tmp4;
- fil4 = run_filter(6, inputs[0][i]);
+ fil4 = run_filter(6, in);
tmp5 = run_filter(7, fil4);
cmp3 = (!tog3 && !listen3) ? 0.f : run_comp(2, tmp5);
tmp6 = (tog3) ? cmp3 * from_dB(makeup[2]) : tmp5;
@@ -607,11 +609,12 @@ void ZaMultiCompPlugin::d_run(float** inputs, float** outputs, uint32_t frames)
outputs[0][i] += tmp3;
outputs[0][i] += tmp6;
}
+ outputs[0][i] = sanitize_denormal(outputs[0][i]);
outputs[0][i] *= from_dB(globalgain);
- max = (fabsf(outputs[0][i]) > max) ? fabsf(outputs[0][i]) : max;
+ max = (fabsf(outputs[0][i]) > max) ? fabsf(outputs[0][i]) : sanitize_denormal(max);
}
- outlevel = sanitize_denormal((max == 0.f) ? -45.f : to_dB(max));
+ outlevel = (max == 0.f) ? -45.f : to_dB(max);
}
// -----------------------------------------------------------------------
diff --git a/plugins/ZaMultiComp/ZaMultiCompPlugin.hpp b/plugins/ZaMultiComp/ZaMultiCompPlugin.hpp
index f7eadf0..47f419d 100644
--- a/plugins/ZaMultiComp/ZaMultiCompPlugin.hpp
+++ b/plugins/ZaMultiComp/ZaMultiCompPlugin.hpp
@@ -22,6 +22,7 @@
#define MAX_COMP 3
#define ONEOVERROOT2 0.7071068f
#define ROOT2 1.4142135f
+#define DANGER 100000.f
#include "DistrhoPlugin.hpp"
@@ -114,7 +115,7 @@ protected:
static inline float
sanitize_denormal(float v) {
- if(!std::isnormal(v))
+ if(!std::isnormal(v) || !std::isfinite(v))
return 0.f;
return v;
}