[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