From 58d59177bbc0cc936d80efd5ec2e0a8ed368c106 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Mon, 5 Oct 2015 00:08:55 +0200 Subject: fix various stuck-solo cases: * solo groups * cancel-solo * SIP <> AFL/PFL changes The optimized plural-form route_solo_changed() relied on the false premise that solo-groups and port-connections are disjoint sets. -=- e.g. "cancel all solo" calls set_solo(get_routes(), false); Since All routes are affected, the "non_solo_change" set is empty, and no changes were propagated up/downstream. Routes that indirectly change state as group-members, wrongly end up in the "non_solo_change" list instead of the "solo_change" list. If a route feeds another in the same group, no changes were propagated. --- libs/ardour/session_rtevents.cc | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'libs/ardour/session_rtevents.cc') diff --git a/libs/ardour/session_rtevents.cc b/libs/ardour/session_rtevents.cc index 5e20421cca..db334932f1 100644 --- a/libs/ardour/session_rtevents.cc +++ b/libs/ardour/session_rtevents.cc @@ -62,18 +62,17 @@ Session::set_solo (boost::shared_ptr rl, bool yn, SessionEvent::RTeve void Session::rt_set_solo (boost::shared_ptr rl, bool yn, bool /* group_override */) { - solo_update_disabled = true; - for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) { if (!(*i)->is_auditioner()) { (*i)->set_solo (yn, this); } } - solo_update_disabled = false; - routes_solo_changed (rl); - set_dirty(); + /* XXX boost::shared_ptr goes out of scope here and is likley free()ed in RT context + * because boost's shared_ptr does reference counting and free/delete in the dtor. + * (this also applies to other rt_ methods here) + */ } void -- cgit v1.2.3