diff --git a/clap/CMakeLists.txt b/clap/CMakeLists.txt index 5d180f5..e0c4627 100644 --- a/clap/CMakeLists.txt +++ b/clap/CMakeLists.txt @@ -39,8 +39,8 @@ set(CLAP_WRAPPER_DONT_ADD_TARGETS TRUE) include(FetchContent) FetchContent_Declare( clap-wrapper - GIT_REPOSITORY https://github.com/free-audio/clap-wrapper - GIT_TAG v0.12.1 # first version with WCLAP stuff + GIT_REPOSITORY https://github.com/geraintluff/clap-wrapper.git + GIT_TAG cd666f7d2291d47f810d9c8f123886026a631576 GIT_SHALLOW ON ) FetchContent_MakeAvailable(clap-wrapper) diff --git a/stfx/clap/stfx-clap.h b/stfx/clap/stfx-clap.h index 85dd0c9..ae38419 100644 --- a/stfx/clap/stfx-clap.h +++ b/stfx/clap/stfx-clap.h @@ -9,6 +9,7 @@ #include "./param-info.h" #include "../storage/storage.h" +#include "../ui/web-ui.h" namespace stfx { namespace clap { @@ -121,7 +122,7 @@ template class EffectSTFX> struct Plugin : public clap_plugin { const Plugins &plugins; const clap_host *host; - using Effect = stfx::LibraryEffect; + using Effect = stfx::WebUILibraryEffect; Effect effect; template @@ -182,7 +183,6 @@ struct Plugin : public clap_plugin { // CLAP plugin methods static bool plugin_init(const clap_plugin *obj) { auto &plugin = *(Plugin *)obj; - LOG_EXPR(plugin.plugins.modulePath); return true; } static void plugin_destroy(const clap_plugin *obj) { @@ -240,6 +240,12 @@ struct Plugin : public clap_plugin { state_load }; return &ext; + } else if (!std::strcmp(extId, CLAP_EXT_WEBVIEW)) { + static struct clap_plugin_webview ext{ + webview_provide_starting_uri, + webview_receive + }; + return &ext; } return nullptr; } @@ -589,6 +595,27 @@ struct Plugin : public clap_plugin { plugin.effect.state(storage); return true; } + + // Just include the proposed draft structs here + static constexpr const char *CLAP_EXT_WEBVIEW = "clap.webview/1"; + struct clap_plugin_webview { + bool(CLAP_ABI *provide_starting_uri)(const clap_plugin_t *plugin, char *out_buffer, uint32_t out_buffer_capacity); + bool(CLAP_ABI *receive)(const clap_plugin_t *plugin, const void *buffer, uint32_t size); + }; + struct clap_host_webview { + bool(CLAP_ABI *send)(const clap_host_t *host, const void *buffer, uint32_t size); + }; + static bool webview_provide_starting_uri(const clap_plugin_t *obj, char *startingUri, uint32_t capacity) { + auto &plugin = *(Plugin *)obj; + if (!plugin.effect.webPage.size() + 1 > capacity) return false; + std::strcpy(startingUri, plugin.effect.webPage.c_str()); + return true; + } + static bool webview_receive(const clap_plugin_t *obj, const void *buffer, uint32_t size) { + auto &plugin = *(Plugin *)obj; + plugin.effect.webReceive(buffer, size); + return true; + } }; }} // namespace diff --git a/stfx/ui/html/cbor.min.js b/stfx/ui/html/cbor.min.js new file mode 100644 index 0000000..99ead1c --- /dev/null +++ b/stfx/ui/html/cbor.min.js @@ -0,0 +1 @@ +let CBOR={encode(e,r){let o=r&&r.resizable?(r.resize(0),r):new ArrayBuffer(0,{maxByteLength:64}),f=new DataView(o),i=[o],l=CBOR.encodeTag;function y(e,r,t){var n=1+t;if(o.byteLength+n>o.maxByteLength){let e=1;for(;e<=o.maxByteLength||e<=t;)e*=2;o=new ArrayBuffer(0,{maxByteLength:e}),i.push(o),f=new DataView(o)}var a=o.byteLength;return o.resize(a+n),f.setUint8(a,e<<5|r),a+1}function s(e,r,t){var n;return r<24?y(e,r,t):r<256?(n=y(e,24,t+1),f.setUint8(n,r),n+1):r<65536?(n=y(e,25,t+2),f.setUint16(n,r),n+2):(n=y(e,26,t+4),f.setUint32(n,r),n+4)}if(!function r(t){if("number"==typeof t)Number.isInteger(t)&&t<=Number.MAX_SAFE_INTEGER&&t>=Number.MIN_SAFE_INTEGER?0<=t?t<4294967296?s(0,t,0):t<0x10000000000000000?(e=y(0,27,8),f.setBigUint64(e,BigInt(t))):(e=y(7,27,8),f.setFloat64(e,t)):-4294967296<=t?s(1,-1-t,0):-18446744073709551616n<=t?(e=y(1,27,8),f.setBigUint64(e,BigInt(-1-t))):(e=y(7,26,8),f.setFloat64(e,t)):(e=y(7,27,8),f.setFloat64(e,t));else if("bigint"==typeof t)if(0<=t)if(t<18446744073709551616n){var e=y(0,27,8);f.setBigUint64(e,t)}else{y(6,2,0);for(var n=[];t;)n.unshift(Number(0xffn&t)),t>>=8n;r(new Uint8Array(n).buffer)}else if(-18446744073709551616n<=t){e=y(1,27,8);f.setBigUint64(e,-1n-t)}else{y(6,3,0),t=-1n-t;for(var a=[];t;)a.unshift(Number(0xffn&t)),t>>=8n;r(new Uint8Array(a).buffer)}else if(!1===t)y(7,20,0);else if(!0===t)y(7,21,0);else if(null===t)y(7,22,0);else if(void 0===t)y(7,23,0);else if("string"==typeof t){var i=s(3,(e=(new TextEncoder).encode(t)).length,e.length);new Uint8Array(o).set(e,i)}else if(t instanceof ArrayBuffer)e=s(2,t.byteLength,t.byteLength),new Uint8Array(o).set(new Uint8Array(t),e);else if(t instanceof DataView){i=s(2,t.byteLength,t.byteLength);new Uint8Array(o).set(new Uint8Array(t.buffer,t.byteOffset,t.byteLength),i)}else if(Array.isArray(t))s(4,t.length,0),t.forEach(r);else{if("object"!=typeof t){for(let e=0;e<256;++e)if(t===CBOR.simple[e])return s(7,e,0);throw Error("unknown simple value")}if(l in t)return s(6,(e=t[l](t))[0],0),r(e[1]);y(5,(i=Object.keys(t)).length,0),i.forEach(e=>{r(e),r(t[e])})}}(e),1==i.length)return i[0];let t=0,n=(i.forEach(e=>t+=e.length),new ArrayBuffer(0,{maxByteLength:t})),a=new Uint8Array(n);return i.forEach(e=>{var r=n.byteLength;n.resize(r+e.byteLength),a.set(new Uint8Array(e),r)}),n},decode(s){let o=CBOR.decodeTags,u=0,c=(ArrayBuffer.isView(s)&&(u=s.byteOffset,s=s.buffer),s.byteLength),g=(s=new DataView(s),CBOR.breakCode);function h(e,r,t){switch(e){case 0:return r;case 1:return-1-r;case 2:var n=t?new Uint8Array(s.buffer,u,r):s.buffer.slice(u,u+r);return u+=r,n;case 3:n=new Uint8Array(s.buffer,u,r);return u+=r,(new TextDecoder).decode(n);case 4:var a=[];for(let e=0;e=c)throw Error("end of CBOR");var r=s.getUint8(u++),t=r>>5,n=31&r;switch(n){case 24:return h(t,s.getUint8(u++),e);case 25:return 7==t?(a=s.getFloat16(u),u+=2,a):(a=s.getUint16(u),u+=2,h(t,a,e));case 26:return 7==t?(a=s.getFloat32(u),u+=4,a):(a=s.getUint32(u),u+=4,h(t,a,e));case 27:if(7==t)return a=s.getFloat64(u),u+=4,a;var a=s.getBigUint64(u);if(u+=4,a{t.set(e,n),n+=e.length}),o?t:t.buffer}case 3:{let e="",r=A();for(;r!=g;){if("string"!=typeof r)throw Error("indefinite string with non-string item");e+=r,r=A()}return e}case 4:{var l=[];let e=A();for(;e!=g;)l.push(e),e=A();return l}case 5:{var y=Object.create(null);let e=A();for(;e!=g;)y[e]=A(),e=A();return y}case 7:return g;default:throw Error("invalid indefinite type")}return;default:return h(t,n,e)}}return A()},simple:[],encodeTag:Symbol(),decodeTags:{0:e=>new Date(e),1:e=>new Date(1e3*e),2:r=>{let t=0n;for(let e=0;e{let t=0n;for(let e=0;enew URL(e),258:e=>new Set(e)},encode16(e,r){var t=new Uint8Array(CBOR.encode(e,r));let n="";for(let e=0;e>4).toString(16)+(15&t[e]).toString(16);return n},encode64(e,r){var t=new Uint8Array(CBOR.encode(e,r));let n="";for(let e=0;e{function r(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}Date.prototype[e]=e=>[1,+e/1e3],URL.prototype[e]=e=>[32,e.href],Set.prototype[e]=e=>[258,Array.from(e)];var t="function"==typeof Float16Array;Uint8Array.prototype[e]=e=>[64,r(e)],Int8Array.prototype[e]=e=>[72,r(e)],Uint16Array.prototype[e]=e=>[l?65:69,r(e)],Int16Array.prototype[e]=e=>[l?73:77,r(e)],Uint32Array.prototype[e]=e=>[l?66:70,r(e)],Int32Array.prototype[e]=e=>[l?74:78,r(e)],BigUint64Array.prototype[e]=e=>[l?67:71,r(e)],BigInt64Array.prototype[e]=e=>[l?75:79,r(e)],t&&(Float16Array.prototype[e]=e=>[l?80:84,r(e)]),Float32Array.prototype[e]=e=>[l?81:85,r(e)],Float64Array.prototype[e]=e=>[l?82:86,r(e)];e=(r,o)=>{const f=r.BYTES_PER_ELEMENT;return e=>{if((e.byteOffset%f||o!=l)&&(e=e.slice()),o!=l){var t=e,n=f;for(let r=0;re,65:e(Uint16Array,!0),66:e(Uint32Array,!0),67:e(BigUint64Array,!0),69:e(Uint16Array,!1),70:e(Uint32Array,!1),71:e(BigUint64Array,!1),72:e=>new Int8Array(e.buffer,e.byteOffset,e.length),73:e(Int16Array,!0),74:e(Int32Array,!0),75:e(BigInt64Array,!0),77:e(Int16Array,!1),78:e(Int32Array,!1),79:e(BigInt64Array,!1),80:t&&e(Float16Array,!0),81:e(Float32Array,!0),82:e(Float64Array,!0),84:t&&e(Float16Array,!1),85:e(Float32Array,!1),86:e(Float64Array,!1)})})(CBOR.encodeTag,!!new Uint8Array(new Uint16Array([256]).buffer)[0]),"object"==typeof module&&module?.exports&&(module.exports=CBOR); diff --git a/stfx/ui/html/generic.html b/stfx/ui/html/generic.html new file mode 100644 index 0000000..21cf1a9 --- /dev/null +++ b/stfx/ui/html/generic.html @@ -0,0 +1,46 @@ + + + + Generic STFX UI + + + + {=} +

{name}

+ + + + + diff --git a/stfx/ui/html/matsui-bundle.min.js b/stfx/ui/html/matsui-bundle.min.js new file mode 100644 index 0000000..f1ec192 --- /dev/null +++ b/stfx/ui/html/matsui-bundle.min.js @@ -0,0 +1,2 @@ +"use strict";self.Matsui=(e=>{var t;Object.hasOwn||(Object.hasOwn=(e,t)=>Object.prototype.hasOwnProperty.call(e,t));let o=e=>e,p=e=>e&&"object"==typeof e,h=()=>document.createTextNode("");function n(e,t){for(;e.nextSibling&&e.nextSibling!=t;)e.nextSibling.remove()}function u(){var e=document.createDocumentFragment();let t=h(),r=h();return e.append(t,r),{t:e,o:(...e)=>{n(t,r),t.after(...e)}}}let f=Symbol();function c(t){if(p(t)){let e=t[f];for(;e&&e!=t;)e=(t=e)[f]}return t}let i=[],l=null;function a(){for(clearTimeout(l),l=null;i.length;)i.shift()()}function s(t,...r){i.push(e=>t(...r)),null==l&&(requestAnimationFrame(a),l=setTimeout(a,0))}let d=Symbol(),v=Symbol(),m=Symbol("no change"),y=Symbol("replace"),g={apply(r,n,o){return p(n)?p(r)?Array.isArray(n)?n:(n[y]&&(o?r[y]=!0:delete n[y]),Object.keys(n).forEach(e=>{var t=n[e];Object.hasOwn(r,e)?null!=t||o?r[e]=g.apply(r[e],t,o):delete r[e]:null==t&&!o||(r[e]=t)}),r):(o&&(n[y]=!0),n):n},make(n,o,e){if(!e||n!==o){if(!p(o))return o;if(!p(n))return o[y]=!0,o;if(Array.isArray(o))return o;let r={};return Object.keys(o).forEach(e=>{var t;Object.hasOwn(n,e)?void 0!==(t=g.make(n[e],o[e],!0))&&(r[e]=t):r[e]=o[e]}),Object.keys(n).forEach(e=>{Object.hasOwn(o,e)||(r[e]=null)}),e&&0==Object.keys(r).length?void 0:r}},tracked(e,t,r,...n){if(!p(e))return e;let o=m,i=m,l=()=>{var e;i!=m&&(e=i,i=m,r(e))},u=e=>{r&&(i==m?(i=o,s(l)):i=g.apply(i,o,!0))},a=(n.length&&u(n[0]),(e,o)=>new Proxy(e,{get(e,t){var r=e[t];return t==f?e:p(r)?a(r,e=>o({[t]:e})):r},set(e,t,r,n){if(null==r)return delete n[t];if((r=c(r))===e[t])return!0;if(n=g.make(e[t],r),p(n))n[y]=!0;else if(r===e[t])return!0;return!!Reflect.set(e,t,r)&&(o({[t]:n}),!0)},deleteProperty(e,t){return!(t in e)||delete e[t]&&(o({[t]:null}),!0)}}));return a(e,e=>{o=o!=m?g.apply(o,e,!0):(o=e,t&&t(e),u(),m)})},addNoChange(e){return g.addHidden(e,m)},addHidden(e,n){return p(e)?new Proxy(e,{get(e,t){var r;return t==d?n:t==v||t==f?e:(e=e[t],r=p(n)&&t in n,g.addHidden(e,r?n[t]:m))},has(e,t){return t==d||t in e}}):e},hasHidden(e){return d in e},none:m,getHidden(e,r){var t;return p(e)?void 0!==(t=c(e[d]))?t===m?void 0===r?m:r:t:new Proxy(e,{get(e,t){return null==(e=e[t])?null:g.getHidden(e,r)},has(e,t){return!0}}):e},withoutHidden(e){return p(e)&&e[v]||e}},w=Symbol("accessed"),b=Symbol(),E=Symbol("list-keys"),O={tracked(e,n){if(!p(e))return n[w]=!0,e;let o=Array.isArray(e);return new Proxy(e,{get(e,t){var r=e[t];return t==f||t==b?e:t==w?(n[w]=w,e):o&&"length"===t?(n[E]=E,r):("function"!=typeof r||r.prototype||(n[w]=w),t in n||(n[t]={}),O.tracked(r,n[t]))},ownKeys(e){return n[E]=E,Reflect.ownKeys(e)}})},pierce(e,t){return e&&e[t?b:w]||e},flags:{listKeys:E,pierced:w},forMerge:function e(t,r,n){if(r!=m){if(t[w])return!0;if(!p(r)||Array.isArray(r)||r[y])return!0;if(t[E]){if(!n)return!0;for(var o in r)if(o=r[o],!p(o)||Array.isArray(o)||o[y])return!0}for(var i in r)if(t[i]&&e(t[i],r[i],n))return!0}return!1}},$=Symbol(),j=(n,...r)=>{for(let e=0;ee(...r.map(e=>e(...t)),...t.slice(r.length))]}Object.freeze(n);let o=!0,u=[],a=[];var e=(...i)=>{for(let e=0;eg.withoutHidden(e));let l=i.map(e=>c(e)),t=o||l.length!=a.length;if(!t)for(let e=0;e{e(...(u[t]=l.map(e=>({}))).map((e,t)=>O.tracked(r[t],e)))})}else{let o=i.map(e=>p(e)?g.getHidden(e,m):m);n.forEach((t,r)=>{for(let e=0;e({}))).map((e,t)=>O.tracked(i[t],e)))}})}};return e[$]=n,e};function k(e){let r=0;if(!(e=(e="="==e?"$0":e).replace(/^\$[0-9]+($|\.)/,e=>(r=parseInt(e.substr(1),10),""))).length)return(...e)=>e[r];let n=e.split(".");if(1!=n.length)return(...e)=>{let t=e[r];return n.forEach(e=>{t=t?.[e]}),t};{let t=n[0];return(...e)=>e[r]?.[t]}}let A=/\$\{/g;function I(n,o){let i=0;for(var l,u=[];l=A.exec(n);){u.push(n.slice(i,l.index));let e=l.index+2,t=e+1,r;for(;tt}else n[e]=e=>k(r);else n[e]=e=>e[r]}return t=>{let e=n.map(e=>"function"==typeof e?e(t):e).filter(e=>""!=e);return 1==e.length?e[0]:e.some(e=>"function"==typeof e)?(...t)=>e.map(e=>"function"==typeof e?e(...t):e).join(""):e.join("")}}function D(e){if(/^template$/i.test(e.tagName))return 1;for(var t of e.attributes||[])if("@"==t.name[0])return 1}function S(e){return/^script$/i.test(e.tagName)}function L(e){return e.slice(1).toLowerCase().replace(/-+(.)/g,(e,t)=>t.toUpperCase())}let R=/(\{[a-z0-9_=\.,\$-]+\}|\uF74A[0-9]+\uF74B)/giu,H=/((\$[a-z0-9_-]+)*)(\{([a-z0-9_=\.,\$-]+)\}|\uF74A([0-9]+)\uF74B)/giu,M=Symbol();function T(e){let c=e.content||e,s=[],d={},p=!1,v=(Array.from(c.childNodes).forEach(t=>{if("TEMPLATE"==t.tagName){var r=t.getAttribute("name");if(r){p=!0;let e=e=>null;t.hasAttribute("$filter")&&(e=_(t.getAttribute("$filter"))),d[r]={i:T(t),l:t[M],u:e},t.remove()}}}),function r(e,l){if(3==e.nodeType){var u=l,a=e.nodeValue;let n,o=0;for(;n=H.exec(a);){let i=a.slice(o,n.index),l=(o=H.lastIndex,n[1].split("$").slice(1)),e=n[4],t=n[5],r=null;e&&(r=e.split(",").map(k)),s.push((n,e)=>{let o=r||[].concat(e[t]);return"function"==typeof o[0]&&l.some(e=>"template"===e)&&(n=n.extend()).add("template",o.shift()),o.forEach((t,e)=>{"function"!=typeof t&&(o[e]=e=>t)}),{p:u,v:(e,t,r)=>{i&&e.before(i),r=function(n,e,o){let i=e.map(e=>{var t=n.named[e];if(t)return t;let r="Template not found: "+e;return console.error(r),e=>({node:document.createTextNode(r),updates:[]})});return function t(r){if(r>=e.length)return o;let n=i[r];return e=>n(t(r+1))}(0)(n.dynamic)}(n,l,r),e.before(r.node),t.push(j(r.updates,...o))}}})}if(0e.nodeValue=t:e=>e.remove();s.push(e=>({p:u,v:r}))}}else if(1===e.nodeType){if(D(e)&&l.length){if("TEMPLATE"==e.tagName&&e.hasAttribute("name"))throw Error('