diff options
author | Johannes Mueller <github@johannes-mueller.org> | 2017-08-07 13:23:31 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2018-06-20 21:06:16 +0200 |
commit | 619ba94f51d733c63af60838d7f10056d7482d4c (patch) | |
tree | b05ca4bf7f89b057c330c4e53ad439d63544954f /libs/plugins | |
parent | c9bbb01d981c5c71589023d608ac01ca9789c8dc (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.c | 53 |
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); |