diff --git a/plugins/ladspa_effect/calf/src/calf/modules_eq.h b/plugins/ladspa_effect/calf/src/calf/modules_eq.h index e37816999..61c6c2856 100644 --- a/plugins/ladspa_effect/calf/src/calf/modules_eq.h +++ b/plugins/ladspa_effect/calf/src/calf/modules_eq.h @@ -73,6 +73,7 @@ public: void set_sample_rate(uint32_t sr) { srate = sr; + meters.set_sample_rate(sr); } uint32_t process(uint32_t offset, uint32_t numsamples, uint32_t inputs_mask, uint32_t outputs_mask); bool get_graph(int index, int subindex, float *data, int points, cairo_iface *context) const; diff --git a/plugins/ladspa_effect/calf/src/calf/plugin_tools.h b/plugins/ladspa_effect/calf/src/calf/plugin_tools.h index a9e20946e..9fff2a5b8 100644 --- a/plugins/ladspa_effect/calf/src/calf/plugin_tools.h +++ b/plugins/ladspa_effect/calf/src/calf/plugin_tools.h @@ -42,6 +42,11 @@ struct in_out_metering_base vumeter_in.reset(); vumeter_out.reset(); } + void set_sample_rate(double sample_rate) + { + vumeter_in.set_falloff(0.f, sample_rate); + vumeter_out.copy_falloff(vumeter_in); + } }; /// Universal single stereo level metering for a specific plugin diff --git a/plugins/ladspa_effect/calf/src/calf/vumeter.h b/plugins/ladspa_effect/calf/src/calf/vumeter.h index cd1125271..64536598e 100644 --- a/plugins/ladspa_effect/calf/src/calf/vumeter.h +++ b/plugins/ladspa_effect/calf/src/calf/vumeter.h @@ -21,6 +21,8 @@ #ifndef __CALF_VUMETER_H #define __CALF_VUMETER_H +#include + namespace dsp { /// Peak meter class @@ -48,6 +50,24 @@ struct vumeter clip = 0; } + /// Set falloff so that the meter falls 20dB in time_20dB seconds, assuming sample rate of sample_rate + /// @arg time_20dB time for the meter to move by 20dB (default 300ms if <= 0) + void set_falloff(double time_20dB, double sample_rate) + { + if (time_20dB <= 0) + time_20dB = 0.3; + // 20dB = 10x +/- --> 0.1 = pow(falloff, sample_rate * time_20dB) = exp(sample_rate * ln(falloff)) + // ln(0.1) = sample_rate * ln(falloff) + falloff = pow(0.1, 1 / (sample_rate * time_20dB)); + clip_falloff = falloff; + } + /// Copy falloff from another object + void copy_falloff(const vumeter &src) + { + falloff = src.falloff; + clip_falloff = src.clip_falloff; + } + /// Update peak meter based on input signal inline void update(const float *src, unsigned int len) { @@ -109,6 +129,17 @@ struct dual_vumeter left.reset(); right.reset(); } + inline void set_falloff(double time_20dB, double sample_rate) + { + left.set_falloff(time_20dB, sample_rate); + right.copy_falloff(left); + } + inline void copy_falloff(const dual_vumeter &src) + { + left.copy_falloff(src.left); + right.copy_falloff(src.right); + } + }; }; diff --git a/plugins/ladspa_effect/calf/src/modules_comp.cpp b/plugins/ladspa_effect/calf/src/modules_comp.cpp index 35fad9c42..4c683b2f7 100644 --- a/plugins/ladspa_effect/calf/src/modules_comp.cpp +++ b/plugins/ladspa_effect/calf/src/modules_comp.cpp @@ -389,6 +389,7 @@ void compressor_audio_module::set_sample_rate(uint32_t sr) { srate = sr; compressor.set_sample_rate(srate); + meters.set_sample_rate(srate); } uint32_t compressor_audio_module::process(uint32_t offset, uint32_t numsamples, uint32_t inputs_mask, uint32_t outputs_mask) @@ -658,6 +659,7 @@ void sidechaincompressor_audio_module::set_sample_rate(uint32_t sr) { srate = sr; compressor.set_sample_rate(srate); + meters.set_sample_rate(srate); } uint32_t sidechaincompressor_audio_module::process(uint32_t offset, uint32_t numsamples, uint32_t inputs_mask, uint32_t outputs_mask) @@ -1123,6 +1125,7 @@ void gate_audio_module::set_sample_rate(uint32_t sr) { srate = sr; gate.set_sample_rate(srate); + meters.set_sample_rate(srate); } uint32_t gate_audio_module::process(uint32_t offset, uint32_t numsamples, uint32_t inputs_mask, uint32_t outputs_mask) @@ -1390,6 +1393,7 @@ void sidechaingate_audio_module::set_sample_rate(uint32_t sr) { srate = sr; gate.set_sample_rate(srate); + meters.set_sample_rate(srate); } uint32_t sidechaingate_audio_module::process(uint32_t offset, uint32_t numsamples, uint32_t inputs_mask, uint32_t outputs_mask) diff --git a/plugins/ladspa_effect/calf/src/modules_dist.cpp b/plugins/ladspa_effect/calf/src/modules_dist.cpp index 725e05bc9..95c145a19 100644 --- a/plugins/ladspa_effect/calf/src/modules_dist.cpp +++ b/plugins/ladspa_effect/calf/src/modules_dist.cpp @@ -111,6 +111,7 @@ void saturator_audio_module::set_sample_rate(uint32_t sr) dist[0].set_sample_rate(sr); if(in_count > 1 && out_count > 1) dist[1].set_sample_rate(sr); + meters.set_sample_rate(srate); } uint32_t saturator_audio_module::process(uint32_t offset, uint32_t numsamples, uint32_t inputs_mask, uint32_t outputs_mask) @@ -300,6 +301,7 @@ void exciter_audio_module::set_sample_rate(uint32_t sr) dist[0].set_sample_rate(sr); if(in_count > 1 && out_count > 1) dist[1].set_sample_rate(sr); + meters.set_sample_rate(srate); } uint32_t exciter_audio_module::process(uint32_t offset, uint32_t numsamples, uint32_t inputs_mask, uint32_t outputs_mask) @@ -486,6 +488,7 @@ void bassenhancer_audio_module::set_sample_rate(uint32_t sr) dist[0].set_sample_rate(sr); if(in_count > 1 && out_count > 1) dist[1].set_sample_rate(sr); + meters.set_sample_rate(srate); } uint32_t bassenhancer_audio_module::process(uint32_t offset, uint32_t numsamples, uint32_t inputs_mask, uint32_t outputs_mask)