Merge some cases to avoid duplicated logic
[ardour.git] / libs / ardour / control_group.cc
index 36ea1efc63141db29d0faa1878cd32b79919a8ca..51a1515c6a39ab3d8f9bd81e5e1ae19d672b12a6 100644 (file)
@@ -46,6 +46,12 @@ ControlGroup::set_active (bool yn)
        _active = yn;
 }
 
+void
+ControlGroup::set_mode (Mode m)
+{
+       _mode = m;
+}
+
 void
 ControlGroup::clear ()
 {
@@ -155,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);
@@ -181,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)
 {
@@ -231,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);
 
@@ -254,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;
 
@@ -273,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;
@@ -287,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);
                }
        }
 }