diff options
author | Robin Gareus <robin@gareus.org> | 2016-04-24 13:07:07 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2016-04-24 14:43:18 +0200 |
commit | e3536fbefe21ae079ff6cb370852a161a3b90f53 (patch) | |
tree | 88551d54acf2559ecc09964c994aaf178b85c5f2 | |
parent | e3607a4c8bbe68714600cb3849abee0c20d0047c (diff) |
hand over automationlist undo state ownership (mem-leak)
-rw-r--r-- | libs/ardour/ardour/automation_list.h | 2 | ||||
-rw-r--r-- | libs/ardour/automation_list.cc | 13 |
2 files changed, 11 insertions, 4 deletions
diff --git a/libs/ardour/ardour/automation_list.h b/libs/ardour/ardour/automation_list.h index c437462be4..a57460c31b 100644 --- a/libs/ardour/ardour/automation_list.h +++ b/libs/ardour/ardour/automation_list.h @@ -119,7 +119,7 @@ class LIBARDOUR_API AutomationList : public PBD::StatefulDestructible, public Ev bool operator!= (const AutomationList &) const; - XMLNode* before () { return _before; } + XMLNode* before () { XMLNode* rv = _before; _before = 0; return rv; } void clear_history (); private: void create_curve_if_necessary (); diff --git a/libs/ardour/automation_list.cc b/libs/ardour/automation_list.cc index 636a1bbede..761aa31867 100644 --- a/libs/ardour/automation_list.cc +++ b/libs/ardour/automation_list.cc @@ -131,6 +131,7 @@ AutomationList::AutomationList (const XMLNode& node, Evoral::Parameter id) AutomationList::~AutomationList() { + delete _before; } boost::shared_ptr<Evoral::ControlList> @@ -192,8 +193,11 @@ AutomationList::set_automation_state (AutoState s) { if (s != _state) { _state = s; + delete _before; if (s == Write && _desc.toggled) { _before = &get_state (); + } else { + _before = 0; } automation_state_changed (s); /* EMIT SIGNAL */ } @@ -211,8 +215,11 @@ AutomationList::set_automation_style (AutoStyle s) void AutomationList::start_write_pass (double when) { + delete _before; if (in_new_write_pass ()) { _before = &get_state (); + } else { + _before = 0; } ControlList::start_write_pass (when); } @@ -221,8 +228,6 @@ 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; } void @@ -260,7 +265,9 @@ AutomationList::stop_touch (bool mark, double) /* _before may be owned by the undo stack, * so we have to be careful about doing this. -*/ + * + * ::before () transfers ownership, setting _before to 0 + */ void AutomationList::clear_history () { |