[SCM] calf/master: + Compressor simplification, added optional audio ports

js at users.alioth.debian.org js at users.alioth.debian.org
Tue May 7 15:39:47 UTC 2013


The following commit has been merged in the master branch:
commit 653033d711b1d497d7d465f5ab9a61133c8653f6
Author: Markus Schmidt <schmidt at boomshop.net>
Date:   Wed Nov 11 21:27:39 2009 +0000

    + Compressor simplification, added optional audio ports

diff --git a/gui/gui-compressor.xml b/gui/gui-compressor.xml
index 30bef42..0f9cdcc 100644
--- a/gui/gui-compressor.xml
+++ b/gui/gui-compressor.xml
@@ -1,97 +1,97 @@
-<table rows="2" cols="4" spacing="10">
-    <vbox attach-x="0" attach-y="0" expand="0" fill="0" pad-x="7" pad-y="7" spacing="3" >
-        <label param="bypass" expand="0" fill="0" />
-        <align><toggle param="bypass" shrink="1" size="2"/></align>
+<hbox spacing="10">
+
+    <vbox spacing="20" expand="0" fill="0">
+        <vbox attach-x="0" attach-y="0" expand="0" fill="0" pad-x="7" pad-y="7" spacing="7" >
+            <label param="bypass" expand="0" fill="0" />
+            <align><toggle param="bypass" shrink="1" size="2"/></align>
+        </vbox>
+        <vbox attach-x="0" attach-y="1" expand="0" fill="0" pad-y="20" pad-x="7">
+            <label param="level_in" expand="0" fill="0" expand-y="0" fill-y="0" />
+            <knob param="level_in" size="5" expand="1" fill="1" />
+            <value param="level_in" />
+        </vbox>
     </vbox>
-    <vbox attach-x="0" attach-y="1" expand="0" fill="0" pad-y="20" pad-x="7">
-        <label param="input" expand="0" fill="0" expand-y="0" fill-y="0" />
-        <knob param="input" size="4" expand="1" fill="1" />
-        <value param="input" />
+
+    <vbox spacing="5">
+        <frame label="Compressor">
+            <vbox spacing="5">
+                <table expand="0" fill="0" rows="3" cols="3">
+                    <label param="meter_in" expand-x="0" fill-x="0" attach-x="0" attach-y="0" />
+                    <vumeter param="meter_in" mode="0" hold="1.5" falloff="2.5" attach-x="1" attach-y="0" expand-x="1" fill-x="1" />
+                    <led param="clip_in" mode="0" expand-x="0" fill-x="0" attach-x="2" attach-y="0" />
+                    
+                    <label param="meter_out" expand-x="0" fill-x="0" attach-x="0" attach-y="1" />
+                    <vumeter param="meter_out" mode="0" hold="1.5" falloff="2.5" attach-x="1" attach-y="1" expand-x="1" fill-x="1" />
+                    <led param="clip_out" mode="1" expand-x="0" fill-x="0" attach-x="2" attach-y="1" />
+                    
+                    <label param="compression" expand-x="0" fill-x="0" attach-x="0" attach-y="2" />
+                    <vumeter param="compression" mode="2" hold="1.5" expand-x="1" fill-x="1" attach-x="1" attach-y="2" attach-w="2" />
+                </table>
+                
+                <table expand="1" rows="2" cols="3" homogeneous="1">
+                    <vbox expand="0" attach-x="0" attach-y="0">
+                        <label param="attack" />
+                        <knob param="attack" />
+                        <value param="attack" />
+                    </vbox>
+                    <vbox expand="0" attach-x="1" attach-y="0">
+                        <label param="release" />
+                        <knob param="release" />
+                        <value param="release" />
+                    </vbox>
+                    <vbox expand="0" attach-x="2" attach-y="0">
+                        <label param="knee" />
+                        <knob param="knee" />
+                        <value param="knee" />
+                    </vbox>
+                    <vbox expand="0" attach-x="0" attach-y="1">
+                        <label param="ratio" />
+                        <knob param="ratio" />
+                        <value param="ratio" />
+                    </vbox>
+                    <vbox expand="0" attach-x="1" attach-y="1">
+                        <label param="threshold" />
+                        <knob param="threshold"/>
+                        <value param="threshold" />
+                    </vbox>
+                    <vbox expand="0" attach-x="2" attach-y="1">
+                        <label param="makeup" />
+                        <knob param="makeup" />
+                        <value param="makeup" />
+                    </vbox>
+                </table>
+            </vbox>
+        </frame>
+        <frame label="Options">
+            <vbox spacing="10" pad-x="5" fill-y="0" expand-y="0">
+                <vbox expand="1" expand-y="0" expand-x="1" fill-x="1">
+                    <label param="stereo_link" expand-y="0" fill-y="0"/>
+                    <align>
+                        <hbox expand="0" fill-y="0" expand-x="1" fill-x="1">
+                            <radio param="stereo_link" value="Average" expand-x="1" fill-x="1"/>
+                            <radio param="stereo_link" value="Maximum" expand-x="1" fill-x="1"/>
+                        </hbox>
+                    </align>
+                </vbox>
+                <vbox expand="1" expand-y="0">
+                    <label param="detection" expand-y="0" fill-y="0" expand-x="1" fill-x="1"/>
+                    <align>
+                        <hbox expand="0" fill-y="0" expand-x="1" fill-x="1" >
+                            <radio param="detection" value="RMS" expand-x="1" fill-x="1"/>
+                            <radio param="detection" value="Peak" expand-x="1" fill-x="1"/>
+                        </hbox>
+                    </align>
+                </vbox>
+            </vbox>
+        </frame>
     </vbox>
     
-    <table attach-x="1" attach-y="0" expand-y="0" fill-y="0" expand-x="1" spacing="1" rows="3" cols="2">
-        <vbox expand-x="1" fill-x="1"  expand="0" fill="0" attach-x="0" attach-y="0">
-            <label param="peak" />
-            <vumeter param="peak" mode="0" hold="1.5" falloff="2.5" shrink-y="0" />
-        </vbox>
-        <vbox shrink-x="1" expand-x="0" fill-x="0" expand-y="0" fill-y="0" expand="0" fill="0" attach-x="1" attach-y="0">
-            <label param="clip" expand="0" fill="0" />
-            <led param="clip" mode="1" expand="0" fill="0" />
-        </vbox>
-        <vumeter param="compression" mode="2" hold="1.5" attach-x="0" attach-y="1" attach-w="2" expand="0" fill="0" expand-x="1" fill-x="1"/>
-        <label param="compression" attach-y="2" attach-x="0" expand-x="1" fill-x="1" expand="0" fill="0" />
-    </table>
     
-    <table attach-x="1" attach-y="1" expand="1" rows="2" cols="3" homogeneous="1" pad-x="0" pad-y="6">
-        <vbox expand="0" attach-x="0" attach-y="0">
-            <label param="attack" />
-            <knob param="attack" />
-            <value param="attack" />
-        </vbox>
-        <vbox expand="0" attach-x="1" attach-y="0">
-            <label param="release" />
-            <knob param="release" />
-            <value param="release" />
-        </vbox>
-        <vbox expand="0" attach-x="2" attach-y="0">
-            <label param="knee" />
-            <knob param="knee" />
-            <value param="knee" />
-        </vbox>
-        <vbox expand="0" attach-x="0" attach-y="1">
-            <label param="ratio" />
-            <knob param="ratio" />
-            <value param="ratio" />
+      <frame label="Compression">
+        <vbox >
+            <if cond="directlink">
+                <line-graph refresh="1" width="340" height="340" param="compression" square="1" expand="1" fill="1"/>
+            </if>
         </vbox>
-        <vbox expand="0" attach-x="1" attach-y="1">
-            <label param="threshold" />
-            <knob param="threshold"/>
-            <value param="threshold" />
-        </vbox>
-        <vbox expand="0" attach-x="2" attach-y="1">
-            <label param="makeup" />
-            <knob param="makeup" />
-            <value param="makeup" />
-        </vbox>
-    </table>
-    
-    <if cond="directlink">
-      <frame attach-x="2" attach-y="0" attach-h="2" label="Compression" pad-x="10">
-        <line-graph refresh="1" width="220" height="220" param="compression" square="1" expand-y="1" fill-y="1"/>
       </frame>
-    </if>
-    
-    <frame attach-x="3" attach-y="0" attach-h="2" label="Options">
-      <vbox>
-      <vbox expand="1" pad-x="5">
-          <vbox expand="0">
-              <label param="aweighting"/>
-              <align>
-                  <combo param="aweighting"/>
-              </align>
-          </vbox>
-      </vbox>
-      <vbox spacing="10" pad-x="5" fill-y="0" expand-y="0">
-    	  <vbox expand="1" expand-y="0" expand-x="1" fill-x="1">
-            <label param="stereo_link" expand-y="0" fill-y="0"/>
-            <align>
-                <hbox expand="0" fill-y="0" expand-x="1" fill-x="1">
-                    <radio param="stereo_link" value="Average" expand-x="1" fill-x="1"/>
-                    <radio param="stereo_link" value="Maximum" expand-x="1" fill-x="1"/>
-                </hbox>
-            </align>
-        </vbox>
-        <vbox expand="1" expand-y="0">
-        	<label param="detection" expand-y="0" fill-y="0" expand-x="1" fill-x="1"/>
-            <align>
-                <hbox expand="0" fill-y="0" expand-x="1" fill-x="1" >
-                    <radio param="detection" value="RMS" expand-x="1" fill-x="1"/>
-                    <radio param="detection" value="Peak" expand-x="1" fill-x="1"/>
-                </hbox>
-            </align>
-        </vbox>
-      </vbox>
-      </vbox>
-    </frame>
-    
-</table>
+</hbox>
diff --git a/src/benchmark.cpp b/src/benchmark.cpp
index ffaa1ad..64c0ff1 100644
--- a/src/benchmark.cpp
+++ b/src/benchmark.cpp
@@ -297,7 +297,6 @@ void get_default_effect_params<calf_plugins::compressor_audio_module>(float para
     params[mod::param_detection] = 0;
     params[mod::param_knee] = 40000;
     params[mod::param_bypass] = 0;
-    params[mod::param_aweighting] = 1;
     sr = 44100;
 }
 
diff --git a/src/calf/giface.h b/src/calf/giface.h
index 56305bc..92cb1f9 100644
--- a/src/calf/giface.h
+++ b/src/calf/giface.h
@@ -306,6 +306,10 @@ struct plugin_metadata_iface
     virtual int get_input_count()=0;
     /// @return number of audio outputs
     virtual int get_output_count()=0;
+    /// @return number of optional inputs
+    virtual int get_inputs_optional()=0;
+    /// @return number of optional outputs
+    virtual int get_outputs_optional()=0;
     /// @return true if plugin can work in hard-realtime conditions
     virtual bool is_rt_capable()=0;
     /// @return true if plugin has MIDI input
@@ -489,6 +493,8 @@ public:
     const char *get_label() { return Metadata::impl_get_label(); } 
     int get_input_count() { return Metadata::in_count; }
     int get_output_count() { return Metadata::out_count; }
+    int get_inputs_optional() { return Metadata::ins_optional; }
+    int get_outputs_optional() { return Metadata::outs_optional; }
     int get_param_count() { return Metadata::param_count; }
     bool get_midi() { return Metadata::support_midi; }
     bool requires_midi() { return Metadata::require_midi; }
@@ -528,6 +534,8 @@ public:
     const char *get_label() { return impl->get_label(); } 
     int get_input_count() { return impl->get_input_count(); }
     int get_output_count() { return impl->get_output_count(); }
+    int get_inputs_optional() { return impl->get_inputs_optional(); }
+    int get_outputs_optional() { return impl->get_outputs_optional(); }
     int get_param_count() { return impl->get_param_count(); }
     bool get_midi() { return impl->get_midi(); }
     bool requires_midi() { return impl->requires_midi(); }
diff --git a/src/calf/metadata.h b/src/calf/metadata.h
index c959e19..2ba9e02 100644
--- a/src/calf/metadata.h
+++ b/src/calf/metadata.h
@@ -31,21 +31,21 @@ struct flanger_metadata: public plugin_metadata<flanger_metadata>
 {
 public:
     enum { par_delay, par_depth, par_rate, par_fb, par_stereo, par_reset, par_amount, par_dryamount, param_count };
-    enum { in_count = 2, out_count = 2, support_midi = false, require_midi = false, rt_capable = true };
+    enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = false, require_midi = false, rt_capable = true };
     PLUGIN_NAME_ID_LABEL("flanger", "flanger", "Flanger")
 };
 
 struct phaser_metadata: public plugin_metadata<phaser_metadata>
 {
     enum { par_freq, par_depth, par_rate, par_fb, par_stages, par_stereo, par_reset, par_amount, par_dryamount, param_count };
-    enum { in_count = 2, out_count = 2, support_midi = false, require_midi = false, rt_capable = true };
+    enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = false, require_midi = false, rt_capable = true };
     PLUGIN_NAME_ID_LABEL("phaser", "phaser", "Phaser")
 };
 
 struct filter_metadata: public plugin_metadata<filter_metadata>
 {
     enum { par_cutoff, par_resonance, par_mode, par_inertia, param_count };
-    enum { in_count = 2, out_count = 2, rt_capable = true, require_midi = false, support_midi = false };
+    enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, rt_capable = true, require_midi = false, support_midi = false };
     PLUGIN_NAME_ID_LABEL("filter", "filter", "Filter")
     /// do not export mode and inertia as CVs, as those are settings and not parameters
     bool is_cv(int param_no) { return param_no != par_mode && param_no != par_inertia; }
@@ -55,7 +55,7 @@ struct filter_metadata: public plugin_metadata<filter_metadata>
 struct filterclavier_metadata: public plugin_metadata<filterclavier_metadata>
 {
     enum { par_transpose, par_detune, par_max_resonance, par_mode, par_inertia,  param_count };
-    enum { in_count = 2, out_count = 2, rt_capable = true, require_midi = true, support_midi = true };
+    enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, rt_capable = true, require_midi = true, support_midi = true };
     PLUGIN_NAME_ID_LABEL("filterclavier", "filterclavier", "Filterclavier")
     /// do not export mode and inertia as CVs, as those are settings and not parameters
     bool is_cv(int param_no) { return param_no != par_mode && param_no != par_inertia; }
@@ -64,14 +64,14 @@ struct filterclavier_metadata: public plugin_metadata<filterclavier_metadata>
 struct reverb_metadata: public plugin_metadata<reverb_metadata>
 {
     enum { par_clip, par_meter_wet, par_meter_out, par_decay, par_hfdamp, par_roomsize, par_diffusion, par_amount, par_dry, par_predelay, par_basscut, par_treblecut, param_count };
-    enum { in_count = 2, out_count = 2, support_midi = false, require_midi = false, rt_capable = true };
+    enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = false, require_midi = false, rt_capable = true };
     PLUGIN_NAME_ID_LABEL("reverb", "reverb", "Reverb")
 };
 
 struct vintage_delay_metadata: public plugin_metadata<vintage_delay_metadata>
 {
     enum { par_bpm, par_divide, par_time_l, par_time_r, par_feedback, par_amount, par_mixmode, par_medium, par_dryamount, param_count };
-    enum { in_count = 2, out_count = 2, rt_capable = true, support_midi = false, require_midi = false };
+    enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, rt_capable = true, support_midi = false, require_midi = false };
     PLUGIN_NAME_ID_LABEL("vintage_delay", "vintagedelay", "Vintage Delay")
 };
 
@@ -79,7 +79,7 @@ struct rotary_speaker_metadata: public plugin_metadata<rotary_speaker_metadata>
 {
 public:
     enum { par_speed, par_spacing, par_shift, par_moddepth, par_treblespeed, par_bassspeed, par_micdistance, par_reflection, par_meter_l, par_meter_h, param_count };
-    enum { in_count = 2, out_count = 2, support_midi = true, require_midi = false, rt_capable = true };
+    enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = true, require_midi = false, rt_capable = true };
     PLUGIN_NAME_ID_LABEL("rotary_speaker", "rotaryspeaker", "Rotary Speaker")
 };
 
@@ -88,7 +88,7 @@ struct multichorus_metadata: public plugin_metadata<multichorus_metadata>
 {
 public:    
     enum { par_delay, par_depth, par_rate, par_stereo, par_voices, par_vphase, par_amount, par_dryamount, par_freq, par_freq2, par_q, par_overlap, param_count };
-    enum { in_count = 2, out_count = 2, rt_capable = true, support_midi = false, require_midi = false };
+    enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, rt_capable = true, support_midi = false, require_midi = false };
     PLUGIN_NAME_ID_LABEL("multichorus", "multichorus", "Multi Chorus")
 };
 
@@ -101,7 +101,7 @@ struct monosynth_metadata: public plugin_metadata<monosynth_metadata>
         par_keyfollow, par_legato, par_portamento, par_vel2filter, par_vel2amp, par_master, par_pwhlrange, 
         par_lforate, par_lfodelay, par_lfofilter, par_lfopitch, par_lfopw, par_mwhl_lfo, par_scaledetune,
         param_count };
-    enum { in_count = 0, out_count = 2, support_midi = true, require_midi = true, rt_capable = true };
+    enum { in_count = 0, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = true, require_midi = true, rt_capable = true };
     enum { step_size = 64, step_shift = 6 };
     enum {
         modsrc_none,
@@ -128,18 +128,20 @@ struct monosynth_metadata: public plugin_metadata<monosynth_metadata>
 };
 
 /// Thor's compressor - metadata
+/// Added some meters and stripped the weighting part
 struct compressor_metadata: public plugin_metadata<compressor_metadata>
 {
-    enum { in_count = 2, out_count = 2, support_midi = false, require_midi = false, rt_capable = true };
-    enum { param_threshold, param_ratio, param_attack, param_release, param_makeup, param_knee, param_detection, param_stereo_link, param_aweighting, param_compression, param_peak, param_clip, param_bypass, param_input,// param_freq, param_bw, 
-        param_count };
+    enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = false, require_midi = false, rt_capable = true };
+    enum { param_bypass, param_level_in, param_meter_in, param_meter_out, param_clip_in, param_clip_out,
+           param_threshold, param_ratio, param_attack, param_release, param_makeup, param_knee, param_detection, param_stereo_link, param_compression, 
+           param_count };
     PLUGIN_NAME_ID_LABEL("compressor", "compressor", "Compressor")
 };
 
 /// Markus's sidechain compressor - metadata
 struct sidechaincompressor_metadata: public plugin_metadata<sidechaincompressor_metadata>
 {
-    enum { in_count = 2, out_count = 2, support_midi = false, require_midi = false, rt_capable = true };
+    enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = false, require_midi = false, rt_capable = true };
     enum { param_bypass, param_level_in, param_meter_in, param_meter_out, param_clip_in, param_clip_out,
            param_threshold, param_ratio, param_attack, param_release, param_makeup, param_knee, param_detection, param_stereo_link, param_compression, 
            param_sc_mode, param_f1_freq, param_f2_freq, param_f1_level, param_f2_level,
@@ -150,7 +152,7 @@ struct sidechaincompressor_metadata: public plugin_metadata<sidechaincompressor_
 /// Markus's multibandcompressor - metadata
 struct multibandcompressor_metadata: public plugin_metadata<multibandcompressor_metadata>
 {
-    enum { in_count = 2, out_count = 2, support_midi = false, require_midi = false, rt_capable = true };
+    enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = false, require_midi = false, rt_capable = true };
     enum { param_bypass, param_level_in, param_level_out, param_meter_inL, param_meter_inR,
            param_meter_outL, param_meter_outR, param_clip_inL, param_clip_inR, param_clip_outL, param_clip_outR,
            param_freq0, param_freq1, param_freq2,
@@ -171,7 +173,7 @@ struct multibandcompressor_metadata: public plugin_metadata<multibandcompressor_
 /// Markus's deesser - metadata
 struct deesser_metadata: public plugin_metadata<deesser_metadata>
 {
-    enum { in_count = 2, out_count = 2, support_midi = false, require_midi = false, rt_capable = true };
+    enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = false, require_midi = false, rt_capable = true };
     enum { param_bypass, param_detected, param_compression, param_detected_led, param_clip_out,
            param_detection, param_mode,
            param_threshold, param_ratio, param_laxity, param_makeup,
@@ -183,7 +185,7 @@ struct deesser_metadata: public plugin_metadata<deesser_metadata>
 /// Markus's 5-band EQ - metadata
 struct equalizer5band_metadata: public plugin_metadata<equalizer5band_metadata>
 {
-    enum { in_count = 2, out_count = 2, support_midi = false, require_midi = false, rt_capable = true };
+    enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = false, require_midi = false, rt_capable = true };
     enum { param_bypass, param_level_in, param_level_out, param_meter_in,
            param_meter_out, param_clip_in, param_clip_out,
            param_ls_active, param_ls_level, param_ls_freq,
@@ -197,7 +199,7 @@ struct equalizer5band_metadata: public plugin_metadata<equalizer5band_metadata>
 /// Markus's 8-band EQ - metadata
 struct equalizer8band_metadata: public plugin_metadata<equalizer8band_metadata>
 {
-    enum { in_count = 2, out_count = 2, support_midi = false, require_midi = false, rt_capable = true };
+    enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = false, require_midi = false, rt_capable = true };
     enum { param_bypass, param_level_in, param_level_out, param_meter_inL, param_meter_inR,
            param_meter_outL, param_meter_outR, param_clip_inL, param_clip_inR, param_clip_outL, param_clip_outR,
            param_hp_active, param_hp_freq, param_hp_mode,
@@ -214,7 +216,7 @@ struct equalizer8band_metadata: public plugin_metadata<equalizer8band_metadata>
 /// Markus's 12-band EQ - metadata
 struct equalizer12band_metadata: public plugin_metadata<equalizer12band_metadata>
 {
-    enum { in_count = 2, out_count = 2, support_midi = false, require_midi = false, rt_capable = true };
+    enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = false, require_midi = false, rt_capable = true };
     enum { param_bypass, param_level_in, param_level_out, param_meter_inL, param_meter_inR,
            param_meter_outL, param_meter_outR, param_clip_inL, param_clip_inR, param_clip_outL, param_clip_outR,
            param_hp_active, param_hp_freq, param_hp_mode,
@@ -319,7 +321,7 @@ struct organ_enums
 /// Organ - metadata
 struct organ_metadata: public organ_enums, public plugin_metadata<organ_metadata>
 {
-    enum { in_count = 0, out_count = 2, support_midi = true, require_midi = true, rt_capable = true };
+    enum { in_count = 0, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = true, require_midi = true, rt_capable = true };
     PLUGIN_NAME_ID_LABEL("organ", "organ", "Organ")
     plugin_command_info *get_commands();
     const char **get_default_configure_vars();
@@ -329,7 +331,7 @@ struct organ_metadata: public organ_enums, public plugin_metadata<organ_metadata
 struct fluidsynth_metadata: public plugin_metadata<fluidsynth_metadata>
 {
     enum { par_master, par_soundfont, par_interpolation, par_reverb, par_chorus, param_count };
-    enum { in_count = 0, out_count = 2, support_midi = true, require_midi = true, rt_capable = false };
+    enum { in_count = 0, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = true, require_midi = true, rt_capable = false };
     PLUGIN_NAME_ID_LABEL("fluidsynth", "fluidsynth", "Fluidsynth")
     const char **get_default_configure_vars();
 };
@@ -399,7 +401,7 @@ struct wavetable_metadata: public plugin_metadata<wavetable_metadata>
         par_eg3attack, par_eg3decay, par_eg3sustain, par_eg3fade, par_eg3release, par_eg3velscl,
         par_pwhlrange, 
         param_count };
-    enum { in_count = 0, out_count = 2, support_midi = true, require_midi = true, rt_capable = true };
+    enum { in_count = 0, out_count = 2, ins_optional = 0, outs_optional = 0, support_midi = true, require_midi = true, rt_capable = true };
     enum { step_size = 64 };
     PLUGIN_NAME_ID_LABEL("wavetable", "wavetable", "Wavetable")
 };
diff --git a/src/calf/modules.h b/src/calf/modules.h
index e8c4a5e..5f42b36 100644
--- a/src/calf/modules.h
+++ b/src/calf/modules.h
@@ -846,82 +846,6 @@ public:
     bool get_gridline(int index, int subindex, float &pos, bool &vertical, std::string &legend, cairo_iface *context);
 };
 
-class compressor_audio_module: public audio_module<compressor_metadata>, public line_graph_iface {
-private:
-    float linSlope, peak, detected, kneeSqrt, kneeStart, linKneeStart, kneeStop, threshold, ratio, knee, makeup, compressedKneeStop, adjKneeStart;
-    float old_threshold, old_ratio, old_knee, old_makeup, old_bypass;
-    int last_generation;
-    uint32_t clip;
-    aweighter awL, awR;
-    biquad_d2<float> bpL, bpR;
-public:
-    float *ins[in_count];
-    float *outs[out_count];
-    float *params[param_count];
-    uint32_t srate;
-    bool is_active;
-    compressor_audio_module();
-    void activate();
-    void deactivate();
-    uint32_t process(uint32_t offset, uint32_t numsamples, uint32_t inputs_mask, uint32_t outputs_mask);
-    
-    inline float output_level(float slope) {
-        return slope * output_gain(slope, false) * makeup;
-    }
-    
-    inline float output_gain(float linSlope, bool rms) {
-         if(linSlope > (rms ? adjKneeStart : linKneeStart)) {
-            float slope = log(linSlope);
-            if(rms) slope *= 0.5f;
-
-            float gain = 0.f;
-            float delta = 0.f;
-            if(IS_FAKE_INFINITY(ratio)) {
-                gain = threshold;
-                delta = 0.f;
-            } else {
-                gain = (slope - threshold) / ratio + threshold;
-                delta = 1.f / ratio;
-            }
-            
-            if(knee > 1.f && slope < kneeStop) {
-                gain = hermite_interpolation(slope, kneeStart, kneeStop, kneeStart, compressedKneeStop, 1.f, delta);
-            }
-            
-            return exp(gain - slope);
-        }
-
-        return 1.f;
-    }
-
-    void set_sample_rate(uint32_t sr);
-    
-    virtual bool get_graph(int index, int subindex, float *data, int points, cairo_iface *context);
-    virtual bool get_dot(int index, int subindex, float &x, float &y, int &size, cairo_iface *context);
-    virtual bool get_gridline(int index, int subindex, float &pos, bool &vertical, std::string &legend, cairo_iface *context);
-
-    virtual int  get_changed_offsets(int index, int generation, int &subindex_graph, int &subindex_dot, int &subindex_gridline)
-    {
-        subindex_graph = 0;
-        subindex_dot = 0;
-        subindex_gridline = generation ? INT_MAX : 0;
-
-        if (fabs(threshold-old_threshold) + fabs(ratio - old_ratio) + fabs(knee - old_knee) + fabs( makeup - old_makeup) + fabs( *params[param_bypass] - old_bypass) > 0.01f)
-        {
-            old_threshold = threshold;
-            old_ratio = ratio;
-            old_knee = knee;
-            old_makeup = makeup;
-            old_bypass = *params[param_bypass];
-            last_generation++;
-        }
-
-        if (generation == last_generation)
-            subindex_graph = 2;
-        return last_generation;
-    }
-};
-
 class gain_reduction_audio_module {
 private:
     float linSlope, detected, kneeSqrt, kneeStart, linKneeStart, kneeStop;
@@ -949,6 +873,32 @@ public:
     virtual int  get_changed_offsets(int generation, int &subindex_graph, int &subindex_dot, int &subindex_gridline);
 };
 
+/// Compressor by Thor
+class compressor_audio_module: public audio_module<compressor_metadata>, public line_graph_iface  {
+private:
+    uint32_t clip_in, clip_out;
+    float meter_in, meter_out;
+    gain_reduction_audio_module compressor;
+public:
+    typedef std::complex<double> cfloat;
+    float *ins[in_count];
+    float *outs[out_count];
+    float *params[param_count];
+    uint32_t srate;
+    bool is_active;
+    volatile int last_generation, last_calculated_generation;
+    compressor_audio_module();
+    void activate();
+    void deactivate();
+    void params_changed();
+    void set_sample_rate(uint32_t 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);
+    bool get_dot(int index, int subindex, float &x, float &y, int &size, cairo_iface *context);
+    bool get_gridline(int index, int subindex, float &pos, bool &vertical, std::string &legend, cairo_iface *context);
+    int  get_changed_offsets(int index, int generation, int &subindex_graph, int &subindex_dot, int &subindex_gridline);
+};
+
 /// Sidecain Compressor by Markus Schmidt (based on Thor's compressor and Krzysztof's filters)
 class sidechaincompressor_audio_module: public audio_module<sidechaincompressor_metadata>, public frequency_response_line_graph  {
 private:
diff --git a/src/makerdf.cpp b/src/makerdf.cpp
index 430fb91..d3723c6 100644
--- a/src/makerdf.cpp
+++ b/src/makerdf.cpp
@@ -586,9 +586,15 @@ void make_ttl(string path_prefix)
         const char *in_names[] = { "in_l", "in_r" };
         const char *out_names[] = { "out_l", "out_r" };
         for (int i = 0; i < pi->get_input_count(); i++)
-            add_port(ports, in_names[i], in_names[i], "Input", pn++);
+            if(i <= pi->get_input_count() - pi->get_inputs_optional() - 1)
+                add_port(ports, in_names[i], in_names[i], "Input", pn++);
+            else
+                add_port(ports, in_names[i], in_names[i], "Input", pn++, "lv2:AudioPort", true);
         for (int i = 0; i < pi->get_output_count(); i++)
-            add_port(ports, out_names[i], out_names[i], "Output", pn++);
+            if(i <= pi->get_output_count() - pi->get_outputs_optional() - 1)
+                add_port(ports, out_names[i], out_names[i], "Output", pn++);
+            else
+                add_port(ports, out_names[i], out_names[i], "Output", pn++, "lv2:AudioPort", true);
         for (int i = 0; i < pi->get_param_count(); i++)
             add_ctl_port(ports, *pi->get_param_props(i), pn++, pi, i);
         if (pi->get_midi()) {
diff --git a/src/modules.cpp b/src/modules.cpp
index bf945c7..7a00582 100644
--- a/src/modules.cpp
+++ b/src/modules.cpp
@@ -216,25 +216,23 @@ CALF_PORT_NAMES(compressor) = {"In L", "In R", "Out L", "Out R"};
 
 const char *compressor_detection_names[] = { "RMS", "Peak" };
 const char *compressor_stereo_link_names[] = { "Average", "Maximum" };
-const char *compressor_weighting_names[] = { "Normal", "A-weighted", "Deesser (low)", "Deesser (med)", "Deesser (high)" };
 
 CALF_PORT_PROPS(compressor) = {
+    { 0,      0,  1,    0, PF_BOOL | PF_CTL_TOGGLE, NULL, "bypass", "Bypass" },
+    { 1,           0,           64,    0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_COEF | PF_PROP_NOBOUNDS, NULL, "level_in", "Input" },
+    { 0,      0,  1,    0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_METER | PF_CTLO_LABEL | PF_UNIT_DB | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "meter_in", "Input" },
+    { 0,      0,  1,    0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_METER | PF_CTLO_LABEL | PF_UNIT_DB | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "meter_out", "Output" },
+    { 0,      0,  1,    0, PF_BOOL | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "clip_in", "0dB" },
+    { 0,      0,  1,    0, PF_BOOL | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "clip_out", "0dB" },
     { 0.125,      0.000976563, 1,    0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "threshold", "Threshold" },
     { 2,      1, 20,  21, PF_FLOAT | PF_SCALE_LOG_INF | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "ratio", "Ratio" },
     { 20,     0.01, 2000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_MSEC, NULL, "attack", "Attack" },
     { 250,    0.01, 2000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_MSEC, NULL, "release", "Release" },
-    { 2,      1, 64,   0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "makeup", "Makeup Gain" },
+    { 2,      1, 64,    0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "makeup", "Makeup Gain" },
     { 2.828427125,      1,  8,   0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "knee", "Knee" },
-    { 0,      0,  1,   0, PF_ENUM | PF_CTL_COMBO, compressor_detection_names, "detection", "Detection" },
-    { 0,      0,  1,   0, PF_ENUM | PF_CTL_COMBO, compressor_stereo_link_names, "stereo_link", "Stereo Link" },
-    { 0,      0,  4,   0, PF_ENUM | PF_CTL_COMBO, compressor_weighting_names, "aweighting", "Weighting" },
-    { 0, 0.03125, 1,    0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_METER | PF_CTLO_LABEL | PF_CTLO_REVERSE | PF_UNIT_DB | PF_PROP_OUTPUT | PF_PROP_OPTIONAL| PF_PROP_GRAPH, NULL, "compression", "Compression" },
-    { 0,      0,  1,    0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_METER | PF_CTLO_LABEL | PF_UNIT_DB | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "peak", "Peak Output" },
-    { 0,      0,  1,    0, PF_FLOAT | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "clip", "0dB" },
-    { 0,      0,  1,    0, PF_BOOL | PF_CTL_TOGGLE, NULL, "bypass", "Bypass" },
-    { 1,           0,           64,    0,  PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_COEF | PF_PROP_NOBOUNDS, NULL, "input", "Input" },
-    // { 2000,      10,20000,    0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ | PF_PROP_GRAPH, NULL, "deess_freq", "Frequency" },
-    // { 0.707,  0.707,   32,    0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "deess_res", "Q" },
+    { 0,      0,  1,    0, PF_ENUM | PF_CTL_COMBO, compressor_detection_names, "detection", "Detection" },
+    { 0,      0,  1,    0, PF_ENUM | PF_CTL_COMBO, compressor_stereo_link_names, "stereo_link", "Stereo Link" },
+    { 0, 0.03125, 1,    0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_METER | PF_CTLO_LABEL | PF_CTLO_REVERSE | PF_UNIT_DB | PF_PROP_OUTPUT | PF_PROP_OPTIONAL| PF_PROP_GRAPH, NULL, "compression", "Reduction" },
 };
 
 CALF_PLUGIN_INFO(compressor) = { 0x8502, "Compressor", "Calf Compressor", "Thor Harald Johansen", calf_plugins::calf_copyright_info, "CompressorPlugin" };
diff --git a/src/modules_dsp.cpp b/src/modules_dsp.cpp
index 2f3783d..79a0be0 100644
--- a/src/modules_dsp.cpp
+++ b/src/modules_dsp.cpp
@@ -426,218 +426,6 @@ float multichorus_audio_module::freq_gain(int subindex, float freq, float srate)
     return (subindex ? right : left).freq_gain(freq, srate);                
 }
 
-///////////////////////////////////////////////////////////////////////////////////////////////
-
-compressor_audio_module::compressor_audio_module()
-{
-    is_active = false;
-    srate = 0;
-    last_generation = 0;
-}
-
-void compressor_audio_module::activate()
-{
-    is_active = true;
-    linSlope = 0.f;
-    peak = 0.f;
-    clip = 0.f;
-}
-
-void compressor_audio_module::deactivate()
-{
-    is_active = false;
-}
-
-void compressor_audio_module::set_sample_rate(uint32_t sr)
-{
-    srate = sr;
-    awL.set(sr);
-    awR.set(sr);
-}
-
-bool compressor_audio_module::get_graph(int index, int subindex, float *data, int points, cairo_iface *context)
-{ 
-    if (!is_active)
-        return false;
-    if (subindex > 1) // 1
-        return false;
-    for (int i = 0; i < points; i++)
-    {
-        float input = dB_grid_inv(-1.0 + i * 2.0 / (points - 1));
-        float output = output_level(input);
-        if (subindex == 0)
-            data[i] = dB_grid(input);
-        else
-            data[i] = dB_grid(output); 
-    }
-    if (subindex == (*params[param_bypass] > 0.5f ? 1 : 0))
-        context->set_source_rgba(0.35, 0.4, 0.2, 0.3);
-    else {
-        context->set_source_rgba(0.35, 0.4, 0.2, 1);
-        context->set_line_width(2);
-    }
-    return true;
-}
-
-bool compressor_audio_module::get_dot(int index, int subindex, float &x, float &y, int &size, cairo_iface *context)
-{
-    if (!is_active)
-        return false;
-    if (!subindex)
-    {
-        bool rms = *params[param_detection] == 0;
-        float det = rms ? sqrt(detected) : detected;
-        x = 0.5 + 0.5 * dB_grid(det);
-        y = dB_grid(*params[param_bypass] > 0.5f ? det : output_level(det));
-        return *params[param_bypass] > 0.5f ? false : true;
-    }
-    return false;
-}
-
-bool compressor_audio_module::get_gridline(int index, int subindex, float &pos, bool &vertical, std::string &legend, cairo_iface *context)
-{
-    bool tmp;
-    vertical = (subindex & 1) != 0;
-    bool result = get_freq_gridline(subindex >> 1, pos, tmp, legend, context, false);
-    if (result && vertical) {
-        if ((subindex & 4) && !legend.empty()) {
-            legend = "";
-        }
-        else {
-            size_t pos = legend.find(" dB");
-            if (pos != std::string::npos)
-                legend.erase(pos);
-        }
-        pos = 0.5 + 0.5 * pos;
-    }
-    return result;
-}
-
-// In case of doubt: this function is written by Thor. I just moved it to this file, damaging
-// the output of "git annotate" in the process.
-uint32_t compressor_audio_module::process(uint32_t offset, uint32_t numsamples, uint32_t inputs_mask, uint32_t outputs_mask)
-{
-    bool bypass = *params[param_bypass] > 0.5f;
-    
-    if(bypass) {
-        numsamples += offset;
-        while(offset < numsamples) {
-            outs[0][offset] = ins[0][offset];
-            outs[1][offset] = ins[1][offset];
-            ++offset;
-        }
-
-        if(params[param_compression] != NULL) {
-            *params[param_compression] = 1.f;
-        }
-
-        if(params[param_clip] != NULL) {
-            *params[param_clip] = 0.f;
-        }
-
-        if(params[param_peak] != NULL) {
-            *params[param_peak] = 0.f;
-        }
-  
-        return inputs_mask;
-    }
-
-    bool rms = *params[param_detection] == 0;
-    bool average = *params[param_stereo_link] == 0;
-    int aweighting = fastf2i_drm(*params[param_aweighting]);
-    float linThreshold = *params[param_threshold];
-    ratio = *params[param_ratio];
-    float attack = *params[param_attack];
-    float attack_coeff = std::min(1.f, 1.f / (attack * srate / 4000.f));
-    float release = *params[param_release];
-    float release_coeff = std::min(1.f, 1.f / (release * srate / 4000.f));
-    makeup = *params[param_makeup];
-    knee = *params[param_knee];
-
-    float linKneeSqrt = sqrt(knee);
-    linKneeStart = linThreshold / linKneeSqrt;
-    adjKneeStart = linKneeStart*linKneeStart;
-    float linKneeStop = linThreshold * linKneeSqrt;
-    
-    threshold = log(linThreshold);
-    kneeStart = log(linKneeStart);
-    kneeStop = log(linKneeStop);
-    compressedKneeStop = (kneeStop - threshold) / ratio + threshold;
-    
-    if (aweighting >= 2)
-    {
-        bpL.set_highshelf_rbj(5000, 0.707, 10 << (aweighting - 2), srate);
-        bpR.copy_coeffs(bpL);
-        bpL.sanitize();
-        bpR.sanitize();
-    }
-
-    numsamples += offset;
-    
-    float compression = 1.f;
-    peak = 0.f;
-    clip -= std::min(clip, numsamples);
-
-    while(offset < numsamples) {
-        float left = ins[0][offset] * *params[param_input];
-        float right = ins[1][offset] * *params[param_input];
-        
-        if(aweighting == 1) {
-            left = awL.process(left);
-            right = awR.process(right);
-        }
-        else if(aweighting >= 2) {
-            left = bpL.process(left);
-            right = bpR.process(right);
-        }
-        
-        float absample = average ? (fabs(left) + fabs(right)) * 0.5f : std::max(fabs(left), fabs(right));
-        if(rms) absample *= absample;
-        
-        linSlope += (absample - linSlope) * (absample > linSlope ? attack_coeff : release_coeff);
-        
-        float gain = 1.f;
-
-        if(linSlope > 0.f) {
-            gain = output_gain(linSlope, rms);
-        }
-
-        compression = gain;
-        gain *= makeup;
-
-        float outL = ins[0][offset] * gain * *params[param_input];
-        float outR = ins[1][offset] * gain * *params[param_input];
-        
-        outs[0][offset] = outL;
-        outs[1][offset] = outR;
-        
-        ++offset;
-        
-        float maxLR = std::max(fabs(outL), fabs(outR));
-        if(maxLR > peak)
-            peak = maxLR;
-        
-        if(peak > 1.f) clip = srate >> 3; /* blink clip LED for 125 ms */
-    }
-    
-    detected = linSlope;
-    
-    if(params[param_compression] != NULL) {
-        *params[param_compression] = compression;
-    }
-
-    if(params[param_clip] != NULL) {
-        *params[param_clip] = clip;
-    }
-
-    if(params[param_peak] != NULL) {
-        *params[param_peak] = peak;
-    }
-
-    return inputs_mask;
-}
-
-
 /// Multibandcompressor by Markus Schmidt
 ///
 /// This module splits the signal in four different bands
@@ -1051,6 +839,161 @@ int multibandcompressor_audio_module::get_changed_offsets(int index, int generat
     return 0;
 }
 
+/// Compressor originally by Thor
+///
+/// This module provides Thor's original compressor without any sidechain or weighting
+///////////////////////////////////////////////////////////////////////////////////////////////
+
+compressor_audio_module::compressor_audio_module()
+{
+    is_active = false;
+    srate = 0;
+    last_generation = 0;
+}
+
+void compressor_audio_module::activate()
+{
+    is_active = true;
+    // set all filters and strips
+    compressor.activate();
+    params_changed();
+    meter_in = 0.f;
+    meter_out = 0.f;
+    clip_in = 0.f;
+    clip_out = 0.f;
+}
+void compressor_audio_module::deactivate()
+{
+    is_active = false;
+    compressor.deactivate();
+}
+
+void compressor_audio_module::params_changed()
+{
+    compressor.set_params(*params[param_attack], *params[param_release], *params[param_threshold], *params[param_ratio], *params[param_knee], *params[param_makeup], *params[param_detection], *params[param_stereo_link], *params[param_bypass], 0.f);
+}
+
+void compressor_audio_module::set_sample_rate(uint32_t sr)
+{
+    srate = sr;
+    compressor.set_sample_rate(srate);
+}
+
+uint32_t compressor_audio_module::process(uint32_t offset, uint32_t numsamples, uint32_t inputs_mask, uint32_t outputs_mask)
+{
+    bool bypass = *params[param_bypass] > 0.5f;
+    numsamples += offset;
+    if(bypass) {
+        // everything bypassed
+        while(offset < numsamples) {
+            outs[0][offset] = ins[0][offset];
+            outs[1][offset] = ins[1][offset];
+            ++offset;
+        }
+        // displays, too
+        clip_in    = 0.f;
+        clip_out   = 0.f;
+        meter_in   = 0.f;
+        meter_out  = 0.f;
+    } else {
+        // process
+        
+        clip_in    -= std::min(clip_in,  numsamples);
+        clip_out   -= std::min(clip_out,  numsamples);
+        
+        while(offset < numsamples) {
+            // cycle through samples
+            float outL = 0.f;
+            float outR = 0.f;
+            float inL = ins[0][offset];
+            float inR = ins[1][offset];
+            // in level
+            inR *= *params[param_level_in];
+            inL *= *params[param_level_in];
+            
+            float leftAC = inL;
+            float rightAC = inR;
+            float leftSC = inL;
+            float rightSC = inR;
+            
+            compressor.process(leftAC, rightAC, leftSC, rightSC);
+            
+            outL = leftAC;
+            outR = rightAC;
+            
+            // send to output
+            outs[0][offset] = outL;
+            outs[1][offset] = outR;
+            
+            // clip LED's
+            if(std::max(fabs(inL), fabs(inR)) > 1.f) {
+                clip_in   = srate >> 3;
+            }
+            if(std::max(fabs(outL), fabs(outR)) > 1.f) {
+                clip_out  = srate >> 3;
+            }
+            // rise up out meter
+            meter_in = std::max(fabs(inL), fabs(inR));;
+            meter_out = std::max(fabs(outL), fabs(outR));;
+            
+            // next sample
+            ++offset;
+        } // cycle trough samples
+    }
+    // draw meters
+    if(params[param_clip_in] != NULL) {
+        *params[param_clip_in] = clip_in;
+    }
+    if(params[param_clip_out] != NULL) {
+        *params[param_clip_out] = clip_out;
+    }
+    if(params[param_meter_in] != NULL) {
+        *params[param_meter_in] = meter_in;
+    }
+    if(params[param_meter_out] != NULL) {
+        *params[param_meter_out] = meter_out;
+    }
+    // draw strip meter
+    if(bypass > 0.5f) {
+        if(params[param_compression] != NULL) {
+            *params[param_compression] = 1.0f;
+        }
+    } else {
+        if(params[param_compression] != NULL) {
+            *params[param_compression] = compressor.get_comp_level();
+        }
+    }
+    // whatever has to be returned x)
+    return outputs_mask;
+}
+bool compressor_audio_module::get_graph(int index, int subindex, float *data, int points, cairo_iface *context)
+{
+    if (!is_active)
+        return false;
+    return compressor.get_graph(subindex, data, points, context);
+}
+
+bool compressor_audio_module::get_dot(int index, int subindex, float &x, float &y, int &size, cairo_iface *context)
+{
+    if (!is_active)
+        return false;
+    return compressor.get_dot(subindex, x, y, size, context);
+}
+
+bool compressor_audio_module::get_gridline(int index, int subindex, float &pos, bool &vertical, std::string &legend, cairo_iface *context)
+{
+    if (!is_active)
+        return false;
+    return compressor.get_gridline(subindex, pos, vertical, legend, context);
+}
+
+int compressor_audio_module::get_changed_offsets(int index, int generation, int &subindex_graph, int &subindex_dot, int &subindex_gridline)
+{
+    if (!is_active)
+        return false;
+    return compressor.get_changed_offsets(generation, subindex_graph, subindex_dot, subindex_gridline);
+}
+
 /// Sidecain Compressor by Markus Schmidt
 ///
 /// This module splits the signal in a sidechain- and a process signal.

-- 
calf audio plugins packaging



More information about the pkg-multimedia-commits mailing list