summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2015-10-07 13:08:53 +0200
committerRobin Gareus <robin@gareus.org>2015-10-07 14:21:30 +0200
commit44f1f0caf49ff8c4fa7e656606b141bdab0276da (patch)
treef02a9c8898c0a4f50c67baf27e839a0bb5fc25d9
parent96b45d49099069981109d8f3f292ad1024649f61 (diff)
fix exclusive solo group-override
-rw-r--r--libs/ardour/ardour/session.h4
-rw-r--r--libs/ardour/route.cc5
-rw-r--r--libs/ardour/session.cc16
3 files changed, 16 insertions, 9 deletions
diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h
index 4e9be4d02e..054862ce8a 100644
--- a/libs/ardour/ardour/session.h
+++ b/libs/ardour/ardour/session.h
@@ -1536,9 +1536,9 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
/* mixer stuff */
- void route_listen_changed (bool leave_group_alone, boost::weak_ptr<Route>);
+ void route_listen_changed (bool group_override, boost::weak_ptr<Route>);
void route_mute_changed (void *src);
- void route_solo_changed (bool self_solo_change, bool leave_group_alone, boost::weak_ptr<Route>);
+ void route_solo_changed (bool self_solo_change, bool group_override, boost::weak_ptr<Route>);
void route_solo_isolated_changed (void *src, boost::weak_ptr<Route>);
void update_route_solo_state (boost::shared_ptr<RouteList> r = boost::shared_ptr<RouteList>());
diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc
index eb98a2388f..ca01b597c0 100644
--- a/libs/ardour/route.cc
+++ b/libs/ardour/route.cc
@@ -791,7 +791,7 @@ Route::set_listen (bool yn, void* src, bool group_override)
}
_mute_master->set_soloed_by_others (false);
- listen_changed (src, group_active); /* EMIT SIGNAL */
+ listen_changed (src, group_override); /* EMIT SIGNAL */
}
}
}
@@ -870,7 +870,6 @@ Route::set_solo (bool yn, void *src, bool group_override)
return;
}
- // explicit XOR
bool group_active = _route_group && _route_group->is_active() && _route_group->is_solo();
if (group_override && _route_group) {
group_active = !group_active;
@@ -886,7 +885,7 @@ Route::set_solo (bool yn, void *src, bool group_override)
if (self_soloed() != yn) {
set_self_solo (yn);
set_mute_master_solo ();
- solo_changed (true, src, group_active); /* EMIT SIGNAL */
+ solo_changed (true, src, group_override); /* EMIT SIGNAL */
_solo_control->Changed (); /* EMIT SIGNAL */
}
diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc
index e22fe57c99..479b433f29 100644
--- a/libs/ardour/session.cc
+++ b/libs/ardour/session.cc
@@ -3490,7 +3490,7 @@ Session::route_mute_changed (void* /*src*/)
}
void
-Session::route_listen_changed (bool leave_group_alone, boost::weak_ptr<Route> wpr)
+Session::route_listen_changed (bool group_override, boost::weak_ptr<Route> wpr)
{
boost::shared_ptr<Route> route = wpr.lock();
if (!route) {
@@ -3503,12 +3503,16 @@ Session::route_listen_changed (bool leave_group_alone, boost::weak_ptr<Route> wp
if (Config->get_exclusive_solo()) {
/* new listen: disable all other listen, except solo-grouped channels */
RouteGroup* rg = route->route_group ();
+ bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
+ if (group_override && rg) {
+ leave_group_alone = !leave_group_alone;
+ }
boost::shared_ptr<RouteList> r = routes.reader ();
for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() || (leave_group_alone && ((*i)->route_group() == rg))) {
continue;
}
- (*i)->set_listen (false, this);
+ (*i)->set_listen (false, this, group_override);
}
}
@@ -3552,7 +3556,7 @@ Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
}
void
-Session::route_solo_changed (bool self_solo_change, bool leave_group_alone, boost::weak_ptr<Route> wpr)
+Session::route_solo_changed (bool self_solo_change, bool group_override, boost::weak_ptr<Route> wpr)
{
DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
@@ -3574,6 +3578,10 @@ Session::route_solo_changed (bool self_solo_change, bool leave_group_alone, boo
}
RouteGroup* rg = route->route_group ();
+ bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
+ if (group_override && rg) {
+ leave_group_alone = !leave_group_alone;
+ }
if (delta == 1 && Config->get_exclusive_solo()) {
/* new solo: disable all other solos, but not the group if its solo-enabled */
@@ -3583,7 +3591,7 @@ Session::route_solo_changed (bool self_solo_change, bool leave_group_alone, boo
(leave_group_alone && ((*i)->route_group() == rg))) {
continue;
}
- (*i)->set_solo (false, this);
+ (*i)->set_solo (false, this, group_override);
}
}