summaryrefslogtreecommitdiff
path: root/libs/ardour/automation_control.cc
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/automation_control.cc
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/automation_control.cc')
-rw-r--r--libs/ardour/automation_control.cc19
1 files changed, 14 insertions, 5 deletions
diff --git a/libs/ardour/automation_control.cc b/libs/ardour/automation_control.cc
index 1c4525470b..7deeac4221 100644
--- a/libs/ardour/automation_control.cc
+++ b/libs/ardour/automation_control.cc
@@ -56,8 +56,9 @@ AutomationControl::AutomationControl(ARDOUR::Session& s
: Controllable (name.empty() ? EventTypeMap::instance().to_symbol(parameter) : name, flags)
, Evoral::Control(parameter, desc, list)
- , _session(session)
+ , SessionHandleRef (session)
, _desc(desc)
+ , _no_session(false)
{
if (_desc.toggled) {
set_flags (Controllable::Toggle);
@@ -70,10 +71,18 @@ AutomationControl::AutomationControl(ARDOUR::Session& s
AutomationControl::~AutomationControl ()
{
- if (!_session.deletion_in_progress ()) {
+ if (!_no_session && !_session.deletion_in_progress ()) {
_session.selection().remove_control_by_id (id());
+ DropReferences (); /* EMIT SIGNAL */
}
+}
+
+void
+AutomationControl::session_going_away ()
+{
+ SessionHandleRef::session_going_away ();
DropReferences (); /* EMIT SIGNAL */
+ _no_session = true;
}
bool
@@ -90,7 +99,7 @@ AutomationControl::writable() const
double
AutomationControl::get_value() const
{
- bool from_list = _list && boost::dynamic_pointer_cast<AutomationList>(_list)->automation_playback();
+ bool from_list = alist() && alist()->automation_playback();
return Control::get_double (from_list, _session.transport_frame());
}
@@ -176,7 +185,7 @@ AutomationControl::automation_run (framepos_t start, pframes_t nframes)
void
AutomationControl::actually_set_value (double value, PBD::Controllable::GroupControlDisposition gcd)
{
- boost::shared_ptr<AutomationList> al = boost::dynamic_pointer_cast<AutomationList> (_list);
+ boost::shared_ptr<AutomationList> al = alist ();
const framepos_t pos = _session.transport_frame();
bool to_list;
@@ -232,7 +241,7 @@ AutomationControl::set_automation_state (AutoState as)
if (flags() & NotAutomatable) {
return;
}
- if (_list && as != alist()->automation_state()) {
+ if (alist() && as != alist()->automation_state()) {
const double val = get_value ();