[SCM] calf/master: Make meters in compressor/EQ/distortion modules sample-rate-dependent.

js at users.alioth.debian.org js at users.alioth.debian.org
Tue May 7 15:40:26 UTC 2013


The following commit has been merged in the master branch:
commit 47a87c696223625d31cf106e12ed08cd3293be14
Author: Krzysztof Foltman <wdev at foltman.com>
Date:   Sat Oct 16 01:13:43 2010 +0100

    Make meters in compressor/EQ/distortion modules sample-rate-dependent.

diff --git a/src/calf/modules_eq.h b/src/calf/modules_eq.h
index e378169..61c6c28 100644
--- a/src/calf/modules_eq.h
+++ b/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/src/calf/plugin_tools.h b/src/calf/plugin_tools.h
index a9e2094..9fff2a5 100644
--- a/src/calf/plugin_tools.h
+++ b/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/src/calf/vumeter.h b/src/calf/vumeter.h
index cd11252..6453659 100644
--- a/src/calf/vumeter.h
+++ b/src/calf/vumeter.h
@@ -21,6 +21,8 @@
 #ifndef __CALF_VUMETER_H
 #define __CALF_VUMETER_H
 
+#include <math.h>
+
 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/src/jackhost.cpp b/src/jackhost.cpp
index 77f21d8..04368bb 100644
--- a/src/jackhost.cpp
+++ b/src/jackhost.cpp
@@ -99,6 +99,7 @@ void jack_host::create_ports() {
         inputs[i].name = buf2;
         inputs[i].handle = jack_port_register(client->client, buf, JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput , 0);
         inputs[i].data = NULL;
+        inputs[i].meter.set_falloff(0.f, client->sample_rate);
         if (!inputs[i].handle)
             throw text_exception("Could not create JACK input port");
         jack_port_set_alias(inputs[i].handle, (prefix + buf2).c_str());
diff --git a/src/modules_comp.cpp b/src/modules_comp.cpp
index 35fad9c..4c683b2 100644
--- a/src/modules_comp.cpp
+++ b/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/src/modules_dist.cpp b/src/modules_dist.cpp
index 725e05b..95c145a 100644
--- a/src/modules_dist.cpp
+++ b/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)

-- 
calf audio plugins packaging



More information about the pkg-multimedia-commits mailing list