fix bypassing plugins with sidechain i/o
[ardour.git] / libs / ardour / control_group.cc
index 2fe6af26ef4133d81bbd56cb70fb734560dff772..51a1515c6a39ab3d8f9bd81e5e1ae19d672b12a6 100644 (file)
@@ -44,7 +44,12 @@ void
 ControlGroup::set_active (bool yn)
 {
        _active = yn;
-       std::cerr << " CG for " << enum_2_string ((AutomationType) _parameter.type()) << " now active ? " << _active << std::endl;
+}
+
+void
+ControlGroup::set_mode (Mode m)
+{
+       _mode = m;
 }
 
 void
@@ -156,6 +161,10 @@ ControlGroup::set_group_value (boost::shared_ptr<AutomationControl> control, dou
 
        control->set_value (val, Controllable::ForGroup);
 
+       if (!_active) {
+               return;
+       }
+
        /* now propagate across the group */
 
        Glib::Threads::RWLock::ReaderLock lm (controls_lock);
@@ -182,6 +191,11 @@ ControlGroup::set_group_value (boost::shared_ptr<AutomationControl> control, dou
 
 /*---- GAIN CONTROL GROUP -----------*/
 
+GainControlGroup::GainControlGroup ()
+       : ControlGroup (GainAutomation)
+{
+}
+
 gain_t
 GainControlGroup::get_min_factor (gain_t factor)
 {
@@ -232,11 +246,11 @@ GainControlGroup::get_max_factor (gain_t factor)
 void
 GainControlGroup::set_group_value (boost::shared_ptr<AutomationControl> control, double val)
 {
-       /* set the primary control */
-
-       control->set_value (val, Controllable::ForGroup);
-
-       /* now propagate across the group */
+       if (!_active) {
+               /* set the primary control */
+               control->set_value (val, Controllable::ForGroup);
+               return;
+       }
 
        Glib::Threads::RWLock::ReaderLock lm (controls_lock);
 
@@ -255,8 +269,9 @@ GainControlGroup::set_group_value (boost::shared_ptr<AutomationControl> control,
 
                delta -= usable_gain;
 
-               if (delta == 0.0f)
+               if (delta == 0.0f) {
                        return;
+               }
 
                gain_t factor = delta / usable_gain;
 
@@ -274,6 +289,12 @@ GainControlGroup::set_group_value (boost::shared_ptr<AutomationControl> control,
                        }
                }
 
+               /* set the primary control */
+
+               control->set_value (val, Controllable::ForGroup);
+
+               /* now propagate across the group */
+
                for (ControlMap::iterator c = _controls.begin(); c != _controls.end(); ++c) {
                        if (c->second == control) {
                                continue;
@@ -288,10 +309,10 @@ GainControlGroup::set_group_value (boost::shared_ptr<AutomationControl> control,
 
        } else {
 
+               /* just set entire group */
+
                for (ControlMap::iterator c = _controls.begin(); c != _controls.end(); ++c) {
-                       if (c->second != control) {
-                               c->second->set_value (val, Controllable::ForGroup);
-                       }
+                       c->second->set_value (val, Controllable::ForGroup);
                }
        }
 }