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.
This commit is contained in:
Robin Gareus 2016-09-21 03:45:57 +02:00
parent ad0aef7dce
commit 1acfb11cb6
2 changed files with 12 additions and 2 deletions

View File

@ -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;

View File

@ -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