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);
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;
, _no_outs_cuz_we_no_monitor (false)
, _solo_level (0)
, _solo_isolated (false)
+ , _solo_ignored (false)
, _mute_master (mm)
, no_panner_reset (false)
{
, _no_outs_cuz_we_no_monitor (false)
, _solo_level (0)
, _solo_isolated (false)
+ , _solo_ignored (false)
, _mute_master (mm)
, no_panner_reset (false)
{
gain_t desired_gain = -1.0f;
- if (_solo_level) {
+ if (_solo_level || _solo_ignored) {
desired_gain = 1.0;
add_processor (_meter, PostFader);
_main_outs.reset (new Delivery (_session, _output, _mute_master, _name, Delivery::Main));
-
+
add_processor (_main_outs, PostFader);
if (is_monitor()) {
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;
}
}
+ /* XXX should we back-propagate as well? */
+
bool changed = false;
if (yn) {
}
+ /* 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);
}
}
- /* 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 */