DISTRHO Plugin Framework
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

108 lines
4.9KB

  1. function(event, funcs) {
  2. 'use strict';
  3. if (event.type === 'start')
  4. {
  5. window.icon = event.icon;
  6. var wasmErrors = [];
  7. if (typeof(WebAssembly) === "undefined") {
  8. wasmErrors.push('WebAssembly unsupported');
  9. } else {
  10. if (!WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,3,1,0,1,10,14,1,12,0,65,0,65,0,65,0,252,10,0,0,11]))) {
  11. wasmErrors.push('Bulk Memory Operations unsupported');
  12. }
  13. if (!WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,8,1,6,0,6,64,25,11,11]))) {
  14. wasmErrors.push('Exception handling unsupported');
  15. }
  16. if (!WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,2,8,1,1,97,1,98,3,127,1,6,6,1,127,1,65,0,11,7,5,1,1,97,3,1]))) {
  17. wasmErrors.push('Importable/Exportable mutable globals unsupported');
  18. }
  19. if (!WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11]))) {
  20. wasmErrors.push('Fixed-Width SIMD unsupported');
  21. }
  22. }
  23. if (wasmErrors.length !== 0) {
  24. // errors wasmErrors.join('<br>')
  25. return;
  26. }
  27. event.data.pendingChanges = {};
  28. var src = document.createElement('script');
  29. src.setAttribute('async', true);
  30. src.setAttribute('src',
  31. '/effect/file/custom?filename=module.js&uri='+escape("urn:distrho:examples:imguisimplegain")+'&r='+VERSION
  32. // funcs.get_custom_resource_filename('module.js')
  33. );
  34. src.setAttribute('type', 'text/javascript');
  35. src.onload = function() {
  36. Module_mod_wasm_example({
  37. locateFile: function(path, prefix) {
  38. return '/effect/file/custom?filename='+path+'&uri='+escape("urn:distrho:examples:imguisimplegain")+'&r='+VERSION
  39. // return funcs.get_custom_resource_filename(path);
  40. },
  41. postRun: function(module) {
  42. // unique class name per instance
  43. window.module = module;
  44. var className = event.icon.attr("mod-instance").replaceAll('/','_');
  45. var classNameLen = module.lengthBytesUTF8(className) + 1;
  46. var classNameAlloc = module._malloc(classNameLen);
  47. module.stringToUTF8(className, classNameAlloc, classNameLen);
  48. event.icon.find('canvas')[0].id = className;
  49. // wasm to JS callbacks
  50. var cb = module.addFunction(function(index, value) {
  51. funcs.set_port_value("gain" /*funcs.get_port_symbol_for_index(index)*/, value);
  52. }, 'vif');
  53. // create handle
  54. var handle = module._modgui_init(classNameAlloc, cb);
  55. event.data.handle = handle;
  56. event.data.module = module;
  57. // force a resize
  58. window.dispatchEvent(new Event('resize'));
  59. // handle parameter changes received while wasm was being loaded
  60. for (var symbol in event.data.pendingChanges) {
  61. event.data.module._modgui_param(event.data.handle,
  62. 4 /*funcs.get_port_index_for_symbol(event.symbol)*/,
  63. event.data.pendingChanges[symbol]);
  64. }
  65. event.data.pendingChanges = null;
  66. // cleanup
  67. module._free(classNameAlloc);
  68. },
  69. canvas: (function() {
  70. var canvas = event.icon.find('canvas')[0];
  71. // As a default initial behavior, pop up an alert when webgl context is lost. To make your
  72. // application robust, you may want to override this behavior before shipping!
  73. // See http://www.khronos.org/registry/webgl/specs/latest/1.0/#5.15.2
  74. canvas.addEventListener('webglcontextlost', function(e) {
  75. alert('WebGL context lost. You will need to reload the page.');
  76. e.preventDefault();
  77. }, false);
  78. return canvas;
  79. })(),
  80. });
  81. };
  82. document.head.appendChild(src);
  83. }
  84. else if (event.type === 'change')
  85. {
  86. if (event.data.handle && event.data.module) {
  87. event.data.module._modgui_param(event.data.handle,
  88. 4 /*funcs.get_port_index_for_symbol(event.symbol)*/,
  89. event.value);
  90. } else {
  91. event.data.pendingChanges[event.symbol] = event.value;
  92. }
  93. }
  94. }