[SCM] calf/master: vumeters and clip for mono and stereo modules cleanup in limiter
js at users.alioth.debian.org
js at users.alioth.debian.org
Tue May 7 15:40:44 UTC 2013
The following commit has been merged in the master branch:
commit b18d718778bb0aebb3202123f17f94cb1023d58a
Author: Markus Schmidt <schmidt at boomshop.net>
Date: Sat Dec 10 05:09:00 2011 +0100
vumeters and clip for mono and stereo modules
cleanup in limiter
diff --git a/src/calf/modules.h b/src/calf/modules.h
index 4e8b1cd..39072ec 100644
--- a/src/calf/modules.h
+++ b/src/calf/modules.h
@@ -244,9 +244,13 @@ private:
class mono_audio_module:
public audio_module<mono_metadata>
{
+ typedef mono_audio_module AM;
uint32_t srate;
bool active;
+ uint32_t clip_in, clip_outL, clip_outR;
+ float meter_in, meter_outL, meter_outR;
+
float * buffer;
unsigned int pos;
unsigned int buffer_size;
@@ -267,10 +271,14 @@ public:
class stereo_audio_module:
public audio_module<stereo_metadata>
{
+ typedef stereo_audio_module AM;
float LL, LR, RL, RR;
uint32_t srate;
bool active;
+ uint32_t clip_inL, clip_inR, clip_outL, clip_outR;
+ float meter_inL, meter_inR, meter_outL, meter_outR;
+
float * buffer;
unsigned int pos;
unsigned int buffer_size;
diff --git a/src/calf/modules_limit.h b/src/calf/modules_limit.h
index 10273dd..927b988 100644
--- a/src/calf/modules_limit.h
+++ b/src/calf/modules_limit.h
@@ -32,7 +32,7 @@
namespace calf_plugins {
-/// Limiter by Markus Schmidt
+/// Limiter by Markus Schmidt and Christian Holschuh
class limiter_audio_module: public audio_module<limiter_metadata>, public line_graph_iface {
private:
typedef limiter_audio_module AM;
@@ -51,7 +51,7 @@ public:
void set_sample_rate(uint32_t sr);
};
-/// Multiband Limiter by Markus Schmidt
+/// Multiband Limiter by Markus Schmidt and Christian Holschuh
class multibandlimiter_audio_module: public audio_module<multibandlimiter_metadata>, public line_graph_iface {
private:
typedef multibandlimiter_audio_module AM;
diff --git a/src/modules.cpp b/src/modules.cpp
index 275744b..f0b955d 100644
--- a/src/modules.cpp
+++ b/src/modules.cpp
@@ -450,6 +450,14 @@ bool filterclavier_audio_module::get_graph(int index, int subindex, float *data,
stereo_audio_module::stereo_audio_module() {
active = false;
+ clip_inL = 0.f;
+ clip_inR = 0.f;
+ clip_outL = 0.f;
+ clip_outR = 0.f;
+ meter_inL = 0.f;
+ meter_inR = 0.f;
+ meter_outL = 0.f;
+ meter_outR = 0.f;
}
void stereo_audio_module::activate() {
@@ -498,25 +506,43 @@ uint32_t stereo_audio_module::process(uint32_t offset, uint32_t numsamples, uint
if(*params[param_bypass] > 0.5) {
outs[0][i] = ins[0][i];
outs[1][i] = ins[1][i];
+ clip_inL = 0.f;
+ clip_inR = 0.f;
+ clip_outL = 0.f;
+ clip_outR = 0.f;
+ meter_inL = 0.f;
+ meter_inR = 0.f;
+ meter_outL = 0.f;
+ meter_outR = 0.f;
} else {
- float L, R;
- if(*params[param_flip] > 0.5) {
- // flip
- L = ins[1][i];
- R = ins[0][i];
- } else {
- // no flip
- L = ins[0][i];
- R = ins[1][i];
- }
- // mute
- L *= (1 - floor(*params[param_mute_l] + 0.5));
- R *= (1 - floor(*params[param_mute_r] + 0.5));
+ // let meters fall a bit
+ clip_inL -= std::min(clip_inL, numsamples);
+ clip_inR -= std::min(clip_inR, numsamples);
+ clip_outL -= std::min(clip_outL, numsamples);
+ clip_outR -= std::min(clip_outR, numsamples);
+ meter_inL = 0.f;
+ meter_inR = 0.f;
+ meter_outL = 0.f;
+ meter_outR = 0.f;
+
+ float L = ins[0][i];
+ float R = ins[1][i];
// levels in
L *= *params[param_level_in];
R *= *params[param_level_in];
+ // balance in
+ L *= (1.f - std::max(0.f, *params[param_balance_in]));
+ R *= (1.f + std::min(0.f, *params[param_balance_in]));
+
+ // flip
+ if(*params[param_flip] > 0.5) {
+ float tmp = L;
+ L = R;
+ R = tmp;
+ }
+
// softclip
if(*params[param_softclip]) {
int ph;
@@ -526,9 +552,15 @@ uint32_t stereo_audio_module::process(uint32_t offset, uint32_t numsamples, uint
R = R > 0.63 ? ph * (0.63 + 0.36 * (1 - pow(MATH_E, (1.f / 3) * (0.63 + R * ph)))) : R;
}
- // balance in
- L *= (1.f - std::max(0.f, *params[param_balance_in]));
- R *= (1.f + std::min(0.f, *params[param_balance_in]));
+ // GUI stuff
+ if(L > meter_inL) meter_inL = L;
+ if(R > meter_inR) meter_inR = R;
+ if(L > 1.f) clip_inL = srate >> 3;
+ if(R > 1.f) clip_inR = srate >> 3;
+
+ // mute
+ L *= (1 - floor(*params[param_mute_l] + 0.5));
+ R *= (1 - floor(*params[param_mute_r] + 0.5));
// phase
L *= (2 * (1 - floor(*params[param_phase_l] + 0.5))) - 1;
@@ -560,11 +592,30 @@ uint32_t stereo_audio_module::process(uint32_t offset, uint32_t numsamples, uint
L *= (1.f - std::max(0.f, *params[param_balance_out]));
R *= (1.f + std::min(0.f, *params[param_balance_out]));
+ // level
+ L *= *params[param_level_out];
+ R *= *params[param_level_out];
+
//output
- outs[0][i] = L * *params[param_level_out];
- outs[1][i] = R * *params[param_level_out];
+ outs[0][i] = L;
+ outs[1][i] = R;
+
+ // clip LED's
+ if(L > 1.f) clip_outL = srate >> 3;
+ if(R > 1.f) clip_outR = srate >> 3;
+ if(L > meter_outL) meter_outL = L;
+ if(R > meter_outR) meter_outR = R;
}
}
+ // draw meters
+ SET_IF_CONNECTED(clip_inL);
+ SET_IF_CONNECTED(clip_inR);
+ SET_IF_CONNECTED(clip_outL);
+ SET_IF_CONNECTED(clip_outR);
+ SET_IF_CONNECTED(meter_inL);
+ SET_IF_CONNECTED(meter_inR);
+ SET_IF_CONNECTED(meter_outL);
+ SET_IF_CONNECTED(meter_outR);
return outputs_mask;
}
@@ -573,7 +624,6 @@ void stereo_audio_module::set_sample_rate(uint32_t sr)
srate = sr;
// rebuild buffer
buffer_size = (int)(srate * 0.05 * 2.f); // buffer size attack rate multiplied by 2 channels
- printf("%4d\n", buffer_size);
buffer = (float*) calloc(buffer_size, sizeof(float));
memset(buffer, 0, buffer_size * sizeof(float)); // reset buffer to zero
pos = 0;
@@ -583,6 +633,12 @@ void stereo_audio_module::set_sample_rate(uint32_t sr)
mono_audio_module::mono_audio_module() {
active = false;
+ clip_in = 0.f;
+ clip_outL = 0.f;
+ clip_outR = 0.f;
+ meter_in = 0.f;
+ meter_outL = 0.f;
+ meter_outR = 0.f;
}
void mono_audio_module::activate() {
@@ -602,27 +658,42 @@ uint32_t mono_audio_module::process(uint32_t offset, uint32_t numsamples, uint32
if(*params[param_bypass] > 0.5) {
outs[0][i] = ins[0][i];
outs[1][i] = ins[0][i];
+ clip_in = 0.f;
+ clip_outL = 0.f;
+ clip_outR = 0.f;
+ meter_in = 0.f;
+ meter_outL = 0.f;
+ meter_outR = 0.f;
} else {
- float L = ins[0][i];
- float R = ins[0][i];
+ // let meters fall a bit
+ clip_in -= std::min(clip_in, numsamples);
+ clip_outL -= std::min(clip_outL, numsamples);
+ clip_outR -= std::min(clip_outR, numsamples);
+ meter_in = 0.f;
+ meter_outL = 0.f;
+ meter_outR = 0.f;
- // mute
- L *= (1 - floor(*params[param_mute_l] + 0.5));
- R *= (1 - floor(*params[param_mute_r] + 0.5));
+ float L = ins[0][i];
// levels in
L *= *params[param_level_in];
- R *= *params[param_level_in];
// softclip
if(*params[param_softclip]) {
- int ph;
- ph = L / fabs(L);
+ int ph = L / fabs(L);
L = L > 0.63 ? ph * (0.63 + 0.36 * (1 - pow(MATH_E, (1.f / 3) * (0.63 + L * ph)))) : L;
- ph = R / fabs(R);
- R = R > 0.63 ? ph * (0.63 + 0.36 * (1 - pow(MATH_E, (1.f / 3) * (0.63 + R * ph)))) : R;
}
+ // GUI stuff
+ if(L > meter_in) meter_in = L;
+ if(L > 1.f) clip_in = srate >> 3;
+
+ float R = L;
+
+ // mute
+ L *= (1 - floor(*params[param_mute_l] + 0.5));
+ R *= (1 - floor(*params[param_mute_r] + 0.5));
+
// phase
L *= (2 * (1 - floor(*params[param_phase_l] + 0.5))) - 1;
R *= (2 * (1 - floor(*params[param_phase_r] + 0.5))) - 1;
@@ -645,11 +716,28 @@ uint32_t mono_audio_module::process(uint32_t offset, uint32_t numsamples, uint32
L *= (1.f - std::max(0.f, *params[param_balance_out]));
R *= (1.f + std::min(0.f, *params[param_balance_out]));
+ // level
+ L *= *params[param_level_out];
+ R *= *params[param_level_out];
+
//output
- outs[0][i] = L * *params[param_level_out];
- outs[1][i] = R * *params[param_level_out];
+ outs[0][i] = L;
+ outs[1][i] = R;
+
+ // clip LED's
+ if(L > 1.f) clip_outL = srate >> 3;
+ if(R > 1.f) clip_outR = srate >> 3;
+ if(L > meter_outL) meter_outL = L;
+ if(R > meter_outR) meter_outR = R;
}
}
+ // draw meters
+ SET_IF_CONNECTED(clip_in);
+ SET_IF_CONNECTED(clip_outL);
+ SET_IF_CONNECTED(clip_outR);
+ SET_IF_CONNECTED(meter_in);
+ SET_IF_CONNECTED(meter_outL);
+ SET_IF_CONNECTED(meter_outR);
return outputs_mask;
}
diff --git a/src/modules_limit.cpp b/src/modules_limit.cpp
index ba5c1e3..dd743ce 100644
--- a/src/modules_limit.cpp
+++ b/src/modules_limit.cpp
@@ -28,13 +28,10 @@ using namespace calf_plugins;
#define SET_IF_CONNECTED(name) if (params[AM::param_##name] != NULL) *params[AM::param_##name] = name;
-/// Limiter by Markus Schmidt
+/// Limiter by Markus Schmidt and Christian Holschuh
///
-/// This module splits the signal in four different bands
-/// and sends them through multiple filters (implemented by
-/// Krzysztof). They are processed by a compressing routine
-/// (implemented by Steve Harris) afterwards and summed up to the
-/// final output again.
+/// This module provides the lookahead limiter as a simple audio module
+/// with choosable lookahead and release time.
///////////////////////////////////////////////////////////////////////////////////////////////
limiter_audio_module::limiter_audio_module()
@@ -187,13 +184,12 @@ uint32_t limiter_audio_module::process(uint32_t offset, uint32_t numsamples, uin
return outputs_mask;
}
-/// Multiband Limiter by Markus Schmidt
+/// Multiband Limiter by Markus Schmidt and Christian Holschuh
///
/// This module splits the signal in four different bands
/// and sends them through multiple filters (implemented by
-/// Krzysztof). They are processed by a compressing routine
-/// (implemented by Steve Harris) afterwards and summed up to the
-/// final output again.
+/// Krzysztof). They are processed by a lookahead limiter module afterwards
+/// and summed up to the final output again.
///////////////////////////////////////////////////////////////////////////////////////////////
multibandlimiter_audio_module::multibandlimiter_audio_module()
@@ -311,11 +307,6 @@ void multibandlimiter_audio_module::params_changed()
// set the params of all strips
float rel;
-// *params[param_weight0] = 0.f;
-// *params[param_weight1] = 0.f;
-// *params[param_weight2] = 0.f;
-// *params[param_weight3] = 0.f;
-
rel = *params[param_release] * pow(0.25, *params[param_release0] * -1);
rel = (*params[param_minrel] > 0.5) ? std::max(2500 * (1.f / 30), rel) : rel;
weight[0] = pow(0.25, *params[param_weight0] * -1);
@@ -371,8 +362,6 @@ uint32_t multibandlimiter_audio_module::process(uint32_t offset, uint32_t numsam
bool bypass = *params[param_bypass] > 0.5f;
numsamples += offset;
float batt = 0.f;
-// for (int i = 0; i < strips; i++)
-// strip[i].update_curve();
if(bypass) {
// everything bypassed
while(offset < numsamples) {
@@ -434,7 +423,6 @@ uint32_t multibandlimiter_audio_module::process(uint32_t offset, uint32_t numsam
left = inL;
right = inR;
// send trough filters
-
switch(mode) {
// how many filter passes? (12/36dB)
case 0:
@@ -466,25 +454,16 @@ uint32_t multibandlimiter_audio_module::process(uint32_t offset, uint32_t numsam
_tmpL[i] = left;
_tmpR[i] = right;
- //if(pos%20 == 0) printf("%+.5f - ", left);
-
// sum up for multiband coefficient
- //sum_left += left * weight[i];
- //sum_right += right * weight[i];
sum_left += ((fabs(left) > *params[param_limit]) ? *params[param_limit] * (fabs(left) / left) : left) * weight[i];
sum_right += ((fabs(right) > *params[param_limit]) ? *params[param_limit] * (fabs(right) / right) : right) * weight[i];
} // process single strip with filter
// write multiband coefficient to buffer
- //buffer[pos] = *params[param_limit] / std::min(fabs(sum_left), fabs(sum_right));
buffer[pos] = std::min(*params[param_limit] / std::max(fabs(sum_left), fabs(sum_right)), 1.0);
- //if(pos%20 == 0) printf("| %+.5f | %+.5f : %3d\n", buffer[pos], std::max(fabs(sum_left), fabs(sum_right)), pos);
- //if(pos%10 == 0) printf("%03d: %.5f\n", pos, buffer[pos]);
- //float bufferSum = 0.f;
for (int i = 0; i < strips; i++) {
// process gain reduction
- //bufferSum += strip[i].buffer[(pos + 2) % buffer_size];
strip[i].process(_tmpL[i], _tmpR[i], buffer);
// sum up output of limiters
if (solo[i] || no_solo) {
@@ -493,16 +472,8 @@ uint32_t multibandlimiter_audio_module::process(uint32_t offset, uint32_t numsam
}
} // process single strip again for limiter
float fickdich[0];
- //if(*params[param_minrel] > 0.5)
broadband.process(outL, outR, fickdich);
batt = broadband.get_attenuation();
- //if(outL > 0.001f) printf("%3d: out: %+.5f - coeffOut: %+.5f - bufferSum: %+.5f\n", pos, outL, buffer[(pos + 2) % buffer_size], bufferSum);
-
-// if(outL > *params[param_limit]) {
-// for(unsigned int i = 0; i < strips; i++) {
-// printf("%+.5f - ", strip[i].
-// }
-// }
// autolevel
outL /= *params[param_limit];
@@ -517,10 +488,10 @@ uint32_t multibandlimiter_audio_module::process(uint32_t offset, uint32_t numsam
outs[1][offset] = outR;
// clip LED's
- if(ins[0][offset] > 1.f) {
+ if(ins[0][offset] * *params[param_level_in] > 1.f) {
clip_inL = srate >> 3;
}
- if(ins[1][offset] > 1.f) {
+ if(ins[1][offset] * *params[param_level_in] > 1.f) {
clip_inR = srate >> 3;
}
if(outL > 1.f) {
@@ -530,11 +501,11 @@ uint32_t multibandlimiter_audio_module::process(uint32_t offset, uint32_t numsam
clip_outR = srate >> 3;
}
// set up in / out meters
- if(inL > meter_inL) {
- meter_inL = ins[0][offset];
+ if(ins[0][offset] * *params[param_level_in] > meter_inL) {
+ meter_inL = ins[0][offset] * *params[param_level_in];
}
- if(inR > meter_inR) {
- meter_inR = ins[1][offset];
+ if(ins[1][offset] * *params[param_level_in] > meter_inR) {
+ meter_inR = ins[1][offset] * *params[param_level_in];
}
if(outL > meter_outL) {
meter_outL = outL;
--
calf audio plugins packaging
More information about the pkg-multimedia-commits
mailing list