From 7872e4033f236356f0b5a10d0a4eb889adca52d2 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sat, 9 Sep 2017 03:07:01 +0200 Subject: 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. --- libs/ardour/lv2_plugin.cc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'libs/ardour/lv2_plugin.cc') 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; } -- cgit v1.2.3