* 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.
bool has_midnam ();
bool read_midnam ();
std::string midnam_model ();
bool has_midnam ();
bool read_midnam ();
std::string midnam_model ();
#endif
void latency_compute_run ();
#endif
void latency_compute_run ();
virtual bool read_midnam () { return false; }
virtual std::string midnam_model () { return ""; }
PBD::Signal0<void> UpdateMidnam;
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; }
virtual bool knows_bank_patch () { return false; }
virtual uint32_t bank_patch (uint8_t chn) { return UINT32_MAX; }
LV2Plugin::midnam_update (LV2_Midnam_Handle handle)
{
LV2Plugin* plugin = (LV2Plugin*)handle;
LV2Plugin::midnam_update (LV2_Midnam_Handle handle)
{
LV2Plugin* plugin = (LV2Plugin*)handle;
+ plugin->_midnam_dirty = true;
plugin->UpdateMidnam (); /* EMIT SIGNAL */
}
plugin->UpdateMidnam (); /* EMIT SIGNAL */
}
_midname_interface = (const LV2_Midnam_Interface*)
extension_data (LV2_MIDNAM__interface);
if (_midname_interface) {
_midname_interface = (const LV2_Midnam_Interface*)
extension_data (LV2_MIDNAM__interface);
if (_midname_interface) {
bool
LV2Plugin::read_midnam () {
bool rv = false;
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);
return rv;
}
char* midnam = _midname_interface->midnam ((void*)_impl->instance->lv2_handle);
}
#endif
_midname_interface->free (midnam);
}
#endif
_midname_interface->free (midnam);
+ if (rv) {
+ UpdatedMidnam ();
+ _midnam_dirty = false;
+ }