From: Robin Gareus Date: Sat, 9 Sep 2017 01:07:01 +0000 (+0200) Subject: LV2/midnam tweaks - fix race conditions X-Git-Tag: 5.12~16 X-Git-Url: https://main.carlh.net/gitweb/?p=ardour.git;a=commitdiff_plain;h=7872e4033f236356f0b5a10d0a4eb889adca52d2 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. --- diff --git a/libs/ardour/ardour/lv2_plugin.h b/libs/ardour/ardour/lv2_plugin.h index d4b6ca819f..c3d437b6f7 100644 --- a/libs/ardour/ardour/lv2_plugin.h +++ b/libs/ardour/ardour/lv2_plugin.h @@ -344,6 +344,7 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee bool has_midnam (); bool read_midnam (); std::string midnam_model (); + bool _midnam_dirty; #endif void latency_compute_run (); diff --git a/libs/ardour/ardour/plugin.h b/libs/ardour/ardour/plugin.h index 52fbc71c68..f51f34b099 100644 --- a/libs/ardour/ardour/plugin.h +++ b/libs/ardour/ardour/plugin.h @@ -182,6 +182,7 @@ class LIBARDOUR_API Plugin : public PBD::StatefulDestructible, public Latent virtual bool read_midnam () { return false; } virtual std::string midnam_model () { return ""; } PBD::Signal0 UpdateMidnam; + PBD::Signal0 UpdatedMidnam; virtual bool knows_bank_patch () { return false; } virtual uint32_t bank_patch (uint8_t chn) { return UINT32_MAX; } 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; }