summaryrefslogtreecommitdiff
path: root/libs/ardour/session.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libs/ardour/session.cc')
-rw-r--r--libs/ardour/session.cc43
1 files changed, 12 insertions, 31 deletions
diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc
index a643ee21c3..10c040757f 100644
--- a/libs/ardour/session.cc
+++ b/libs/ardour/session.cc
@@ -2251,7 +2251,7 @@ Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_p
error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
return;
}
-
+
shared_ptr<RouteList> r = routes.reader ();
int32_t delta;
@@ -2260,21 +2260,19 @@ Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_p
} else {
delta = -1;
}
+
+ if (delta == 1 && !Config->get_solo_latched()) {
+ /* new solo: disable all other solos */
+ for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
+ if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
+ continue;
+ }
+ (*i)->set_solo (false, this);
+ }
+ }
solo_update_disabled = true;
-
- /*
-
- solo a route:
- for anything in the signal path for this route, increment its soloed-by-other count
- for anything not in the signal path for this route, increment its muted-by-other count
-
- unsolo a route:
- for anything in the signal path for this route, decrement its soloed-by-other count
- for anything not in the signal path for this route, decrement its muted-by-other count
-
- */
-
+
RouteList uninvolved;
for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
@@ -2287,15 +2285,6 @@ Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_p
in_signal_flow = false;
- /* feed-backwards (other route to solo change route):
-
- if (*i) feeds the one whose solo status changed
- it should be soloed by other if the change was -> solo OR de-soloed by other if change was -> !solo
- else
- do nothing
-
- */
-
if ((*i)->feeds (route, &via_sends_only)) {
if (!via_sends_only) {
(*i)->mod_solo_by_others_downstream (delta);
@@ -2303,14 +2292,6 @@ Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_p
}
}
- /* feed-forward (solo change route to other routes):
-
- if the route whose solo status changed feeds (*i)
- do nothing
- else
- mute if the change was -> solo OR demute if change was -> !solo
- */
-
if (route->feeds (*i, &via_sends_only)) {
(*i)->mod_solo_by_others_upstream (delta);
in_signal_flow = true;