summaryrefslogtreecommitdiff
path: root/libs/ardour/lv2_plugin.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2017-09-09 03:07:01 +0200
committerRobin Gareus <robin@gareus.org>2017-09-09 03:08:46 +0200
commit7872e4033f236356f0b5a10d0a4eb889adca52d2 (patch)
tree4dfdca42959c925faa3f97d7544125a22b5c125a /libs/ardour/lv2_plugin.cc
parentb43fd4ad0e3b45dd44e0d5d28c6b696cfd16583e (diff)
LV2/midnam tweaks - fix race conditions
* Emit signal once midnam was actually updated * only re-read midnam if was it changed. This allows idempotent calls to read_midnam() - from the same thread. At session-load a synth-plugin may load a soundfont in the background and emit midnam_update() after the synth was initialized but before the GUI thread connects to the signal. By making the call idempotent the GUI can call read_midnam() after connecting to the signal to catch up.
Diffstat (limited to 'libs/ardour/lv2_plugin.cc')
-rw-r--r--libs/ardour/lv2_plugin.cc8
1 files changed, 7 insertions, 1 deletions
diff --git a/libs/ardour/lv2_plugin.cc b/libs/ardour/lv2_plugin.cc
index 5311136afc..b51db65485 100644
--- a/libs/ardour/lv2_plugin.cc
+++ b/libs/ardour/lv2_plugin.cc
@@ -241,6 +241,7 @@ void
LV2Plugin::midnam_update (LV2_Midnam_Handle handle)
{
LV2Plugin* plugin = (LV2Plugin*)handle;
+ plugin->_midnam_dirty = true;
plugin->UpdateMidnam (); /* EMIT SIGNAL */
}
@@ -590,6 +591,7 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate)
_midname_interface = (const LV2_Midnam_Interface*)
extension_data (LV2_MIDNAM__interface);
if (_midname_interface) {
+ _midnam_dirty = true;
read_midnam ();
}
#endif
@@ -1029,7 +1031,7 @@ LV2Plugin::has_midnam () {
bool
LV2Plugin::read_midnam () {
bool rv = false;
- if (!_midname_interface) {
+ if (!_midname_interface || !_midnam_dirty) {
return rv;
}
char* midnam = _midname_interface->midnam ((void*)_impl->instance->lv2_handle);
@@ -1047,6 +1049,10 @@ LV2Plugin::read_midnam () {
}
#endif
_midname_interface->free (midnam);
+ if (rv) {
+ UpdatedMidnam ();
+ _midnam_dirty = false;
+ }
return rv;
}