From e11ba7b79d68bc1070b170236c22123966d7bcc3 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Mon, 5 Oct 2015 14:19:32 +0200 Subject: [PATCH] SiP and "solo overrides mutes" tweak: Only Explicit solos should override mutes. --- libs/ardour/ardour/mute_master.h | 6 ++++-- libs/ardour/mute_master.cc | 15 +++++---------- libs/ardour/route.cc | 8 +++++--- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/libs/ardour/ardour/mute_master.h b/libs/ardour/ardour/mute_master.h index 8a83352a5b..d88cbdcd39 100644 --- a/libs/ardour/ardour/mute_master.h +++ b/libs/ardour/ardour/mute_master.h @@ -62,7 +62,8 @@ class LIBARDOUR_API MuteMaster : public SessionHandleRef, public PBD::Stateful void set_mute_points (MutePoint); MutePoint mute_points() const { return _mute_point; } - void set_soloed (bool); + void set_soloed_by_self (bool yn) { _soloed_by_self = yn; } + void set_soloed_by_others (bool yn) { _soloed_by_others = yn; } void set_solo_ignore (bool yn) { _solo_ignore = yn; } PBD::Signal0 MutePointChanged; @@ -73,7 +74,8 @@ class LIBARDOUR_API MuteMaster : public SessionHandleRef, public PBD::Stateful private: volatile MutePoint _mute_point; volatile bool _muted_by_self; - volatile bool _soloed; + volatile bool _soloed_by_self; + volatile bool _soloed_by_others; volatile bool _solo_ignore; }; diff --git a/libs/ardour/mute_master.cc b/libs/ardour/mute_master.cc index 4c23855915..8f81a5e672 100644 --- a/libs/ardour/mute_master.cc +++ b/libs/ardour/mute_master.cc @@ -38,7 +38,8 @@ MuteMaster::MuteMaster (Session& s, const std::string&) : SessionHandleRef (s) , _mute_point (MutePoint (0)) , _muted_by_self (false) - , _soloed (false) + , _soloed_by_self (false) + , _soloed_by_others (false) , _solo_ignore (false) { @@ -77,24 +78,18 @@ MuteMaster::unmute_at (MutePoint mp) } } -void -MuteMaster::set_soloed (bool yn) -{ - _soloed = yn; -} - gain_t MuteMaster::mute_gain_at (MutePoint mp) const { gain_t gain; if (Config->get_solo_mute_override()) { - if (_soloed) { + if (_soloed_by_self) { gain = GAIN_COEFF_UNITY; } else if (muted_by_self_at (mp)) { gain = GAIN_COEFF_ZERO; } else { - if (muted_by_others_at (mp)) { + if (muted_by_others_at (mp) && !_soloed_by_others) { gain = Config->get_solo_mute_gain (); } else { gain = GAIN_COEFF_UNITY; @@ -103,7 +98,7 @@ MuteMaster::mute_gain_at (MutePoint mp) const } else { if (muted_by_self_at (mp)) { gain = GAIN_COEFF_ZERO; - } else if (_soloed) { + } else if (_soloed_by_self || _soloed_by_others) { gain = GAIN_COEFF_UNITY; } else { if (muted_by_others_at (mp)) { diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index 8f845bb8c9..74c00409c7 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -779,11 +779,12 @@ Route::set_listen (bool yn, void* src) if (yn != _monitor_send->active()) { if (yn) { _monitor_send->activate (); - _mute_master->set_soloed (true); + _mute_master->set_soloed_by_self (true); } else { _monitor_send->deactivate (); - _mute_master->set_soloed (false); + _mute_master->set_soloed_by_self (false); } + _mute_master->set_soloed_by_others (false); listen_changed (src); /* EMIT SIGNAL */ } @@ -949,7 +950,8 @@ Route::mod_solo_by_others_downstream (int32_t delta) void Route::set_mute_master_solo () { - _mute_master->set_soloed (self_soloed() || soloed_by_others_downstream() || soloed_by_others_upstream()); + _mute_master->set_soloed_by_self (self_soloed()); + _mute_master->set_soloed_by_others (soloed_by_others_downstream() || soloed_by_others_upstream()); } void