X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fmute_control.cc;h=5b38547366778081b9a479abf216780f1d869fca;hb=77687519b69f39aaa2354f4c9945958fc1c630fe;hp=11b4f329136d3caecd0bd382a11f6596f5f868de;hpb=8ee660356181f4eb66e4abcb30d52f55ae267b80;p=ardour.git diff --git a/libs/ardour/mute_control.cc b/libs/ardour/mute_control.cc index 11b4f32913..5b38547366 100644 --- a/libs/ardour/mute_control.cc +++ b/libs/ardour/mute_control.cc @@ -22,7 +22,7 @@ #include "ardour/session.h" #include "ardour/mute_control.h" -#include "i18n.h" +#include "pbd/i18n.h" using namespace ARDOUR; using namespace std; @@ -51,6 +51,7 @@ MuteControl::post_add_master (boost::shared_ptr m) */ if (!muted_by_self() && !get_boolean_masters()) { + _muteable.mute_master()->set_muted_by_masters (true); Changed (false, Controllable::NoGroup); } } @@ -61,13 +62,13 @@ MuteControl::pre_remove_master (boost::shared_ptr m) { if (!m) { /* null control ptr means we're removing all masters */ - _muteable.mute_master()->set_muted_by_others (false); + _muteable.mute_master()->set_muted_by_masters (false); /* Changed will be emitted in SlavableAutomationControl::clear_masters() */ return; } if (m->get_value()) { - if (!muted_by_self() && (muted_by_others() == 1)) { + if (!muted_by_self() && (get_boolean_masters() == 1)) { Changed (false, Controllable::NoGroup); } } @@ -85,29 +86,25 @@ MuteControl::actually_set_value (double val, Controllable::GroupControlDispositi _muteable.act_on_mute (); } - AutomationControl::actually_set_value (val, gcd); + SlavableAutomationControl::actually_set_value (val, gcd); } void MuteControl::master_changed (bool self_change, Controllable::GroupControlDisposition gcd, boost::shared_ptr m) { bool send_signal = false; - const double changed_master_value = m->get_value(); boost::shared_ptr mc = boost::dynamic_pointer_cast (m); - if (m) { - cerr << "master changed, self ? " << self_change << " self muted = " - << mc->muted_by_self() << " others " << mc->muted_by_others() - << endl; - } - - if (changed_master_value) { + if (m->get_value()) { /* this master is now enabled */ if (!muted_by_self() && get_boolean_masters() == 0) { + _muteable.mute_master()->set_muted_by_masters (true); send_signal = true; } } else { + /* this master is disabled and there was only 1 enabled before */ if (!muted_by_self() && get_boolean_masters() == 1) { + _muteable.mute_master()->set_muted_by_masters (false); send_signal = true; } } @@ -123,8 +120,7 @@ double MuteControl::get_value () const { if (slaved ()) { - Glib::Threads::RWLock::ReaderLock lm (master_lock); - return get_masters_value_locked (); + return muted_by_self() || get_masters_value (); } if (_list && boost::dynamic_pointer_cast(_list)->automation_playback()) { @@ -132,7 +128,7 @@ MuteControl::get_value () const return AutomationControl::get_value(); } - return muted() ? 1.0 : 0.0; + return muted(); } void @@ -155,7 +151,11 @@ MuteControl::mute_points () const bool MuteControl::muted () const { - return muted_by_self() || muted_by_others(); + /* have to get (self-muted) value from somewhere. could be our own + 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 (); } bool @@ -165,7 +165,30 @@ MuteControl::muted_by_self () const } bool -MuteControl::muted_by_others () const +MuteControl::muted_by_masters () const { return get_masters_value (); } + +bool +MuteControl::muted_by_others_soloing () const +{ + return _muteable.muted_by_others_soloing (); +} + +void +MuteControl::automation_run (framepos_t start, pframes_t) +{ + if (!list() || !automation_playback()) { + return; + } + + bool valid = false; + const float mute = list()->rt_safe_eval (start, valid); + + if (mute >= 0.5 && !muted()) { + set_value_unchecked (1.0); // mute + } else if (mute < 0.5 && muted ()) { + set_value_unchecked (0.0); // unmute + } +}