make relative gain control in route groups work (again)
authorPaul Davis <paul@linuxaudiosystems.com>
Fri, 10 Jun 2016 20:59:27 +0000 (16:59 -0400)
committerPaul Davis <paul@linuxaudiosystems.com>
Fri, 10 Jun 2016 20:59:34 +0000 (16:59 -0400)
libs/ardour/control_group.cc
libs/ardour/route_group.cc

index 25f21a8775328595bdd843d2aac38f7b32bdc716..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 ()
 {
@@ -185,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)
 {
@@ -235,13 +246,9 @@ 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;
        }
 
@@ -262,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;
 
@@ -281,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;
@@ -295,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);
                }
        }
 }
index ce6e4a12e24a2755c4748e7b8061e6e8d1c71fb2..f258e9f14d2d379aaec05f937e3b09467d77e704 100644 (file)
@@ -99,7 +99,7 @@ RouteGroup::RouteGroup (Session& s, const string &n)
        , _solo_group (new ControlGroup (SoloAutomation))
        , _mute_group (new ControlGroup (MuteAutomation))
        , _rec_enable_group (new ControlGroup (RecEnableAutomation))
-       , _gain_group (new ControlGroup (GainAutomation))
+       , _gain_group (new GainControlGroup ())
        , _monitoring_group (new ControlGroup (MonitoringAutomation))
 {
        _xml_node_name = X_("RouteGroup");
@@ -408,7 +408,11 @@ RouteGroup::set_relative (bool yn, void* /*src*/)
        if (is_relative() == yn) {
                return;
        }
+
        _relative = yn;
+
+       push_to_groups ();
+
        send_change (PropertyChange (Properties::group_relative));
        _session.set_dirty ();
 }
@@ -542,6 +546,12 @@ RouteGroup::post_set (PBD::PropertyChange const &)
 void
 RouteGroup::push_to_groups ()
 {
+       if (is_relative()) {
+               _gain_group->set_mode (ControlGroup::Mode (_gain_group->mode()|ControlGroup::Relative));
+       } else {
+               _gain_group->set_mode (ControlGroup::Mode (_gain_group->mode()&~ControlGroup::Relative));
+       }
+
        if (_active) {
                _gain_group->set_active (is_gain());
                _solo_group->set_active (is_solo());