summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk2_ardour/route_ui.cc2
-rw-r--r--libs/ardour/ardour/mute_master.h2
-rw-r--r--libs/ardour/delivery.cc2
-rw-r--r--libs/ardour/mute_master.cc15
-rw-r--r--libs/ardour/route.cc8
5 files changed, 24 insertions, 5 deletions
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<Route> 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<void> 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();