Merge branch 'calf-updates'

* calf-updates:
  Make meters in compressor/EQ/distortion modules sample-rate-dependent. (cherry picked from commit 47a87c696223625d31cf106e12ed08cd3293be14)
This commit is contained in:
Tobias Doerffel
2010-10-17 18:16:47 +02:00
5 changed files with 44 additions and 0 deletions

View File

@@ -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;

View File

@@ -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

View File

@@ -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);
}
};
};

View File

@@ -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)

View File

@@ -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)