Finalize experiment: always propagate solo via sends

See also caf057f06d
This commit is contained in:
Robin Gareus 2020-10-22 23:56:50 +02:00
parent 8b6e1d78f9
commit 2e98c57fb8
Signed by: rgareus
GPG Key ID: A090BCE02CF57F04
3 changed files with 18 additions and 49 deletions

View File

@ -110,8 +110,7 @@ InternalSend::propagate_solo ()
if ((*i) == _send_to || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
continue;
}
bool sends_only;
bool does_feed = _send_to->feeds (*i, &sends_only);
bool does_feed = _send_to->feeds (*i);
if (does_feed && to_soloed_upstream) {
(*i)->solo_control()->mod_solo_by_others_upstream (-1);
}
@ -129,9 +128,7 @@ InternalSend::propagate_solo ()
if (*i == _send_from || !(*i)->can_solo()) {
continue;
}
bool sends_only;
bool does_feed = (*i)->feeds (_send_from, &sends_only);
if (does_feed) {
if ((*i)->feeds (_send_from)) {
(*i)->solo_control()->mod_solo_by_others_downstream (-1);
}
}

View File

@ -756,10 +756,7 @@ Route::push_solo_isolate_upstream (int32_t delta)
continue;
}
bool sends_only;
bool does_feed = feeds (*i, &sends_only);
if (does_feed /*&& !sends_only*/) {
if (feeds (*i)) {
(*i)->solo_isolate_control()->mod_solo_isolated_by_upstream (delta);
}
}
@ -770,9 +767,6 @@ Route::push_solo_upstream (int delta)
{
DEBUG_TRACE (DEBUG::Solo, string_compose("\t ... INVERT push from %1\n", _name));
for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
if (i->sends_only) {
/* continue; */
}
boost::shared_ptr<Route> sr (i->r.lock());
if (sr) {
sr->solo_control()->mod_solo_by_others_downstream (-delta);
@ -3701,9 +3695,7 @@ Route::input_change_handler (IOChange change, void * /*src*/)
if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
continue;
}
bool sends_only;
bool does_feed = (*i)->direct_feeds_according_to_reality (boost::dynamic_pointer_cast<Route> (shared_from_this()), &sends_only);
if (does_feed /*&& !sends_only*/) {
if ((*i)->direct_feeds_according_to_reality (boost::dynamic_pointer_cast<Route> (shared_from_this()))) {
if ((*i)->soloed()) {
++sbou;
}
@ -3746,13 +3738,12 @@ Route::input_change_handler (IOChange change, void * /*src*/)
if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
continue;
}
bool sends_only;
bool does_feed = feeds (*i, &sends_only);
if (delta <= 0 && does_feed /*&& !sends_only*/) {
bool does_feed = feeds (*i);
if (delta <= 0 && does_feed) {
(*i)->solo_control()->mod_solo_by_others_upstream (delta);
}
if (idelta < 0 && does_feed /*&& !sends_only*/) {
if (idelta < 0 && does_feed) {
(*i)->solo_isolate_control()->mod_solo_isolated_by_upstream (-1);
}
}
@ -3799,9 +3790,7 @@ Route::output_change_handler (IOChange change, void * /*src*/)
if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
continue;
}
bool sends_only;
bool does_feed = direct_feeds_according_to_reality (*i, &sends_only);
if (does_feed /*&& !sends_only*/) {
if (direct_feeds_according_to_reality (*i)) {
if ((*i)->soloed()) {
++sbod;
break;
@ -3821,9 +3810,7 @@ Route::output_change_handler (IOChange change, void * /*src*/)
if ((*i).get() == this || !can_solo()) {
continue;
}
bool sends_only;
bool does_feed = (*i)->feeds (shared_this, &sends_only);
if (delta != 0 && does_feed /*&& !sends_only*/) {
if (delta != 0 && (*i)->feeds (shared_this)) {
(*i)->solo_control()->mod_solo_by_others_downstream (delta);
}
}

View File

@ -3690,7 +3690,6 @@ Session::route_solo_changed (bool self_solo_changed, Controllable::GroupControlD
DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
bool via_sends_only;
bool in_signal_flow;
if ((*i) == route) {
@ -3718,16 +3717,12 @@ Session::route_solo_changed (bool self_solo_changed, Controllable::GroupControlD
DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
if ((*i)->feeds (route, &via_sends_only)) {
if ((*i)->feeds (route)) {
DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
if (true /*!via_sends_only*/) {
if (!route->soloed_by_others_upstream()) {
(*i)->solo_control()->mod_solo_by_others_downstream (delta);
} else {
DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others upstream\n");
}
if (!route->soloed_by_others_upstream()) {
(*i)->solo_control()->mod_solo_by_others_downstream (delta);
} else {
DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others upstream\n");
}
in_signal_flow = true;
} else {
@ -3736,25 +3731,15 @@ Session::route_solo_changed (bool self_solo_changed, Controllable::GroupControlD
DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
if (route->feeds (*i, &via_sends_only)) {
/* propagate solo upstream only if routing other than
sends is involved, but do consider the other route
(*i) to be part of the signal flow even if only
sends are involved.
*/
DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
if (route->feeds (*i)) {
DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 sboD %3 sboU %4\n",
route->name(),
(*i)->name(),
via_sends_only,
route->soloed_by_others_downstream(),
route->soloed_by_others_upstream()));
if (true /*!via_sends_only*/) {
//NB. Triggers Invert Push, which handles soloed by downstream
DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
(*i)->solo_control()->mod_solo_by_others_upstream (delta);
} else {
DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
}
//NB. Triggers Invert Push, which handles soloed by downstream
DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
(*i)->solo_control()->mod_solo_by_others_upstream (delta);
in_signal_flow = true;
} else {
DEBUG_TRACE (DEBUG::Solo, string_compose("\tno feed to %1\n", (*i)->name()) );