From ec8a4de01596c162c1529f3021dfc432bf66dfe8 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 10 Jun 2016 16:59:27 -0400 Subject: make relative gain control in route groups work (again) --- libs/ardour/control_group.cc | 34 ++++++++++++++++++++++++---------- libs/ardour/route_group.cc | 12 +++++++++++- 2 files changed, 35 insertions(+), 11 deletions(-) (limited to 'libs') diff --git a/libs/ardour/control_group.cc b/libs/ardour/control_group.cc index 25f21a8775..51a1515c6a 100644 --- a/libs/ardour/control_group.cc +++ b/libs/ardour/control_group.cc @@ -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 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 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 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 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 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); } } } diff --git a/libs/ardour/route_group.cc b/libs/ardour/route_group.cc index ce6e4a12e2..f258e9f14d 100644 --- a/libs/ardour/route_group.cc +++ b/libs/ardour/route_group.cc @@ -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()); -- cgit v1.2.3