Clean up _before XMLNode in AutomationList if no automation write occurred.
authornick_m <mainsbridge@gmail.com>
Sun, 1 Nov 2015 15:12:54 +0000 (02:12 +1100)
committernick_m <mainsbridge@gmail.com>
Sun, 1 Nov 2015 15:12:54 +0000 (02:12 +1100)
libs/ardour/ardour/automation_control.h
libs/ardour/ardour/automation_list.h
libs/ardour/automatable.cc
libs/ardour/automation_control.cc
libs/ardour/automation_list.cc

index 9190b716774d5ffbe17760a891c5b70b628e4c08..b26d781e2fd98b739895d750d48deeeebba2db04 100644 (file)
@@ -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:
 
index 67ee6234bb1ddcb5fff810a1e1f115ad67d3ce31..37a30acd0305c28b9600a17525447441e6b4cd2e 100644 (file)
@@ -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&);
index 27ac7d84016b515851f07697c9c05271289d85f5..9670f68689355d838804025beb2daae8cff6204c 100644 (file)
@@ -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 ());
 
index 671cd6e977b899f24e17b05e4871dcceac2ecd2b..1f507b701513b7d58b3e8c8dedad3c88f51864b3 100644 (file)
@@ -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 ();
        }
 }
 
index afff85c1f83d63afbde9f665399ec89d96e10aa3..9d8bfffc938e028dbba643b11d271102e4cee3b8 100644 (file)
@@ -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 ()
 {