summaryrefslogtreecommitdiff
path: root/libs/ardour/solo_control.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2016-04-19 15:42:50 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2016-05-31 15:30:41 -0400
commit9e70384ccfc81adc76910fd5365668a47f70d9c8 (patch)
treef2067ac2093709a2a1f4c3fef9c163371fc6e4f6 /libs/ardour/solo_control.cc
parent0ef0492cbb96987c44bf99a5f89630afce6b4376 (diff)
fix solo control to use VCA logic as worked out for mute
Diffstat (limited to 'libs/ardour/solo_control.cc')
-rw-r--r--libs/ardour/solo_control.cc61
1 files changed, 60 insertions, 1 deletions
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);
+ }
+ }
+}