diff options
author | Robin Gareus <robin@gareus.org> | 2017-07-30 02:34:14 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2017-07-30 02:42:55 +0200 |
commit | 6f80a5ba0fc7516a14492e357fe036a9bed5638d (patch) | |
tree | ef22e7a1ac6f48c33e90c032675934043fa6d508 /libs/ardour/ardour | |
parent | ea48c56061aa7324b076ab01ee408005a46bae8e (diff) |
Turn AutomationCtrl into a SessionHandleRef
This fixes a crash with GUI elements which are only deleted during GUI
Idle and hold a Reference to a Controllable,
The session is already destroyed at that point:
ARDOUR::CoreSelection::remove_control_by_id(PBD::ID const&)
ARDOUR::AutomationControl::~AutomationControl()
ARDOUR::SlavableAutomationControl::~SlavableAutomationControl()
ARDOUR::MonitorControl::~MonitorControl()
boost::detail::sp_counted_base::destroy()
boost::detail::sp_counted_impl_p<AudioGrapher::Interleaver<float>::Input>::dispose()
boost::detail::sp_counted_base::release()
boost::detail::shared_count::~shared_count()
boost::shared_ptr<PBD::Controllable>::~shared_ptr()
boost::shared_ptr<PBD::Connection>::~shared_ptr()
ArdourWidgets::BindingProxy::~BindingProxy()
ArdourWidgets::ArdourButton::~ArdourButton()
VCAMasterStrip::~VCAMasterStrip()
int idle_delete<VCAMasterStrip>(VCAMasterStrip*)
Diffstat (limited to 'libs/ardour/ardour')
-rw-r--r-- | libs/ardour/ardour/automation_control.h | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/libs/ardour/ardour/automation_control.h b/libs/ardour/ardour/automation_control.h index 6ffcb3b866..e875ea98a6 100644 --- a/libs/ardour/ardour/automation_control.h +++ b/libs/ardour/ardour/automation_control.h @@ -36,6 +36,7 @@ #include "ardour/automation_list.h" #include "ardour/control_group_member.h" #include "ardour/parameter_descriptor.h" +#include "ardour/session_handle.h" #include "ardour/libardour_visibility.h" @@ -52,6 +53,7 @@ class LIBARDOUR_API AutomationControl , public Evoral::Control , public boost::enable_shared_from_this<AutomationControl> , public ControlGroupMember + , public SessionHandleRef { public: AutomationControl(ARDOUR::Session&, @@ -124,7 +126,6 @@ public: ControlList grouped_controls () const; protected: - ARDOUR::Session& _session; boost::shared_ptr<ControlGroup> _group; const ParameterDescriptor _desc; @@ -147,6 +148,8 @@ protected: /* this will be invoked in turn on behalf of the group or the control by itself */ virtual void do_pre_realtime_queue_stuff (double new_value) {} + void session_going_away (); + private: /* I am unclear on why we have to make ControlGroup a friend in order to get access to the ::set_group() method when it is already @@ -155,6 +158,7 @@ private: friend class ControlGroup; void set_group (boost::shared_ptr<ControlGroup>); PBD::ScopedConnection _state_changed_connection; + bool _no_session; }; |