13
0

Clean up _before XMLNode in AutomationList if no automation write occurred.

This commit is contained in:
nick_m 2015-11-02 02:12:54 +11:00
parent 2d47196f43
commit 7ade596c92
5 changed files with 22 additions and 11 deletions

View 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:

View 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&);

View 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 ());

View 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 ();
}
}

View 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 ()
{