diff --git a/gtk2_ardour/route_ui.cc b/gtk2_ardour/route_ui.cc index e6c8fbf574..0aa1582896 100644 --- a/gtk2_ardour/route_ui.cc +++ b/gtk2_ardour/route_ui.cc @@ -838,7 +838,7 @@ RouteUI::mute_visual_state (Session* s, boost::shared_ptr r) 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 */ diff --git a/libs/ardour/ardour/mute_master.h b/libs/ardour/ardour/mute_master.h index a0207f9817..ad383d8833 100644 --- a/libs/ardour/ardour/mute_master.h +++ b/libs/ardour/ardour/mute_master.h @@ -72,6 +72,7 @@ class MuteMaster : public SessionHandleRef, public PBD::Stateful MutePoint mute_points() const { return _mute_point; } void set_solo_level (SoloLevel); + void set_solo_ignore (bool yn) { _solo_ignore = yn; } PBD::Signal0 MutePointChanged; @@ -83,6 +84,7 @@ class MuteMaster : public SessionHandleRef, public PBD::Stateful volatile bool _self_muted; volatile uint32_t _muted_by_others; volatile SoloLevel _solo_level; + volatile bool _solo_ignore; }; } // namespace ARDOUR diff --git a/libs/ardour/delivery.cc b/libs/ardour/delivery.cc index 5861e5ea2c..a1aa968a04 100644 --- a/libs/ardour/delivery.cc +++ b/libs/ardour/delivery.cc @@ -500,7 +500,7 @@ Delivery::target_gain () break; } - // cerr << name() << ' '; + //cerr << name() << ' '; desired_gain = _mute_master->mute_gain_at (mp); if (_role == Listen && _session.monitor_out() && !_session.listening()) { diff --git a/libs/ardour/mute_master.cc b/libs/ardour/mute_master.cc index df9a66ef7f..5e49a11875 100644 --- a/libs/ardour/mute_master.cc +++ b/libs/ardour/mute_master.cc @@ -40,6 +40,7 @@ MuteMaster::MuteMaster (Session& s, const std::string&) , _mute_point (AllPoints) , _self_muted (false) , _muted_by_others (0) + , _solo_ignore (false) { } @@ -107,7 +108,11 @@ MuteMaster::mute_gain_at (MutePoint mp) const } 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 @@ -119,10 +124,14 @@ MuteMaster::mute_gain_at (MutePoint mp) const } 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; diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index ddb227c6bb..33af0f8abf 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -165,6 +165,10 @@ Route::init () _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))); @@ -1795,6 +1799,10 @@ Route::_set_state (const XMLNode& node, int version, bool /*call_base*/) _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();