13
0

more solo model work, including a GUI fix for mute button state when the route is self-soloed

git-svn-id: svn://localhost/ardour2/branches/3.0@7048 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis 2010-05-03 18:58:38 +00:00
parent 1b9bf21aa4
commit e33d4553b2
5 changed files with 24 additions and 5 deletions

View File

@ -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 */

View File

@ -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

View File

@ -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()) {

View File

@ -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;

View File

@ -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();