From 7ade596c92b00eae871e8f2f5b5d6e0d1ebd93d7 Mon Sep 17 00:00:00 2001 From: nick_m Date: Mon, 2 Nov 2015 02:12:54 +1100 Subject: Clean up _before XMLNode in AutomationList if no automation write occurred. --- libs/ardour/ardour/automation_control.h | 2 +- libs/ardour/ardour/automation_list.h | 1 + libs/ardour/automatable.cc | 4 +--- libs/ardour/automation_control.cc | 12 ++++++++---- libs/ardour/automation_list.cc | 14 +++++++++++--- 5 files changed, 22 insertions(+), 11 deletions(-) (limited to 'libs') diff --git a/libs/ardour/ardour/automation_control.h b/libs/ardour/ardour/automation_control.h index 9190b71677..b26d781e2f 100644 --- a/libs/ardour/ardour/automation_control.h +++ b/libs/ardour/ardour/automation_control.h @@ -107,7 +107,7 @@ public: const ParameterDescriptor& desc() const { return _desc; } const ARDOUR::Session& session() const { return _session; } - void commit_transaction (); + void commit_transaction (bool did_write); protected: diff --git a/libs/ardour/ardour/automation_list.h b/libs/ardour/ardour/automation_list.h index 67ee6234bb..37a30acd03 100644 --- a/libs/ardour/ardour/automation_list.h +++ b/libs/ardour/ardour/automation_list.h @@ -114,6 +114,7 @@ class LIBARDOUR_API AutomationList : public PBD::StatefulDestructible, public Ev bool operator!= (const AutomationList &) const; XMLNode* before () { return _before; } + void clear_history (); private: void create_curve_if_necessary (); int deserialize_events (const XMLNode&); diff --git a/libs/ardour/automatable.cc b/libs/ardour/automatable.cc index 27ac7d8401..9670f68689 100644 --- a/libs/ardour/automatable.cc +++ b/libs/ardour/automatable.cc @@ -398,9 +398,7 @@ Automatable::transport_stopped (framepos_t now) l->stop_touch (true, now); - if (list_did_write) { - c->commit_transaction (); - } + c->commit_transaction (list_did_write); l->write_pass_finished (now, Config->get_automation_thinning_factor ()); diff --git a/libs/ardour/automation_control.cc b/libs/ardour/automation_control.cc index 671cd6e977..1f507b7015 100644 --- a/libs/ardour/automation_control.cc +++ b/libs/ardour/automation_control.cc @@ -163,11 +163,15 @@ AutomationControl::stop_touch(bool mark, double when) } void -AutomationControl::commit_transaction () +AutomationControl::commit_transaction (bool did_write) { - if (alist ()->before ()) { - _session.begin_reversible_command (string_compose (_("record %1 automation"), name ())); - _session.commit_reversible_command (new MementoCommand (*alist ().get (), alist ()->before (), &alist ()->get_state ())); + if (did_write) { + if (alist ()->before ()) { + _session.begin_reversible_command (string_compose (_("record %1 automation"), name ())); + _session.commit_reversible_command (new MementoCommand (*alist ().get (), alist ()->before (), &alist ()->get_state ())); + } + } else { + alist ()->clear_history (); } } diff --git a/libs/ardour/automation_list.cc b/libs/ardour/automation_list.cc index afff85c1f8..9d8bfffc93 100644 --- a/libs/ardour/automation_list.cc +++ b/libs/ardour/automation_list.cc @@ -191,9 +191,6 @@ AutomationList::set_automation_state (AutoState s) { if (s != _state) { _state = s; - if (s == Write) { - _before = &get_state (); - } automation_state_changed (s); /* EMIT SIGNAL */ } } @@ -220,6 +217,7 @@ void AutomationList::write_pass_finished (double when, double thinning_factor) { ControlList::write_pass_finished (when, thinning_factor); + /* automation control has deleted this or it is now owned by the session undo stack */ _before = 0; } @@ -256,6 +254,16 @@ AutomationList::stop_touch (bool mark, double) } } +/* _before may be owned by the undo stack, + * so we have to be careful about doing this. +*/ +void +AutomationList::clear_history () +{ + delete _before; + _before = 0; +} + void AutomationList::thaw () { -- cgit v1.2.3