#include "ardour/session.h"
#include "ardour/mute_control.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace std;
*/
if (!muted_by_self() && !get_boolean_masters()) {
+ _muteable.mute_master()->set_muted_by_masters (true);
Changed (false, Controllable::NoGroup);
}
}
{
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);
}
}
_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<AutomationControl> m)
{
bool send_signal = false;
- const double changed_master_value = m->get_value();
boost::shared_ptr<MuteControl> mc = boost::dynamic_pointer_cast<MuteControl> (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;
}
}
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<AutomationList>(_list)->automation_playback()) {
return AutomationControl::get_value();
}
- return muted() ? 1.0 : 0.0;
+ return muted();
}
void
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
}
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
+ }
+}