DPF

DISTRHO Plugin Framework
Log | Files | Refs | Submodules | README | LICENSE

commit 67ce1ea28ebe95c41cafd760b0486e2df59627fe
parent 5a69a71bdf773c582b94fba62f56af286c5f7333
Author: falkTX <falktx@falktx.com>
Date:   Tue, 31 Jan 2023 11:46:22 +0100

modgui cleanup event

Signed-off-by: falkTX <falktx@falktx.com>

Diffstat:
Mdistrho/src/DistrhoPluginLV2export.cpp | 11+++++++++--
Mdistrho/src/DistrhoUILV2.cpp | 11++++++++---
2 files changed, 17 insertions(+), 5 deletions(-)

diff --git a/distrho/src/DistrhoPluginLV2export.cpp b/distrho/src/DistrhoPluginLV2export.cpp @@ -1346,11 +1346,11 @@ void lv2_generate_ttl(const char* const basename) jsString += "if(err.length!==0){e.icon.find('.canvas_wrapper').html('<h2>'+err.join('<br>')+'</h2>');return;}\n\n"; jsString += "var s=document.createElement('script');\n"; jsString += "s.setAttribute('async',true);\n"; - jsString += "s.setAttribute('src','/resources/module.js?uri='+escape(\"" DISTRHO_PLUGIN_URI "\")+'&r='+VERSION/*f.get_custom_resource_filename('module.js')*/);\n"; + jsString += "s.setAttribute('src',e.api_version>=3?f.get_custom_resource_filename('module.js'):('/resources/module.js?uri='+escape(\"" DISTRHO_PLUGIN_URI "\")+'&r='+VERSION));\n"; jsString += "s.setAttribute('type','text/javascript');\n"; jsString += "s.onload=function(){\n"; jsString += " Module_" DISTRHO_PLUGIN_MODGUI_CLASS_NAME "({\n"; - jsString += " locateFile: function(p,_){return '/resources/'+p+'?uri='+escape(\"" DISTRHO_PLUGIN_URI "\")+'&r='+VERSION/*return f.get_custom_resource_filename(p);*/},\n"; + jsString += " locateFile: function(p,_){return e.api_version>=3?f.get_custom_resource_filename(p):('/resources/'+p+'?uri='+escape(\"" DISTRHO_PLUGIN_URI "\")+'&r='+VERSION)},\n"; jsString += " postRun:function(m){\n"; jsString += " var cn=e.icon.attr('mod-instance').replaceAll('/','_');\n"; jsString += " var cnl=m.lengthBytesUTF8(cn) + 1;\n"; @@ -1395,6 +1395,13 @@ void lv2_generate_ttl(const char* const basename) jsString += " if(e.symbol===':bypass')return;\n"; jsString += " if(e.uri){e.data.p.p[e.uri]=e.value;}else{e.data.p.c[e.symbol]=e.value;}\n"; jsString += "}\n\n"; + jsString += "}else if(e.type==='end'){\n"; + jsString += " if(e.data.h && e.data.m){\n"; + jsString += " var h = e.data.h;\n"; + jsString += " var m = e.data.m;\n"; + jsString += " e.data.h = e.data.m = null;\n"; + jsString += " m._modgui_cleanup(h);\n"; + jsString += "}\n\n"; jsString += "}\n}\n"; jsFile << jsString; jsFile.close(); diff --git a/distrho/src/DistrhoUILV2.cpp b/distrho/src/DistrhoUILV2.cpp @@ -735,6 +735,7 @@ typedef void (*_custom_patch_set)(const char* uri, const char* value); struct ModguiHandle { LV2UI_Handle handle; + long loop_id; _custom_param_set param_set; _custom_patch_set patch_set; }; @@ -858,6 +859,7 @@ LV2UI_Handle modgui_init(const char* const className, _custom_param_set param_se ModguiHandle* const mhandle = new ModguiHandle; mhandle->handle = nullptr; + mhandle->loop_id = 0; mhandle->param_set = param_set; mhandle->patch_set = patch_set; @@ -872,7 +874,7 @@ LV2UI_Handle modgui_init(const char* const className, _custom_param_set param_se mhandle->handle = handle; static_cast<UiLv2*>(handle)->lv2ui_show(); - emscripten_set_interval(app_idle, 1000.0/60, handle); + mhandle->loop_id = emscripten_set_interval(app_idle, 1000.0/60, handle); return mhandle; } @@ -911,8 +913,11 @@ DISTRHO_PLUGIN_EXPORT void modgui_cleanup(const LV2UI_Handle handle) { d_stdout("cleanup"); - lv2ui_cleanup(static_cast<ModguiHandle*>(handle)->handle); - delete static_cast<ModguiHandle*>(handle); + ModguiHandle* const mhandle = static_cast<ModguiHandle*>(handle); + if (mhandle->loop_id != 0) + emscripten_clear_interval(mhandle->loop_id); + lv2ui_cleanup(mhandle->handle); + delete mhandle; } #endif