From 215d88ac87aea8d9c30c86614c2ebe0f4bf57f20 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Thu, 13 Oct 2016 16:04:28 +0200 Subject: Allow a LV2 plugin to mark the session dirty If some plugin-internal state changes (GUI <> Plugin e.g. load a sample) no ports change and the host does not know that the plugin state has changed. The session may be closed without save. This is a prototype using an ardour.org URI, pending upstream lv2plug.in --- libs/ardour/ardour/uri_map.h | 1 + libs/ardour/lv2_plugin.cc | 12 ++++++++++++ libs/ardour/uri_map.cc | 1 + 3 files changed, 14 insertions(+) diff --git a/libs/ardour/ardour/uri_map.h b/libs/ardour/ardour/uri_map.h index 460aa99773..9b831bea6a 100644 --- a/libs/ardour/ardour/uri_map.h +++ b/libs/ardour/ardour/uri_map.h @@ -92,6 +92,7 @@ public: uint32_t auto_end; uint32_t auto_parameter; uint32_t auto_value; + uint32_t state_Dirty; #endif }; diff --git a/libs/ardour/lv2_plugin.cc b/libs/ardour/lv2_plugin.cc index 2d19ea9458..717e933ebf 100644 --- a/libs/ardour/lv2_plugin.cc +++ b/libs/ardour/lv2_plugin.cc @@ -2692,6 +2692,18 @@ LV2Plugin::connect_and_run(BufferSet& bufs, } } } + + // Intercept state dirty message + if (_has_state_interface /* && (flags & PORT_DIRTYMSG)*/) { + LV2_Atom* atom = (LV2_Atom*)(data - sizeof(LV2_Atom)); + if (atom->type == _uri_map.urids.atom_Blank || + atom->type == _uri_map.urids.atom_Object) { + LV2_Atom_Object* obj = (LV2_Atom_Object*)atom; + if (obj->body.otype == _uri_map.urids.state_Dirty) { + _session.set_dirty (); + } + } + } #endif // Intercept patch change messages to emit PropertyChanged signal diff --git a/libs/ardour/uri_map.cc b/libs/ardour/uri_map.cc index 4bdb405a0e..c8af409506 100644 --- a/libs/ardour/uri_map.cc +++ b/libs/ardour/uri_map.cc @@ -70,6 +70,7 @@ URIMap::URIDs::init(URIMap& uri_map) auto_end = uri_map.uri_to_id(LV2_AUTOMATE_URI__end); auto_parameter = uri_map.uri_to_id(LV2_AUTOMATE_URI__parameter); auto_value = uri_map.uri_to_id(LV2_AUTOMATE_URI__value); + state_Dirty = uri_map.uri_to_id("http://ardour.org/lv2/state#Dirty"); // XXX http://lv2plug.in/ns/ext/state/#dirty #endif } -- cgit v1.2.3