diff options
author | Robin Gareus <robin@gareus.org> | 2017-07-16 18:59:35 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2017-07-16 21:01:03 +0200 |
commit | 5b9822ab98074c29b7eba219c81265dde678429b (patch) | |
tree | ebfdd0211fd7d917dd65ca51176084c41b65959c /libs/ardour/mute_control.cc | |
parent | 07aeb12d3ae30338c1dc443e209700a2d26eee7b (diff) |
Fix merging boolean automation + mute disconnect.
Diffstat (limited to 'libs/ardour/mute_control.cc')
-rw-r--r-- | libs/ardour/mute_control.cc | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/libs/ardour/mute_control.cc b/libs/ardour/mute_control.cc index 71bcf3517c..89d18746f7 100644 --- a/libs/ardour/mute_control.cc +++ b/libs/ardour/mute_control.cc @@ -123,7 +123,7 @@ double MuteControl::get_value () const { if (slaved ()) { - return muted_by_self() || get_masters_value (); + return muted_by_self() || muted_by_masters (); } if (_list && boost::dynamic_pointer_cast<AutomationList>(_list)->automation_playback()) { @@ -158,7 +158,7 @@ MuteControl::muted () const Control, or the Muteable that we sort-of proxy for. Since this method is called by ::get_value(), use the latter to avoid recursion. */ - return _muteable.mute_master()->muted_by_self() || get_masters_value (); + return _muteable.mute_master()->muted_by_self() || muted_by_masters (); } bool @@ -170,7 +170,7 @@ MuteControl::muted_by_self () const bool MuteControl::muted_by_masters () const { - return get_masters_value (); + return _muteable.mute_master()->muted_by_masters (); } bool @@ -184,11 +184,6 @@ MuteControl::automation_run (framepos_t start, pframes_t len) { boolean_automation_run (start, len); - if (muted_by_masters ()) { - // already muted, no need to check further - return; - } - bool valid = false; bool mute = false; @@ -200,6 +195,17 @@ MuteControl::automation_run (framepos_t start, pframes_t len) return; } + if (muted_by_masters ()) { + /* already muted, no need to check further, + * except we need to up update implicit/explict mute + */ + if (muted_by_self () != mute) { + set_value_unchecked (mute ? 1. : 0.); + Changed (false, Controllable::NoGroup); /* EMIT SIGNAL */ + } + return; + } + if (mute && !muted()) { set_value_unchecked (1.0); // mute Changed (false, Controllable::NoGroup); /* EMIT SIGNAL */ |