[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