mirror of
https://github.com/Ardour/ardour.git
synced 2026-01-07 22:25:46 +01:00
fix solo control to use VCA logic as worked out for mute
This commit is contained in:
parent
0ef0492cbb
commit
9e70384ccf
2 changed files with 64 additions and 2 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue