From a1b4f9b8abf2887b17bce05403ea7eab2421f26a Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Fri, 9 Jun 2017 22:54:09 +0200 Subject: Fix deletion of VCA with slaved controls. The crashed previously because: A VCA is-a Automatable is-a Evoral::ControlSet After VCA's d'tor completes ~Automatable runs and emits signal to DropReferences of all master-controls. This in turn calls SlavableAutomationControl::master_going_away() for slaved parameters for the given master-control In ::master_going_away() the weak-pointer reference to the master's AutomationControl (owned by the destroyed VCA) is still valid. Execution is in the d'tor of Automatable which is-a ControlSet and the ContolSet keeps a reference to the Control and hence also to the AutomationControl which is-a Evoral::Control. So master_going_away() locks a boost::shared_ptr which is actually the MuteControl owned by the VCA. It calls SlavableAutomationControl::remove_master() which in turn calls MuteControl::pre_remove_master() which uses the MuteMaster API to retrieve the value. The MuteMaster however is the VCA that has just been destroyed. The solution is twofold: 1) emit "drop_references" from the VCA d'tor itself, before the VCA is destroyed. 2) disconnect a slaved control from the master's drop_references signal when un-assigning a master-control. --- libs/ardour/ardour/automation_control.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'libs/ardour/ardour/automation_control.h') diff --git a/libs/ardour/ardour/automation_control.h b/libs/ardour/ardour/automation_control.h index cb3b6085f4..e338cb13c1 100644 --- a/libs/ardour/ardour/automation_control.h +++ b/libs/ardour/ardour/automation_control.h @@ -62,7 +62,7 @@ class LIBARDOUR_API AutomationControl PBD::Controllable::Flag flags=PBD::Controllable::Flag (0) ); - ~AutomationControl (); + virtual ~AutomationControl (); boost::shared_ptr alist() const { return boost::dynamic_pointer_cast(_list); -- cgit v1.2.3