if (r->self_muted ()) {
/* full mute */
return 2;
- } else if (r->muted_by_others() || r->path_muted_by_others()) {
+ } else if (!r->self_soloed() && (r->muted_by_others() || r->path_muted_by_others())) {
return 1;
} else {
/* no mute at all */
MutePoint mute_points() const { return _mute_point; }
void set_solo_level (SoloLevel);
+ void set_solo_ignore (bool yn) { _solo_ignore = yn; }
PBD::Signal0<void> MutePointChanged;
volatile bool _self_muted;
volatile uint32_t _muted_by_others;
volatile SoloLevel _solo_level;
+ volatile bool _solo_ignore;
};
} // namespace ARDOUR
break;
}
- // cerr << name() << ' ';
+ //cerr << name() << ' ';
desired_gain = _mute_master->mute_gain_at (mp);
if (_role == Listen && _session.monitor_out() && !_session.listening()) {
, _mute_point (AllPoints)
, _self_muted (false)
, _muted_by_others (0)
+ , _solo_ignore (false)
{
}
} else if (muted_by_others_at (mp)) { // muted by others
gain = Config->get_solo_mute_gain ();
} else {
- gain = 1.0;
+ if (!_solo_ignore && _session.soloing()) {
+ gain = 0.0;
+ } else {
+ gain = 1.0;
+ }
}
} else {
if (self_muted_at (mp)) { // self-muted
} else if (l == UpstreamSoloed) { // soloed by others
gain = 1.0;
} else {
- gain = 1.0;
+ if (!_solo_ignore && _session.soloing()) {
+ gain = 0.0;
+ } else {
+ gain = 1.0;
+ }
}
}
-
+
// cerr << "\tgain = " << gain << endl;
return gain;
_main_outs->panner()->set_bypassed (true);
}
+ if (is_master() || is_monitor() || is_hidden()) {
+ _mute_master->set_solo_ignore (true);
+ }
+
/* now that we have _meter, its safe to connect to this */
Metering::Meter.connect_same_thread (*this, (boost::bind (&Route::meter, this)));
_flags = Flag (0);
}
+ if (is_master() || is_monitor() || is_hidden()) {
+ _mute_master->set_solo_ignore (true);
+ }
+
/* add all processors (except amp, which is always present) */
nlist = node.children();