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
This commit is contained in:
Robin Gareus 2016-10-13 16:04:28 +02:00
parent c09e467595
commit 215d88ac87
3 changed files with 14 additions and 0 deletions

View File

@ -92,6 +92,7 @@ public:
uint32_t auto_end;
uint32_t auto_parameter;
uint32_t auto_value;
uint32_t state_Dirty;
#endif
};

View File

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

View File

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