summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornick_m <mainsbridge@gmail.com>2015-11-02 02:12:54 +1100
committernick_m <mainsbridge@gmail.com>2015-11-02 02:12:54 +1100
commit7ade596c92b00eae871e8f2f5b5d6e0d1ebd93d7 (patch)
tree447de9dc0885f72674ce6b56145791fa6820310a
parent2d47196f4305c28fe9c9116b0b890f1c48b99508 (diff)
Clean up _before XMLNode in AutomationList if no automation write occurred.
-rw-r--r--libs/ardour/ardour/automation_control.h2
-rw-r--r--libs/ardour/ardour/automation_list.h1
-rw-r--r--libs/ardour/automatable.cc4
-rw-r--r--libs/ardour/automation_control.cc12
-rw-r--r--libs/ardour/automation_list.cc14
5 files changed, 22 insertions, 11 deletions
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<AutomationList> (*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<AutomationList> (*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 ()
{