*/
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;
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;
return AutomationControl::get_value();
}
- return self_soloed() ? 1.0 : 0.0;
+ return soloed() ? 1.0 : 0.0;
}
void
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);
+ }
+ }
+}