From 1acfb11cb663dbda25ec1f9fa920008171559ad9 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 21 Sep 2016 03:45:57 +0200 Subject: [PATCH] add a static flag to force writing LV2 state This is needed for save-as and archiving, LV2 state may not be saved otherwise if lilv_state_equals() returns true. Also if thestate is saved as part of save-as or archiving or template, the state-version did increase. Upcoming normal save will reference a plugin state that does not exist in the current session bundle. --- libs/ardour/ardour/lv2_plugin.h | 2 ++ libs/ardour/lv2_plugin.cc | 12 ++++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/libs/ardour/ardour/lv2_plugin.h b/libs/ardour/ardour/lv2_plugin.h index 269c158714..a1e38fda32 100644 --- a/libs/ardour/ardour/lv2_plugin.h +++ b/libs/ardour/ardour/lv2_plugin.h @@ -63,6 +63,8 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee LV2Plugin (const LV2Plugin &); ~LV2Plugin (); + static bool force_state_save; + std::string unique_id () const; const char* uri () const; const char* label () const; diff --git a/libs/ardour/lv2_plugin.cc b/libs/ardour/lv2_plugin.cc index 25ae65e17b..2d19ea9458 100644 --- a/libs/ardour/lv2_plugin.cc +++ b/libs/ardour/lv2_plugin.cc @@ -109,6 +109,8 @@ using namespace std; using namespace ARDOUR; using namespace PBD; +bool LV2Plugin::force_state_save = false; + class LV2World : boost::noncopyable { public: LV2World (); @@ -1248,7 +1250,7 @@ LV2Plugin::add_state(XMLNode* root) const 0, NULL); - if (!_plugin_state_dir.empty() + if (!_plugin_state_dir.empty() || force_state_save || !_impl->state || !lilv_state_equals(state, _impl->state)) { lilv_state_save(_world.world, @@ -1259,13 +1261,19 @@ LV2Plugin::add_state(XMLNode* root) const new_dir.c_str(), "state.ttl"); - if (_plugin_state_dir.empty()) { + if (force_state_save) { + // archive or save-as + lilv_state_free(state); + --_state_version; + } + else if (_plugin_state_dir.empty()) { // normal session save lilv_state_free(_impl->state); _impl->state = state; } else { // template save (dedicated state-dir) lilv_state_free(state); + --_state_version; } } else { // State is identical, decrement version and nuke directory