diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2016-04-19 15:42:50 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2016-05-31 15:30:41 -0400 |
commit | 9e70384ccfc81adc76910fd5365668a47f70d9c8 (patch) | |
tree | f2067ac2093709a2a1f4c3fef9c163371fc6e4f6 /libs | |
parent | 0ef0492cbb96987c44bf99a5f89630afce6b4376 (diff) |
fix solo control to use VCA logic as worked out for mute
Diffstat (limited to 'libs')
-rw-r--r-- | libs/ardour/ardour/solo_control.h | 5 | ||||
-rw-r--r-- | libs/ardour/solo_control.cc | 61 |
2 files changed, 64 insertions, 2 deletions
diff --git a/libs/ardour/ardour/solo_control.h b/libs/ardour/ardour/solo_control.h index aefd6abb79..78ce7c56be 100644 --- a/libs/ardour/ardour/solo_control.h +++ b/libs/ardour/ardour/solo_control.h @@ -61,7 +61,7 @@ class LIBARDOUR_API SoloControl : public SlavableAutomationControl */ bool soloed_by_others () const { - return _soloed_by_others_downstream || _soloed_by_others_downstream; + return _soloed_by_others_downstream || _soloed_by_others_downstream || get_masters_value (); } uint32_t soloed_by_others_upstream () const { return _soloed_by_others_upstream; @@ -81,6 +81,9 @@ class LIBARDOUR_API SoloControl : public SlavableAutomationControl protected: void actually_set_value (double, PBD::Controllable::GroupControlDisposition group_override); + void master_changed (bool from_self, GroupControlDisposition, boost::shared_ptr<AutomationControl> m); + void pre_remove_master (boost::shared_ptr<AutomationControl>); + void post_add_master (boost::shared_ptr<AutomationControl>); private: Soloable& _soloable; diff --git a/libs/ardour/solo_control.cc b/libs/ardour/solo_control.cc index 76e7ca536a..b9346406a5 100644 --- a/libs/ardour/solo_control.cc +++ b/libs/ardour/solo_control.cc @@ -171,7 +171,7 @@ SoloControl::get_value () const return AutomationControl::get_value(); } - return self_soloed() ? 1.0 : 0.0; + return soloed() ? 1.0 : 0.0; } void @@ -234,3 +234,62 @@ SoloControl::get_state () return node; } + +void +SoloControl::master_changed (bool /*from self*/, GroupControlDisposition, boost::shared_ptr<AutomationControl> m) +{ + bool send_signal = false; + const double changed_master_value = m->get_value(); + + if (changed_master_value) { + /* this master is now enabled */ + if (!self_soloed() && get_boolean_masters() == 0) { + send_signal = true; + } + } else { + if (!self_soloed() && get_boolean_masters() == 1) { + send_signal = true; + } + } + + update_boolean_masters_records (m); + + if (send_signal) { + Changed (false, Controllable::NoGroup); + } +} + +void +SoloControl::post_add_master (boost::shared_ptr<AutomationControl> m) +{ + if (m->get_value()) { + + /* boolean masters records are not updated until AFTER + * ::post_add_master() is called, so we can use them to check + * on whether any master was already enabled before the new + * one was added. + */ + + if (!self_soloed() && !get_boolean_masters()) { + Changed (false, Controllable::NoGroup); + } + } +} + +void +SoloControl::pre_remove_master (boost::shared_ptr<AutomationControl> m) +{ + if (!m) { + /* null control ptr means we're removing all masters. Nothing + * to do. Changed will be emitted in + * SlavableAutomationControl::clear_masters() + */ + return; + } + + if (m->get_value()) { + if (!self_soloed() && (get_boolean_masters() == 1)) { + Changed (false, Controllable::NoGroup); + } + } +} |