summaryrefslogtreecommitdiff
path: root/libs/ardour/ardour/automation_control.h
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2017-07-30 02:34:14 +0200
committerRobin Gareus <robin@gareus.org>2017-07-30 02:42:55 +0200
commit6f80a5ba0fc7516a14492e357fe036a9bed5638d (patch)
treeef22e7a1ac6f48c33e90c032675934043fa6d508 /libs/ardour/ardour/automation_control.h
parentea48c56061aa7324b076ab01ee408005a46bae8e (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/automation_control.h')
-rw-r--r--libs/ardour/ardour/automation_control.h6
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;
};