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:
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