permanently mark Delivery processors on master/monitor/audition as immune to solo effects, rather than having to reset them every time something else is soloed

git-svn-id: svn://localhost/ardour2/branches/3.0@6936 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis 2010-04-19 14:02:53 +00:00
parent 0cde999d87
commit 1ceee92bb5
4 changed files with 17 additions and 21 deletions

View File

@ -77,6 +77,7 @@ public:
void set_solo_level (int32_t sl) { _solo_level = sl; }
void set_solo_isolated (bool yn) { _solo_isolated = yn; }
void set_solo_ignored (bool yn) { _solo_ignored = yn; }
void cycle_start (nframes_t);
void increment_output_offset (nframes_t);
@ -114,6 +115,7 @@ public:
bool _no_outs_cuz_we_no_monitor;
uint32_t _solo_level;
bool _solo_isolated;
bool _solo_ignored;
boost::shared_ptr<MuteMaster> _mute_master;
bool no_panner_reset;
boost::shared_ptr<Panner> _panner;

View File

@ -57,6 +57,7 @@ Delivery::Delivery (Session& s, boost::shared_ptr<IO> io, boost::shared_ptr<Mute
, _no_outs_cuz_we_no_monitor (false)
, _solo_level (0)
, _solo_isolated (false)
, _solo_ignored (false)
, _mute_master (mm)
, no_panner_reset (false)
{
@ -81,6 +82,7 @@ Delivery::Delivery (Session& s, boost::shared_ptr<MuteMaster> mm, const string&
, _no_outs_cuz_we_no_monitor (false)
, _solo_level (0)
, _solo_isolated (false)
, _solo_ignored (false)
, _mute_master (mm)
, no_panner_reset (false)
{
@ -486,7 +488,7 @@ Delivery::target_gain ()
gain_t desired_gain = -1.0f;
if (_solo_level) {
if (_solo_level || _solo_ignored) {
desired_gain = 1.0;

View File

@ -132,7 +132,7 @@ Route::init ()
add_processor (_meter, PostFader);
_main_outs.reset (new Delivery (_session, _output, _mute_master, _name, Delivery::Main));
add_processor (_main_outs, PostFader);
if (is_monitor()) {
@ -590,7 +590,7 @@ void
Route::mod_solo_by_others (int32_t delta)
{
if (delta < 0) {
if (_soloed_by_others >= (uint32_t) delta) {
if (_soloed_by_others >= (uint32_t) abs (delta)) {
_soloed_by_others += delta;
} else {
_soloed_by_others = 0;
@ -645,6 +645,8 @@ Route::set_solo_isolated (bool yn, void *src)
}
}
/* XXX should we back-propagate as well? */
bool changed = false;
if (yn) {
@ -806,6 +808,14 @@ Route::add_processor (boost::shared_ptr<Processor> processor, ProcessorList::ite
}
/* all delivery processors on master, monitor and auditioner never ever pay attention to solo
*/
boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery>(processor);
if (d && (is_master() || is_monitor() || is_hidden())) {
d->set_solo_ignored (true);
}
/* is this the monitor send ? if so, make sure we keep track of it */
boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);

View File

@ -2247,24 +2247,6 @@ Session::route_solo_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
}
}
/* make sure master is never muted by solo */
if (_master_out && route != _master_out && _master_out->soloed_by_others() == 0 && !_master_out->soloed()) {
_master_out->mod_solo_by_others (1);
}
/* ditto for control outs make sure it is never muted by solo */
if (_monitor_out && route != _monitor_out && _monitor_out && _monitor_out->soloed_by_others() == 0) {
_monitor_out->mod_solo_by_others (1);
}
/* ditto for auditioner make sure it is never muted by solo */
if (auditioner) {
auditioner->mod_solo_by_others (1);
}
solo_update_disabled = false;
update_route_solo_state (r);
SoloChanged (); /* EMIT SIGNAL */