diff options
author | Robin Gareus <robin@gareus.org> | 2017-09-09 03:07:01 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2017-09-09 03:08:46 +0200 |
commit | 7872e4033f236356f0b5a10d0a4eb889adca52d2 (patch) | |
tree | 4dfdca42959c925faa3f97d7544125a22b5c125a /libs/ardour/lv2_plugin.cc | |
parent | b43fd4ad0e3b45dd44e0d5d28c6b696cfd16583e (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.cc | 8 |
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; } |