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.
This commit is contained in:
@@ -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 ();
|
||||
|
||||
@@ -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<void> UpdateMidnam;
|
||||
PBD::Signal0<void> UpdatedMidnam;
|
||||
|
||||
virtual bool knows_bank_patch () { return false; }
|
||||
virtual uint32_t bank_patch (uint8_t chn) { return UINT32_MAX; }
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user