summaryrefslogtreecommitdiff
path: root/libs/plugins
diff options
context:
space:
mode:
authorJohannes Mueller <github@johannes-mueller.org>2017-08-07 13:23:31 +0200
committerRobin Gareus <robin@gareus.org>2018-06-20 21:06:16 +0200
commit619ba94f51d733c63af60838d7f10056d7482d4c (patch)
treeb05ca4bf7f89b057c330c4e53ad439d63544954f /libs/plugins
parentc9bbb01d981c5c71589023d608ac01ca9789c8dc (diff)
Drop LPF of input level visualization in a-comp
Diffstat (limited to 'libs/plugins')
-rw-r--r--libs/plugins/a-comp.lv2/a-comp.c53
1 files changed, 47 insertions, 6 deletions
diff --git a/libs/plugins/a-comp.lv2/a-comp.c b/libs/plugins/a-comp.lv2/a-comp.c
index 76618605d6..5caec6d659 100644
--- a/libs/plugins/a-comp.lv2/a-comp.c
+++ b/libs/plugins/a-comp.lv2/a-comp.c
@@ -27,6 +27,8 @@
#define ACOMP_URI "urn:ardour:a-comp"
#define ACOMP_STEREO_URI "urn:ardour:a-comp#stereo"
+#define RESET_PEAK_AFTER_SECONDS 3
+
#ifndef M_PI
# define M_PI 3.14159265358979323846
#endif
@@ -102,6 +104,9 @@ typedef struct {
float v_lvl_in;
float v_lvl_out;
float v_state_x;
+
+ float v_peakdb;
+ uint32_t peakdb_samples;
#endif
} AComp;
@@ -256,6 +261,11 @@ activate(LV2_Handle instance)
*(acomp->gainr) = 0.0f;
*(acomp->outlevel) = -70.0f;
*(acomp->inlevel) = -160.f;
+
+#ifdef LV2_EXTENDED
+ acomp->v_peakdb = -160.f;
+ acomp->peakdb_samples = 0;
+#endif
}
static void
@@ -385,6 +395,18 @@ run_mono(LV2_Handle instance, uint32_t n_samples)
#ifdef LV2_EXTENDED
acomp->v_gainr = max_gainr;
+ if (in_peak_db > acomp->v_peakdb) {
+ acomp->v_peakdb = in_peak_db;
+ acomp->peakdb_samples = 0;
+ } else {
+ acomp->peakdb_samples += n_samples;
+ if ((float)acomp->peakdb_samples/acomp->srate > RESET_PEAK_AFTER_SECONDS) {
+ acomp->v_peakdb = in_peak_db;
+ acomp->peakdb_samples = 0;
+ acomp->need_expose = true;
+ }
+ }
+
const float v_lvl_in = in_peak_db;
const float v_lvl_out = *acomp->outlevel;
@@ -403,9 +425,8 @@ run_mono(LV2_Handle instance, uint32_t n_samples)
fabsf (acomp->v_state_x - state_x) >= .1f ) {
// >= 0.1dB difference
acomp->need_expose = true;
- const float relax_coef = exp(-5.f*n_samples/srate);
- acomp->v_lvl_in = fmaxf (v_lvl_in, relax_coef*acomp->v_lvl_in + (1.f-relax_coef)*v_lvl_in);
- acomp->v_lvl_out = fmaxf (v_lvl_out, relax_coef*acomp->v_lvl_out + (1.f-relax_coef)*v_lvl_out);
+ acomp->v_lvl_in = v_lvl_in;
+ acomp->v_lvl_out = v_lvl_out;
acomp->v_state_x = state_x;
}
if (acomp->need_expose && acomp->queue_draw) {
@@ -550,6 +571,18 @@ run_stereo(LV2_Handle instance, uint32_t n_samples)
#ifdef LV2_EXTENDED
acomp->v_gainr = max_gainr;
+ if (in_peak_db > acomp->v_peakdb) {
+ acomp->v_peakdb = in_peak_db;
+ acomp->peakdb_samples = 0;
+ } else {
+ acomp->peakdb_samples += n_samples;
+ if ((float)acomp->peakdb_samples/acomp->srate > RESET_PEAK_AFTER_SECONDS) {
+ acomp->v_peakdb = in_peak_db;
+ acomp->peakdb_samples = 0;
+ acomp->need_expose = true;
+ }
+ }
+
const float v_lvl_in = in_peak_db;
const float v_lvl_out = *acomp->outlevel;
@@ -568,9 +601,8 @@ run_stereo(LV2_Handle instance, uint32_t n_samples)
fabsf (acomp->v_state_x - state_x) >= .1f ) {
// >= 0.1dB difference
acomp->need_expose = true;
- const float relax_coef = exp(-5.f*n_samples/srate);
- acomp->v_lvl_in = fmaxf (v_lvl_in, relax_coef*acomp->v_lvl_in + (1.f-relax_coef)*v_lvl_in);
- acomp->v_lvl_out = fmaxf (v_lvl_out, relax_coef*acomp->v_lvl_out + (1.f-relax_coef)*v_lvl_out);
+ acomp->v_lvl_in = v_lvl_in;
+ acomp->v_lvl_out = v_lvl_out;
acomp->v_state_x = state_x;
}
if (acomp->need_expose && acomp->queue_draw) {
@@ -845,6 +877,15 @@ render_inline_only_bars (cairo_t* cr, const AComp* self)
cairo_set_line_width (cr, 2.0);
+ // visualize in peak
+ if (self->v_peakdb > -60.f) {
+ cairo_set_source_rgba (cr, 0.0, 1.0, 0.0, 1.0);
+ const float pk = (self->v_peakdb > 10.f) ? x1+wd : wd * (60.f+self->v_peakdb) / 70.f;
+ cairo_move_to (cr, pk, y1);
+ cairo_line_to (cr, pk, y1+ht);
+ cairo_stroke (cr);
+ }
+
// visualize threshold
const float tr = x1 + wd * (60.f+self->v_thresdb) / 70.f;
cairo_set_source_rgba (cr, 0.95, 0.95, 0.0, 1.0);