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.

154 lines
6.2KB

  1. function(event, funcs) {
  2. 'use strict';
  3. var portsSymbols = [
  4. // NOTE fill me!
  5. ];
  6. if (event.type === 'start')
  7. {
  8. var wasmErrors = [];
  9. if (typeof(WebAssembly) === "undefined") {
  10. wasmErrors.push('WebAssembly unsupported');
  11. } else {
  12. 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]))) {
  13. wasmErrors.push('Bulk Memory Operations unsupported');
  14. }
  15. 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]))) {
  16. wasmErrors.push('Importable/Exportable mutable globals unsupported');
  17. }
  18. }
  19. if (wasmErrors.length !== 0) {
  20. // errors wasmErrors.join('<br>')
  21. return;
  22. }
  23. event.data.pendingChanges = {
  24. patch: {},
  25. ports: {},
  26. };
  27. var src = document.createElement('script');
  28. src.setAttribute('async', true);
  29. src.setAttribute('src',
  30. '/resources/module.js?uri='+escape(@DISTRHO_PLUGIN_URI@)+'&r='+VERSION
  31. // funcs.get_custom_resource_filename('module.js')
  32. );
  33. src.setAttribute('type', 'text/javascript');
  34. src.onload = function() {
  35. Module_@PLUGIN_CLASS@({
  36. locateFile: function(path, prefix) {
  37. return '/resources/'+path+'?uri='+escape(@DISTRHO_PLUGIN_URI@)+'&r='+VERSION
  38. // return funcs.get_custom_resource_filename(path);
  39. },
  40. postRun: function(module) {
  41. // unique class name per instance
  42. var className = event.icon.attr("mod-instance").replaceAll('/','_');
  43. var classNameLen = module.lengthBytesUTF8(className) + 1;
  44. var classNameAlloc = module._malloc(classNameLen);
  45. module.stringToUTF8(className, classNameAlloc, classNameLen);
  46. event.icon.find('canvas')[0].id = className;
  47. // wasm to JS callbacks
  48. var cb1 = module.addFunction(function(index, value) {
  49. funcs.set_port_value(portsSymbols[index], value);
  50. }, 'vif');
  51. var cb2 = module.addFunction(function(uri, value) {
  52. var jsuri = module.UTF8ToString(uri);
  53. var jsvalue = module.UTF8ToString(value);
  54. funcs.patch_set(jsuri, 's', jsvalue);
  55. }, 'vpp');
  56. // create handle
  57. var handle = module._modgui_init(classNameAlloc, cb1, cb2);
  58. event.data.handle = handle;
  59. event.data.module = module;
  60. // handle parameter changes received while wasm was being loaded
  61. for (var uri in event.data.pendingChanges.patch) {
  62. var uriLen = module.lengthBytesUTF8(uri) + 1;
  63. var uriAlloc = module._malloc(uriLen);
  64. module.stringToUTF8(uri, uriAlloc, uriLen);
  65. var value = event.data.pendingChanges.patch[uri];
  66. var valueLen = module.lengthBytesUTF8(value) + 1;
  67. var valueAlloc = module._malloc(valueLen);
  68. module.stringToUTF8(value, valueAlloc, valueLen);
  69. module._modgui_patch_set(handle, uriAlloc, valueAlloc);
  70. module._free(uriAlloc);
  71. module._free(valueAlloc);
  72. }
  73. for (var symbol in event.data.pendingChanges.ports) {
  74. module._modgui_param_set(handle,
  75. portsSymbols.indexOf(event.symbol),
  76. event.data.pendingChanges.ports[symbol]);
  77. }
  78. event.data.pendingChanges = null;
  79. // force a resize
  80. window.dispatchEvent(new Event('resize'));
  81. // cleanup
  82. module._free(classNameAlloc);
  83. },
  84. canvas: (function() {
  85. var canvas = event.icon.find('canvas')[0];
  86. // As a default initial behavior, pop up an alert when webgl context is lost. To make your
  87. // application robust, you may want to override this behavior before shipping!
  88. // See http://www.khronos.org/registry/webgl/specs/latest/1.0/#5.15.2
  89. canvas.addEventListener('webglcontextlost', function(e) {
  90. alert('WebGL context lost. You will need to reload the page.');
  91. e.preventDefault();
  92. }, false);
  93. return canvas;
  94. })(),
  95. });
  96. };
  97. event.icon.click(function() {
  98. event.icon.find('canvas').focus();
  99. });
  100. document.head.appendChild(src);
  101. }
  102. else if (event.type === 'change')
  103. {
  104. if (event.data.handle && event.data.module)
  105. {
  106. var handle = event.data.handle;
  107. var module = event.data.module;
  108. if (event.uri) {
  109. var uriLen = module.lengthBytesUTF8(event.uri) + 1;
  110. var uriAlloc = module._malloc(uriLen);
  111. module.stringToUTF8(event.uri, uriAlloc, uriLen);
  112. var valueLen = module.lengthBytesUTF8(event.value) + 1;
  113. var valueAlloc = module._malloc(valueLen);
  114. module.stringToUTF8(event.value, valueAlloc, valueLen);
  115. module._modgui_patch_set(handle, uriAlloc, valueAlloc);
  116. module._free(uriAlloc);
  117. module._free(valueAlloc);
  118. } else {
  119. module._modgui_param_set(handle, portsSymbols.indexOf(event.symbol), event.value);
  120. }
  121. }
  122. else
  123. {
  124. if (event.uri) {
  125. event.data.pendingChanges.patch[event.uri] = event.value;
  126. } else {
  127. event.data.pendingChanges.ports[event.symbol] = event.value;
  128. }
  129. }
  130. }
  131. }