supersonic-scsynth-core 0.43.0 → 0.45.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
package/wasm/scsynth-nrt.wasm
CHANGED
|
Binary file
|
package/workers/debug_worker.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
(()=>{function
|
|
2
|
-
`)&&(
|
|
3
|
-
`)&&(S=S.slice(0,-1)),t.push({text:S,timestamp:performance.now(),sequence:e.sequence})}catch(
|
|
1
|
+
(()=>{function g({uint8View:o,dataView:t,bufferStart:e,bufferSize:E,head:S,tail:C,messageMagic:I,paddingMagic:B,headerSize:R,maxMessages:l=1/0,onMessage:U,onCorruption:n}){let s=C,u=0,p=O=>{let T=O;if(T+4<=E)return t.getUint32(e+T,!0);let D=0;for(let a=0;a<4;a++)D|=o[e+(T+a)%E]<<a*8;return D};for(;s!==S&&u<l;){let O=E-s,T;if(O>=4?T=t.getUint32(e+s,!0):T=p(s),T===B){s=0;continue}if(T!==I){n&&n(s),s=(s+1)%E;continue}let D=p((s+4)%E),a=p((s+8)%E),d=p((s+12)%E);if(D<R||D>E){n&&n(s),s=(s+1)%E;continue}let m=D-R,F=e+(s+R)%E;U(F,m,a,d),s=(s+D)%E,u++}return{newTail:s,messagesRead:u}}function f(o,t){let e=o+t;return{DEBUG_HEAD:(e+16)/4,DEBUG_TAIL:(e+20)/4}}var i="sab",A=null,L=null,r=null,P=null,H=null,_=null,c={},x=null,N=!1,G=new TextDecoder("utf-8"),b=(...o)=>{},w=(o,t,e)=>{A=o,L=t,_=e,r=new Int32Array(A),P=new DataView(A),H=new Uint8Array(A),c=f(L,_.CONTROL_START);let E=L+_.METRICS_START;x=new Uint32Array(A,E,_.METRICS_SIZE/4)},W=()=>{let o=Atomics.load(r,c.DEBUG_HEAD),t=Atomics.load(r,c.DEBUG_TAIL);if(o===t)return null;let e=[],{newTail:E,messagesRead:S}=g({uint8View:H,dataView:P,bufferStart:L+_.DEBUG_BUFFER_START,bufferSize:_.DEBUG_BUFFER_SIZE,head:o,tail:t,messageMagic:_.MESSAGE_MAGIC,paddingMagic:_.PADDING_MAGIC,headerSize:_.MESSAGE_HEADER_SIZE,maxMessages:1e3,onMessage:(C,I,B,R)=>{let l=new Uint8Array(I);for(let n=0;n<I;n++)l[n]=H[C+n];let U=G.decode(l);U.endsWith(`
|
|
2
|
+
`)&&(U=U.slice(0,-1)),e.push({text:U,timestamp:performance.now(),sequence:B}),x&&(Atomics.add(x,30,1),Atomics.add(x,31,I))},onCorruption:C=>{console.error("[DebugWorker] Corrupted message at position",C)}});return S>0&&Atomics.store(r,c.DEBUG_TAIL,E),e.length>0?e:null},X=()=>{for(;N;)try{let o=Atomics.load(r,c.DEBUG_HEAD),t=Atomics.load(r,c.DEBUG_TAIL);o===t&&Atomics.wait(r,c.DEBUG_HEAD,o);let e=W();e&&e.length>0&&self.postMessage({type:"debug",messages:e})}catch(o){console.error("[DebugWorker] Error in wait loop:",o),self.postMessage({type:"error",error:o.message}),Atomics.wait(r,0,r[0],10)}},k=()=>{if(!A){console.error("[DebugWorker] Cannot start - not initialized");return}N||(N=!0,X())},Q=()=>{N=!1},K=()=>{A&&(Atomics.store(r,c.DEBUG_HEAD,0),Atomics.store(r,c.DEBUG_TAIL,0))},h=o=>{let t=[];for(let e of o)try{let E=new Uint8Array(e.bytes),S=G.decode(E);S.endsWith(`
|
|
3
|
+
`)&&(S=S.slice(0,-1)),t.push({text:S,timestamp:performance.now(),sequence:e.sequence})}catch(E){console.error("[DebugWorker] Failed to decode message:",E)}t.length>0&&self.postMessage({type:"debug",messages:t})};self.addEventListener("message",o=>{let{data:t}=o;try{switch(t.type){case"init":i=t.mode||"sab",i==="sab"&&w(t.sharedBuffer,t.ringBufferBase,t.bufferConstants),self.postMessage({type:"initialized"});break;case"start":i==="sab"&&k();break;case"stop":Q();break;case"clear":i==="sab"&&K();break;case"debugRaw":t.messages&&h(t.messages);break;default:}}catch(e){console.error("[DebugWorker] Error:",e),self.postMessage({type:"error",error:e.message})}});b("[DebugWorker] Script loaded");})();
|
package/workers/osc_in_worker.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(()=>{function
|
|
1
|
+
(()=>{function F({uint8View:o,dataView:e,bufferStart:t,bufferSize:s,head:x,tail:R,messageMagic:a,paddingMagic:A,headerSize:p,maxMessages:i=1/0,onMessage:_,onCorruption:S}){let E=R,N=0,O=B=>{let T=B;if(T+4<=s)return e.getUint32(t+T,!0);let C=0;for(let I=0;I<4;I++)C|=o[t+(T+I)%s]<<I*8;return C};for(;E!==x&&N<i;){let B=s-E,T;if(B>=4?T=e.getUint32(t+E,!0):T=O(E),T===A){E=0;continue}if(T!==a){S&&S(E),E=(E+1)%s;continue}let C=O((E+4)%s),I=O((E+8)%s),G=O((E+12)%s);if(C<p||C>s){S&&S(E),E=(E+1)%s;continue}let d=C-p,g=t+(E+p)%s;_(g,d,I,G),E=(E+C)%s,N++}return{newTail:E,messagesRead:N}}function f(o,e){let t=o+e;return{OUT_HEAD:(t+8)/4,OUT_TAIL:(t+12)/4}}var D=null,l=null,n=null,M=null,P=null,c=null,U={},r=null,L=!1,W=(...o)=>{},H=-1,X=(o,e,t)=>{D=o,l=e,c=t,n=new Int32Array(D),M=new DataView(D),P=new Uint8Array(D),U=f(l,c.CONTROL_START);let s=l+c.METRICS_START;r=new Uint32Array(D,s,c.METRICS_SIZE/4)},Q=()=>{let o=Atomics.load(n,U.OUT_HEAD),e=Atomics.load(n,U.OUT_TAIL);if(o===e)return[];let t=[],{newTail:s,messagesRead:x}=F({uint8View:P,dataView:M,bufferStart:l+c.OUT_BUFFER_START,bufferSize:c.OUT_BUFFER_SIZE,head:o,tail:e,messageMagic:c.MESSAGE_MAGIC,paddingMagic:c.PADDING_MAGIC,headerSize:c.MESSAGE_HEADER_SIZE,maxMessages:100,onMessage:(R,a,A,p)=>{if(H>=0){let _=H+1&4294967295;if(A!==_){let S=A-_+4294967296&4294967295;S<1e3&&(console.error("[OSCInWorker] Detected",S,"dropped messages (expected seq",_,"got",A,")"),r&&Atomics.add(r,28,S))}}H=A;let i=new Uint8Array(a);for(let _=0;_<a;_++)i[_]=P[R+_];t.push({oscData:i,sequence:A}),r&&(Atomics.add(r,26,1),Atomics.add(r,27,a))},onCorruption:R=>{console.error("[OSCInWorker] Corrupted message at position",R),r&&(Atomics.add(r,28,1),Atomics.add(r,29,1))}});return x>0&&Atomics.store(n,U.OUT_TAIL,s),t},k=()=>{for(;L;)try{let o=Atomics.load(n,U.OUT_HEAD),e=Atomics.load(n,U.OUT_TAIL);o===e&&Atomics.wait(n,U.OUT_HEAD,o);let t=Q();t.length>0&&self.postMessage({type:"messages",messages:t})}catch(o){console.error("[OSCInWorker] Error in wait loop:",o),self.postMessage({type:"error",error:o.message}),Atomics.wait(n,0,n[0],10)}},K=()=>{if(!D){console.error("[OSCInWorker] Cannot start - not initialized");return}L||(L=!0,k())},V=()=>{L=!1};self.addEventListener("message",o=>{let{data:e}=o;try{switch(e.type){case"init":X(e.sharedBuffer,e.ringBufferBase,e.bufferConstants),self.postMessage({type:"initialized"});break;case"start":K();break;case"stop":V();break;default:}}catch(t){console.error("[OSCInWorker] Error:",t),self.postMessage({type:"error",error:t.message})}});W("[OSCInWorker] Script loaded");})();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(()=>{function j(e,t,r){return(r-1-e+t)%r}function ee({uint8View:e,dataView:t,bufferStart:r,bufferSize:s,head:n,payload:c,sequence:i,messageMagic:
|
|
1
|
+
(()=>{function j(e,t,r){return(r-1-e+t)%r}function ee({uint8View:e,dataView:t,bufferStart:r,bufferSize:s,head:n,payload:c,sequence:i,messageMagic:a,headerSize:T,sourceId:_=0,headerScratch:Y=null,headerScratchView:M=null}){let m=c.length,I=T+m+3&-4,U=s-n;if(I>U){let u=Y||new Uint8Array(T),g=M||new DataView(u.buffer);g.setUint32(0,a,!0),g.setUint32(4,I,!0),g.setUint32(8,i,!0),g.setUint32(12,_,!0);let b=r+n,w=r;if(U>=T){e.set(u,b);let L=U-T;L>0&&e.set(c.subarray(0,L),b+T),e.set(c.subarray(L),w)}else{e.set(u.subarray(0,U),b),e.set(u.subarray(U),w);let L=T-U;e.set(c,w+L)}}else{let u=r+n;t.setUint32(u,a,!0),t.setUint32(u+4,I,!0),t.setUint32(u+8,i,!0),t.setUint32(u+12,_,!0),e.set(c,u+T)}return(n+I)%s}function Ie(e,t,r=0,s=!1){for(let n=0;n<=r;n++)if(Atomics.compareExchange(e,t,0,1)===0)return!0;if(s){for(let c=0;c<100;c++)if(Atomics.wait(e,t,1,100),Atomics.compareExchange(e,t,0,1)===0)return!0;return console.error("[RingBuffer] Lock acquisition timeout after 10s - possible deadlock"),!1}return!1}function ge(e,t){Atomics.store(e,t,0),Atomics.notify(e,t,1)}function te({atomicView:e,dataView:t,uint8View:r,bufferConstants:s,ringBufferBase:n,controlIndices:c,oscMessage:i,sourceId:a=0,maxSpins:T=0,useWait:_=!1}){let Y=i.length,M=s.MESSAGE_HEADER_SIZE+Y;if(M>s.IN_BUFFER_SIZE-s.MESSAGE_HEADER_SIZE||!Ie(e,c.IN_WRITE_LOCK,T,_))return!1;try{let m=Atomics.load(e,c.IN_HEAD),J=Atomics.load(e,c.IN_TAIL),I=M+3&-4;if(j(m,J,s.IN_BUFFER_SIZE)<I)return!1;let u=Atomics.add(e,c.IN_SEQUENCE,1),g=ee({uint8View:r,dataView:t,bufferStart:n+s.IN_BUFFER_START,bufferSize:s.IN_BUFFER_SIZE,head:m,payload:i,sequence:u,messageMagic:s.MESSAGE_MAGIC,headerSize:s.MESSAGE_HEADER_SIZE,sourceId:a});return Atomics.load(e,c.IN_HEAD),Atomics.store(e,c.IN_HEAD,g),Atomics.notify(e,c.IN_HEAD,1),!0}finally{ge(e,c.IN_WRITE_LOCK)}}function se(e,t){let r=e+t;return{IN_HEAD:(r+0)/4,IN_TAIL:(r+4)/4,IN_SEQUENCE:(r+24)/4,IN_WRITE_LOCK:(r+40)/4,IN_LOG_TAIL:(r+44)/4}}var A="sab",v=null,K=1024,Oe=65536,ce=3600,Se=4294967295,D=null,H=null,f=null,P=null,ue=null,fe=null,B={},E=null,F=null,Ee=null,W=150,C=(e,t)=>{E&&(A==="sab"?Atomics.store(E,e,t):E[e]=t)},Te=e=>E?A==="sab"?Atomics.load(E,e):E[e]:0,p=(e,t)=>{E&&(A==="sab"?Atomics.add(E,e,t):E[e]+=t)},y=(e,t)=>{E&&(A==="sab"?Atomics.store(E,e,t):E[e]=t)},le=e=>E?A==="sab"?Atomics.load(E,e):E[e]:0,Me=()=>{if(A!=="postMessage"||Ee!==null)return;let e=()=>{F&&E&&self.postMessage({type:"preschedulerMetrics",metrics:new Uint32Array(F.slice(0))}),Ee=setTimeout(e,W)};e(),S("[PreScheduler] Started metrics sending (every "+W+"ms)")};var o=[],R=null,x=1/0,me=0,ie=!1,l=[],k=!1,h=65536,xe=2208988800,$=.5,S=(...e)=>{},V=()=>(performance.timeOrigin+performance.now())/1e3+xe,He=e=>{if(e.length>=16&&e[0]===35){let t=new DataView(e.buffer,e.byteOffset),r=t.getUint32(8,!1),s=t.getUint32(12,!1);return r+s/4294967296}return null},Be=()=>{if(!D||!f){console.error("[PreScheduler] Cannot init - missing buffer or constants");return}P=new Int32Array(D),ue=new DataView(D),fe=new Uint8Array(D),B=se(H,f.CONTROL_START);let e=H+f.METRICS_START;E=new Uint32Array(D,e,f.METRICS_SIZE/4),S("[PreScheduler] SharedArrayBuffer initialized with direct ring buffer writing and metrics")},G=()=>{if(!E)return;C(9,o.length);let e=o.length,t=Te(10);e>t&&C(10,e)},d=(e,t,r=0,s=!1)=>{if(A==="postMessage")return v?(v.postMessage({type:"osc",oscData:e,sourceId:r}),p(12,1),!0):(console.error("[PreScheduler] No worklet port available"),!1);if(!D||!P)return console.error("[PreScheduler] Not initialized for ring buffer writing"),!1;let n=e.length,c=f.MESSAGE_HEADER_SIZE+n;return c>f.IN_BUFFER_SIZE-f.MESSAGE_HEADER_SIZE?(console.error("[PreScheduler] Message too large:",c),!1):te({atomicView:P,dataView:ue,uint8View:fe,bufferConstants:f,ringBufferBase:H,controlIndices:B,oscMessage:e,sourceId:r,maxSpins:10,useWait:s})?(p(12,1),!0):!1},N=(e,t,r=0)=>{let s=o.length+l.length;if(s>=h){console.error("[PreScheduler] Backpressure: dropping retry ("+s+" pending)"),p(17,1);return}l.push({oscData:e,context:t||"unknown",queuedAt:performance.now(),sourceId:r}),C(18,l.length);let n=Te(19);l.length>n&&C(19,l.length),S("[PreScheduler] Queued message for retry:",t,"queue size:",l.length),Ae()},Ae=()=>{if(k||l.length===0||A!=="sab")return;k=!0;let e=Atomics.load(P,B.IN_TAIL),t=Atomics.waitAsync(P,B.IN_TAIL,e),r=()=>{k=!1,Fe(),l.length>0&&Ae()};t.async?t.value.then(r):queueMicrotask(r)},Fe=()=>{if(l.length===0)return;let e=0;for(;e<l.length;){let t=l[e];if(d(t.oscData,!0,t.sourceId,!0))l.splice(e,1),p(16,1),C(18,l.length);else break}},_e=(e,t,r,s=0)=>{let n=o.length+l.length;if(n>=h){let _=`Prescheduler queue full (${n} >= ${h} max)`;return console.error("[PreScheduler]",_),self.postMessage({type:"error",error:_,code:"PRESCHEDULER_QUEUE_FULL"}),!1}let c=He(e);if(c===null)return S("[PreScheduler] Non-bundle message, dispatching immediately"),d(e,!1,s,!0)||N(e,"immediate message",s),!0;let i=V(),a=c-i;if(e.length>K){let _=`Bundle too large for scheduler (${e.length} > ${K} bytes)`;return console.error("[PreScheduler]",_),self.postMessage({type:"error",error:_,code:"BUNDLE_TOO_LARGE"}),!1}if(a>ce){let _=`Bundle scheduled too far in future (${a.toFixed(0)}s > ${ce}s max)`;return console.error("[PreScheduler]",_),self.postMessage({type:"error",error:_,code:"BUNDLE_TOO_FAR_FUTURE"}),!1}let T={ntpTime:c,seq:me++,sessionId:t||0,runTag:r||"",oscData:e,sourceId:s};return ye(T),p(11,1),G(),S("[PreScheduler] Scheduled bundle:","NTP="+c.toFixed(3),"current="+i.toFixed(3),"wait="+(a*1e3).toFixed(1)+"ms","pending="+o.length),O(),!0},ye=e=>{o.push(e),Ye(o.length-1)},pe=()=>o.length>0?o[0]:null,Ge=()=>{if(o.length===0)return null;let e=o[0],t=o.pop();return o.length>0&&(o[0]=t,Re(0)),e},Ye=e=>{for(;e>0;){let t=Math.floor((e-1)/2);if(Z(o[e],o[t])>=0)break;Ue(e,t),e=t}},Re=e=>{let t=o.length;for(;;){let r=2*e+1,s=2*e+2,n=e;if(r<t&&Z(o[r],o[n])<0&&(n=r),s<t&&Z(o[s],o[n])<0&&(n=s),n===e)break;Ue(e,n),e=n}},Z=(e,t)=>e.ntpTime===t.ntpTime?e.seq-t.seq:e.ntpTime-t.ntpTime,Ue=(e,t)=>{let r=o[e];o[e]=o[t],o[t]=r},O=()=>{if(o.length===0){R!==null&&(clearTimeout(R),R=null,x=1/0);return}let e=pe().ntpTime-$,t=V();if(e<x){R!==null&&clearTimeout(R);let r=Math.max(0,(e-t)*1e3);x=e,R=setTimeout(we,r)}},be=()=>{R===null&&(S("[PreScheduler] Starting demand-driven dispatching"),O())};var we=()=>{ie=!0;let e=V(),t=e+$,r=0;for(;o.length>0;){let s=pe();if(s.ntpTime<=t){Ge(),G();let n=s.ntpTime-e;if(p(21,1),n<0){let i=Math.round(-n*1e3);p(15,1);let a=le(23);i>a&&y(23,i)}else{let i=Math.round(n*1e3),a=le(14);(a===Se||i<a)&&y(14,i)}S("[PreScheduler] Dispatching bundle:","NTP="+s.ntpTime.toFixed(3),"current="+e.toFixed(3),"early="+(n*1e3).toFixed(1)+"ms","remaining="+o.length),d(s.oscData,!1,s.sourceId,!0)||N(s.oscData,"scheduled bundle NTP="+s.ntpTime.toFixed(3),s.sourceId),r++}else break}(r>0||o.length>0||l.length>0)&&S("[PreScheduler] Dispatch cycle complete:","dispatched="+r,"pending="+o.length,"retrying="+l.length),ie=!1,R=null,x=1/0,O()},z=e=>{if(o.length===0)return;let t=o.length,r=[];for(let n=0;n<o.length;n++){let c=o[n];e(c)||r.push(c)}let s=t-r.length;s>0&&(o=r,ke(),p(13,s),G(),S("[PreScheduler] Cancelled "+s+" events, "+o.length+" remaining"),O())},ke=()=>{for(let e=Math.floor(o.length/2)-1;e>=0;e--)Re(e)},Qe=(e,t)=>{z(r=>r.sessionId===e&&r.runTag===t)},Xe=e=>{z(t=>t.sessionId===e)},ve=e=>{z(t=>t.runTag===e)},Ke=()=>{let e=o.length,t=l.length;e===0&&t===0||(p(13,e+t),o=[],l=[],C(18,0),G(),S("[PreScheduler] Cancelled all "+e+" events, "+t+" retries"),O())},We=e=>!e||e.length<8?!1:e[0]===35&&e[1]===98&&e[2]===117&&e[3]===110&&e[4]===100&&e[5]===108&&e[6]===101&&e[7]===0,Ze=e=>{let t=[],r=new DataView(e.buffer,e.byteOffset,e.byteLength),s=16;for(;s+4<=e.length;){let n=r.getInt32(s,!1);if(s+=4,n<=0||n>Oe||s+n>e.length)break;let c=e.slice(s,s+n);for(t.push(c),s+=n;s%4!==0&&s<e.length;)s++}return t},qe=(e,t=0)=>{if(We(e)){let r=Ze(e);for(let s=0;s<r.length;s++)d(r[s],!1,t,!0)||N(r[s],"immediate bundle message "+s,t)}else d(e,!1,t,!0)||N(e,"immediate message",t)};self.addEventListener("message",e=>{let{data:t}=e;try{switch(t.type){case"init":if(A=t.mode||"sab",t.maxPendingMessages&&(h=t.maxPendingMessages),t.snapshotIntervalMs&&(W=t.snapshotIntervalMs),t.bypassLookaheadS!==void 0&&($=t.bypassLookaheadS),A==="sab")D=t.sharedBuffer,H=t.ringBufferBase,f=t.bufferConstants,Be(),f&&f.scheduler_slot_size&&(K=f.scheduler_slot_size);else{v=t.workletPort;let s=184;F=new ArrayBuffer(s),E=new Uint32Array(F),Me()}y(14,Se),y(23,0),be(),S("[OSCPreSchedulerWorker] Initialized with NTP-based scheduling, mode="+A+", capacity="+h),self.postMessage({type:"initialized"});break;case"addOscSource":let r=e.ports[0];r&&(r.onmessage=s=>{s.data.type==="osc"&&s.data.oscData&&_e(s.data.oscData,0,"",s.data.sourceId||0)},S("[OSCPreSchedulerWorker] Added external OSC source"));break;case"send":_e(t.oscData,t.sessionId||0,t.runTag||"",t.sourceId||0);break;case"sendImmediate":qe(t.oscData,t.sourceId||0);break;case"directDispatch":d(t.oscData,!1,t.sourceId||0,!0)||N(t.oscData,"directDispatch fallback",t.sourceId||0);break;case"cancelSessionTag":t.runTag!==void 0&&t.runTag!==null&&t.runTag!==""&&Qe(t.sessionId||0,t.runTag);break;case"cancelSession":Xe(t.sessionId||0);break;case"cancelTag":t.runTag!==void 0&&t.runTag!==null&&t.runTag!==""&&ve(t.runTag);break;case"cancelAll":Ke(),t.ack&&self.postMessage({type:"cancelAllAck"});break;default:}}catch(r){console.error("[OSCPreSchedulerWorker] Error:",r),self.postMessage({type:"error",error:r.message})}});S("[OSCPreSchedulerWorker] Script loaded");})();
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(()=>{function
|
|
2
|
-
`,E=new TextEncoder().encode(r);if(E.length>s)return;let o=this.CONTROL_INDICES.DEBUG_HEAD,c=this.atomicLoad(o),_=s-c,u=c;E.length>_&&(this.uint8View[this.ringBufferBase+t+c]=i,u=0);let f=this.ringBufferBase+t;for(let a=0;a<E.length;a++)this.uint8View[f+u+a]=E[a];let h=u+E.length;this.atomicStore(o,h),this.mode==="sab"&&Atomics.notify(this.atomicView,o,1)}catch{}}atomicLoad(e){return this.mode==="sab"?Atomics.load(this.atomicView,e):this.atomicView[e]}atomicStore(e,t){this.mode==="sab"?Atomics.store(this.atomicView,e,t):this.atomicView[e]=t}initPMPools(){if(this.mode!=="postMessage")return;let e=C;this.pmPools={replies:{message:{type:"oscReplies",messages:null,count:0},buffer:new ArrayBuffer(e.REPLY_BUFFER_SIZE),bufferView:null,entries:new Array(e.MAX_REPLY_MESSAGES).fill(null).map(()=>({offset:0,length:0,sequence:0}))},debug:{message:{type:"debugRawBatch",messages:null,count:0},buffer:new ArrayBuffer(e.DEBUG_BUFFER_SIZE),bufferView:null,entries:new Array(e.MAX_DEBUG_MESSAGES).fill(null).map(()=>({offset:0,length:0,sequence:0}))},snapshot:{message:{type:"snapshot",buffer:null,snapshotsSent:0},buffer:null,bufferView:null,size:0},log:{message:{type:"oscLog",entries:null,count:0,buffer:null},buffer:new ArrayBuffer(e.LOG_BUFFER_SIZE),bufferView:null,entries:new Array(e.MAX_LOG_ENTRIES).fill(null).map(()=>({offset:0,length:0,originalLength:0,sourceId:0,sequence:0}))},incoming:{headerBytes:new Uint8Array(16),headerView:null}};let t=this.pmPools;if(t.replies.bufferView=new Uint8Array(t.replies.buffer),t.debug.bufferView=new Uint8Array(t.debug.buffer),t.log.bufferView=new Uint8Array(t.log.buffer),t.replies.message.messages=t.replies.entries,t.debug.message.messages=t.debug.entries,t.log.message.entries=t.log.entries,t.incoming.headerView=new DataView(t.incoming.headerBytes.buffer),this.bufferConstants&&this.wasmMemory){let s=this.bufferConstants,i=s.METRICS_SIZE+s.NODE_TREE_SIZE;t.snapshot.buffer=new ArrayBuffer(i),t.snapshot.bufferView=new Uint8Array(t.snapshot.buffer),t.snapshot.size=i,t.snapshot.message.buffer=t.snapshot.buffer;let r=this.ringBufferBase+s.METRICS_START;t.snapshot.sourceView=new Uint8Array(this.wasmMemory.buffer,r,i)}}writeOscToRingBuffer(e,t=0){if(!this.bufferConstants||!this.uint8View||!this.pmPools)return!1;let s=this.bufferConstants.IN_BUFFER_SIZE,i=this.bufferConstants.MESSAGE_HEADER_SIZE,r=this.ringBufferBase+this.bufferConstants.IN_BUFFER_START,n=e.byteLength,o=i+n+3&-4,c=this.atomicLoad(this.CONTROL_INDICES.IN_HEAD),_=this.atomicLoad(this.CONTROL_INDICES.IN_TAIL),u=w(c,_,s);if(o>u)return console.error("[AudioWorklet] Ring buffer full, dropping OSC message"),!1;let f=this.atomicLoad(this.CONTROL_INDICES.IN_SEQUENCE);this.atomicStore(this.CONTROL_INDICES.IN_SEQUENCE,f+1);let h=new Uint8Array(e),a=O({uint8View:this.uint8View,dataView:this.dataView,bufferStart:r,bufferSize:s,head:c,payload:h,sequence:f,messageMagic:this.bufferConstants.MESSAGE_MAGIC,headerSize:i,sourceId:t,headerScratch:this.pmPools.incoming.headerBytes,headerScratchView:this.pmPools.incoming.headerView});return this.atomicStore(this.CONTROL_INDICES.IN_HEAD,a),!0}readOscReplies(){if(!this.pmPools)return;let e=this.atomicLoad(this.CONTROL_INDICES.OUT_HEAD),t=this.atomicLoad(this.CONTROL_INDICES.OUT_TAIL);if(e===t)return;let s=this.pmPools.replies,i=C,r=0,n=0,{newTail:E,messagesRead:o}=d({uint8View:this.uint8View,dataView:this.dataView,bufferStart:this.ringBufferBase+this.bufferConstants.OUT_BUFFER_START,bufferSize:this.bufferConstants.OUT_BUFFER_SIZE,head:e,tail:t,messageMagic:this.bufferConstants.MESSAGE_MAGIC,paddingMagic:this.bufferConstants.PADDING_MAGIC,headerSize:this.bufferConstants.MESSAGE_HEADER_SIZE,maxMessages:i.MAX_REPLY_MESSAGES,onMessage:(c,_,u,f)=>{if(r>=i.MAX_REPLY_MESSAGES||n+_>i.REPLY_BUFFER_SIZE)return;for(let a=0;a<_;a++)s.bufferView[n+a]=this.uint8View[c+a];let h=s.entries[r];h.offset=n,h.length=_,h.sequence=u,n+=_,r++}});o>0&&this.atomicStore(this.CONTROL_INDICES.OUT_TAIL,E),r>0&&(s.message.count=r,s.message.buffer=s.buffer,this.port.postMessage(s.message))}readNodeTree(){if(!this.bufferConstants||!this.wasmMemory||this.ringBufferBase===null)return null;let e=this.bufferConstants,t=this.ringBufferBase+e.NODE_TREE_START,s=new Uint32Array(this.wasmMemory.buffer,t,2),i=s[0],r=s[1],n=t+e.NODE_TREE_HEADER_SIZE,E=e.NODE_TREE_MIRROR_MAX_NODES,o=e.NODE_TREE_ENTRY_SIZE,c=e.NODE_TREE_DEF_NAME_SIZE,_=new DataView(this.wasmMemory.buffer,n,E*o),u=[],f=0;for(let h=0;h<E&&f<i;h++){let a=h*o,l=_.getInt32(a,!0);if(l===-1)continue;f++;let S=n+a+24,m=new Uint8Array(this.wasmMemory.buffer,S,c),T="";for(let p=0;p<c&&m[p]!==0;p++)T+=String.fromCharCode(m[p]);u.push({id:l,parentId:_.getInt32(a+4,!0),isGroup:_.getInt32(a+8,!0)===1,prevId:_.getInt32(a+12,!0),nextId:_.getInt32(a+16,!0),headId:_.getInt32(a+20,!0),defName:T})}return{nodeCount:i,version:r,nodes:u}}readMetrics(){return this.metricsView?new Uint32Array(this.metricsView):null}recordOscReceived(e,t=null){if(this.metricsView){if(this.mode==="sab")Atomics.add(this.metricsView,24,1),Atomics.add(this.metricsView,25,e);else if(this.metricsView[24]++,this.metricsView[25]+=e,t){this.metricsView[22]++;let i={nonBundle:38,immediate:39,nearFuture:40,late:41}[t];i!==void 0&&this.metricsView[i]++}}}checkAndSendSnapshot(e){let t=this.bufferConstants;if(!t||!this.wasmMemory||this.ringBufferBase===null||!this.pmPools)return!1;let i=(this.ringBufferBase+t.NODE_TREE_START+4)/4,r=this.atomicView[i];if(r!==this.lastTreeVersion)this.lastTreeVersion=r,this.lastTreeSendTime=e;else{if(this.lastTreeSendTime>=0&&e-this.lastTreeSendTime<this.treeSnapshotMinInterval)return!1;this.lastTreeSendTime=e}let E=this.pmPools.snapshot;return!E.buffer||!E.sourceView?!1:(E.bufferView.set(E.sourceView),this.treeSnapshotsSent++,E.message.snapshotsSent=this.treeSnapshotsSent,this.port.postMessage(E.message),!0)}readMetricsAndTreeBuffer(){if(!this.bufferConstants||!this.wasmMemory||this.ringBufferBase===null)return null;let e=this.bufferConstants,t=this.ringBufferBase+e.METRICS_START,s=e.METRICS_SIZE+e.NODE_TREE_SIZE,i=new Uint8Array(this.wasmMemory.buffer,t,s),r=new ArrayBuffer(s);return new Uint8Array(r).set(i),r}sendLogEntries(){if(!this.CONTROL_INDICES||!this.bufferConstants||!this.pmPools)return;let e=this.atomicLoad(this.CONTROL_INDICES.IN_HEAD),t=this.atomicLoad(this.CONTROL_INDICES.IN_LOG_TAIL);if(e===t)return;let s=this.pmPools.log,i=C,r=0,n=0,{newTail:E,messagesRead:o}=d({uint8View:this.uint8View,dataView:this.dataView,bufferStart:this.ringBufferBase+this.bufferConstants.IN_BUFFER_START,bufferSize:this.bufferConstants.IN_BUFFER_SIZE,head:e,tail:t,messageMagic:this.bufferConstants.MESSAGE_MAGIC,paddingMagic:this.bufferConstants.PADDING_MAGIC,headerSize:this.bufferConstants.MESSAGE_HEADER_SIZE,maxMessages:i.MAX_LOG_ENTRIES,onMessage:(c,_,u,f)=>{if(r>=i.MAX_LOG_ENTRIES)return;let h=Math.min(_,i.LOG_MAX_MESSAGE_SIZE);if(n+h>i.LOG_BUFFER_SIZE)return;for(let l=0;l<h;l++)s.bufferView[n+l]=this.uint8View[c+l];let a=s.entries[r];a.offset=n,a.length=h,a.originalLength=_,a.sourceId=f??0,a.sequence=u,n+=h,r++}});o>0&&this.atomicStore(this.CONTROL_INDICES.IN_LOG_TAIL,E),r>0&&(s.message.count=r,s.message.buffer=s.buffer,this.port.postMessage(s.message))}readDebugMessages(){if(!this.pmPools)return;let e=this.atomicLoad(this.CONTROL_INDICES.DEBUG_HEAD),t=this.atomicLoad(this.CONTROL_INDICES.DEBUG_TAIL);if(e===t)return;let s=this.pmPools.debug,i=C,r=0,n=0,{newTail:E,messagesRead:o}=d({uint8View:this.uint8View,dataView:this.dataView,bufferStart:this.ringBufferBase+this.bufferConstants.DEBUG_BUFFER_START,bufferSize:this.bufferConstants.DEBUG_BUFFER_SIZE,head:e,tail:t,messageMagic:this.bufferConstants.MESSAGE_MAGIC,paddingMagic:this.bufferConstants.PADDING_MAGIC,headerSize:this.bufferConstants.MESSAGE_HEADER_SIZE,maxMessages:i.MAX_DEBUG_MESSAGES,onMessage:(c,_,u,f)=>{if(r>=i.MAX_DEBUG_MESSAGES||n+_>i.DEBUG_BUFFER_SIZE)return;for(let a=0;a<_;a++)s.bufferView[n+a]=this.uint8View[c+a];let h=s.entries[r];h.offset=n,h.length=_,h.sequence=u,n+=_,r++}});o>0&&this.atomicStore(this.CONTROL_INDICES.DEBUG_TAIL,E),r>0&&(s.message.count=r,s.message.buffer=s.buffer,this.port.postMessage(s.message))}async handleMessage(e){let{data:t}=e;try{if(t.type==="osc"){this.mode==="postMessage"&&t.oscData&&(this.writeOscToRingBuffer(t.oscData,t.sourceId??0),this.recordOscReceived(t.oscData.byteLength,t.bypassCategory));return}if(t.type==="addOscPort"){let s=e.ports[0];if(s){let i=t.sourceId??0;this.portSourceIds.set(s,i),s.onmessage=r=>{if(r.data.type==="osc"&&r.data.oscData){let n=r.data.sourceId??this.portSourceIds.get(s)??0;this.writeOscToRingBuffer(r.data.oscData,n),this.recordOscReceived(r.data.oscData.byteLength,r.data.bypassCategory)}},this.oscPorts.push(s)}return}if(t.type==="clearSched"){if(this.CONTROL_INDICES){let s=this.atomicLoad(this.CONTROL_INDICES.IN_HEAD);this.atomicStore(this.CONTROL_INDICES.IN_TAIL,s)}this.pendingClearSched=!0,t.ack&&this.port.postMessage({type:"clearSchedAck"});return}if(t.type==="init"&&(this.mode=t.mode||"sab",t.snapshotIntervalMs&&(this.treeSnapshotMinInterval=t.snapshotIntervalMs/1e3),this.mode==="sab"&&t.sharedBuffer&&(this.sharedBuffer=t.sharedBuffer,this.atomicView=new Int32Array(this.sharedBuffer),this.uint8View=new Uint8Array(this.sharedBuffer),this.dataView=new DataView(this.sharedBuffer))),t.type==="loadWasm"){if(t.wasmBytes){let s;if(this.mode==="sab"){if(s=t.wasmMemory,!s){this.port.postMessage({type:"error",error:"No WASM memory provided!"});return}}else{let n=t.memoryPages||1280;s=new WebAssembly.Memory({initial:n,maximum:n,shared:!0})}this.wasmMemory=s,this.worldOptions=t.worldOptions||{},this.sampleRate=t.sampleRate||48e3;let i={env:{memory:s,emscripten_asm_const_double:()=>Date.now()*1e3,__syscall_getdents64:()=>0,__syscall_unlinkat:()=>0,_emscripten_init_main_thread_js:()=>{},_emscripten_thread_mailbox_await:()=>{},_emscripten_thread_set_strongref:()=>{},emscripten_exit_with_live_runtime:()=>{},_emscripten_receive_on_main_thread_js:()=>{},emscripten_check_blocking_allowed:()=>{},_emscripten_thread_cleanup:()=>{},emscripten_num_logical_cores:()=>1,_emscripten_notify_mailbox_postmessage:()=>{}},wasi_snapshot_preview1:{clock_time_get:(n,E,o)=>{let c=new DataView(s.buffer),_=BigInt(Math.floor(Date.now()*1e6));return c.setBigUint64(o,_,!0),0},environ_sizes_get:()=>0,environ_get:()=>0,fd_close:()=>0,fd_write:()=>0,fd_seek:()=>0,fd_read:()=>0,proc_exit:n=>{console.error("[AudioWorklet] WASM tried to exit with code:",n)}}},r=await WebAssembly.compile(t.wasmBytes);if(this.wasmInstance=await WebAssembly.instantiate(r,i),this.wasmInstance.exports.get_ring_buffer_base&&(this.ringBufferBase=this.wasmInstance.exports.get_ring_buffer_base(),this.loadBufferConstants(),this.calculateBufferIndices(this.ringBufferBase),this.initPMPools(),this.writeWorldOptionsToMemory(),this.wasmInstance.exports.init_memory)){this.wasmInstance.exports.init_memory(this.sampleRate),this.isInitialized=!0;let n=this.mode==="postMessage"?this.readMetricsAndTreeBuffer():void 0,E={type:"initialized",success:!0,ringBufferBase:this.ringBufferBase,bufferConstants:this.bufferConstants,exports:Object.keys(this.wasmInstance.exports),initialSnapshot:n};this.port.postMessage(E,n?[n]:[])}}else if(t.wasmInstance&&(this.wasmInstance=t.wasmInstance,this.wasmInstance.exports.get_ring_buffer_base&&(this.ringBufferBase=this.wasmInstance.exports.get_ring_buffer_base(),this.loadBufferConstants(),this.calculateBufferIndices(this.ringBufferBase),this.initPMPools(),this.writeWorldOptionsToMemory(),this.wasmInstance.exports.init_memory))){this.wasmInstance.exports.init_memory(this.sampleRate),this.isInitialized=!0;let s=this.mode==="postMessage"?this.readMetricsAndTreeBuffer():void 0,i={type:"initialized",success:!0,ringBufferBase:this.ringBufferBase,bufferConstants:this.bufferConstants,exports:Object.keys(this.wasmInstance.exports),initialSnapshot:s};this.port.postMessage(i,s?[s]:[])}}if(t.type==="getVersion")if(this.wasmInstance&&this.wasmInstance.exports.get_supersonic_version_string){let s=this.wasmInstance.exports.get_supersonic_version_string(),i=new Uint8Array(this.wasmMemory.buffer),r="";for(let n=s;i[n]!==0;n++)r+=String.fromCharCode(i[n]);this.port.postMessage({type:"version",version:r})}else this.port.postMessage({type:"version",version:"unknown"});if(t.type==="getTimeOffset")if(this.wasmInstance&&this.wasmInstance.exports.get_time_offset){let s=this.wasmInstance.exports.get_time_offset();this.port.postMessage({type:"timeOffset",offset:s})}else console.error("[AudioWorklet] get_time_offset not available! wasmInstance:",!!this.wasmInstance),this.port.postMessage({type:"error",error:"get_time_offset function not available in WASM exports"});if(t.type==="setNTPStartTime"&&this.wasmMemory&&this.ringBufferBase!==null&&this.bufferConstants){let s=this.ringBufferBase+this.bufferConstants.NTP_START_TIME_START,i=new Float64Array(this.wasmMemory.buffer,s,1);i[0]=t.ntpStartTime}if(t.type==="setDriftOffset"&&this.wasmMemory&&this.ringBufferBase!==null&&this.bufferConstants){let s=this.ringBufferBase+this.bufferConstants.DRIFT_OFFSET_START,i=new Int32Array(this.wasmMemory.buffer,s,1);i[0]=t.driftOffsetMs}if(t.type==="setGlobalOffset"&&this.wasmMemory&&this.ringBufferBase!==null&&this.bufferConstants){let s=this.ringBufferBase+this.bufferConstants.GLOBAL_OFFSET_START,i=new Int32Array(this.wasmMemory.buffer,s,1);i[0]=t.globalOffsetMs}if(t.type==="getMetrics"){let s=this.metricsView?new Uint32Array(this.metricsView):null;this.port.postMessage({type:"metricsSnapshot",requestId:t.requestId,metrics:s})}if(t.type==="copyBufferData")try{let{copyId:s,ptr:i,data:r}=t;if(!this.wasmMemory||!this.wasmMemory.buffer)throw new Error("WASM memory not initialized");let n=new Float32Array(r);new Float32Array(this.wasmMemory.buffer,i,n.length).set(n),this.port.postMessage({type:"bufferCopied",copyId:s,success:!0})}catch(s){console.error("[AudioWorklet] Buffer copy failed:",s),this.port.postMessage({type:"bufferCopied",copyId:t.copyId,success:!1,error:s.message})}}catch(s){console.error("[AudioWorklet] Error handling message:",s),this.port.postMessage({type:"error",error:s.message,stack:s.stack})}}process(e,t,s){if(this.processCallCount++,!this.isInitialized)return!0;try{if(this.wasmInstance&&this.wasmInstance.exports.process_audio){this.pendingClearSched&&(this.pendingClearSched=!1,this.wasmInstance.exports.clear_scheduler&&this.wasmInstance.exports.clear_scheduler());let i=currentTime,r=e[0]?.length||0,n=t[0]?.length||0;if(r>0&&this.wasmInstance?.exports?.get_audio_input_bus)try{let o=this.wasmInstance.exports.get_audio_input_bus(),c=this.wasmInstance.exports.get_audio_buffer_samples();if(o&&o>0){let _=this.sharedBuffer||this.wasmMemory?.buffer;if(_){let u=this.worldOptions?.numInputBusChannels||2,f=Math.min(r,u);(!this.inputView||this.lastInputBusPtr!==o||this.lastInputChannels!==u)&&(this.inputView=new Float32Array(_,o,c*u),this.lastInputBusPtr=o,this.lastInputChannels=u);for(let h=0;h<f;h++)e[0]?.[h]&&this.inputView.set(e[0][h],h*c)}}}catch{}let E=this.wasmInstance.exports.process_audio(i,n,r);if(this.wasmInstance.exports.get_audio_output_bus&&t[0]&&t[0].length>=2)try{let o=this.wasmInstance.exports.get_audio_output_bus(),c=this.wasmInstance.exports.get_audio_buffer_samples();if(o&&o>0){let _=this.wasmInstance.exports.memory||this.wasmMemory;if(!_||!_.buffer)return!0;let u=_.buffer,f=u.byteLength,h=o+c*2*4;if(o<0||o>f||h>f)return!0;(!this.audioView||this.lastAudioBufferPtr!==o||this.lastWasmBufferSize!==f||u!==this.audioView.buffer)&&(this.audioView=new Float32Array(u,o,c*2),this.lastAudioBufferPtr=o,this.lastWasmBufferSize=f),(!this.leftChannelView||this.lastNumSamples!==c||this.leftChannelView.buffer!==this.audioView.buffer)&&(this.leftChannelView=this.audioView.subarray(0,c),this.rightChannelView=this.audioView.subarray(c,c*2),this.lastNumSamples=c),t[0][0].set(this.leftChannelView),t[0][1].set(this.rightChannelView)}}catch{}if(this.mode==="postMessage")this.readOscReplies(),this.readDebugMessages(),this.checkAndSendSnapshot(i)&&this.sendLogEntries();else if(this.atomicView){let o=this.atomicLoad(this.CONTROL_INDICES.OUT_HEAD),c=this.atomicLoad(this.CONTROL_INDICES.OUT_TAIL);o!==c&&Atomics.notify(this.atomicView,this.CONTROL_INDICES.OUT_HEAD,1);let _=this.atomicLoad(this.CONTROL_INDICES.DEBUG_HEAD),u=this.atomicLoad(this.CONTROL_INDICES.DEBUG_TAIL);_!==u&&Atomics.notify(this.atomicView,this.CONTROL_INDICES.DEBUG_HEAD,1),Atomics.notify(this.atomicView,this.CONTROL_INDICES.IN_TAIL,1)}return this.processCallCount%3750===0&&this.checkStatus(),E!==0}}catch(i){console.error("[AudioWorklet] process() error:",i),console.error("[AudioWorklet] Stack:",i.stack),this.atomicView&&this.mode==="sab"&&Atomics.or(this.atomicView,this.CONTROL_INDICES.STATUS_FLAGS,this.STATUS_FLAGS.WASM_ERROR),this.metricsView&&(this.mode==="sab"?Atomics.add(this.metricsView,7,1):this.metricsView[7]++)}return!0}checkStatus(){if(!this.atomicView)return;let e=this.atomicLoad(this.CONTROL_INDICES.STATUS_FLAGS);if(e!==this.STATUS_FLAGS.OK){this._statusObj.bufferFull=!!(e&this.STATUS_FLAGS.BUFFER_FULL),this._statusObj.overrun=!!(e&this.STATUS_FLAGS.OVERRUN),this._statusObj.wasmError=!!(e&this.STATUS_FLAGS.WASM_ERROR),this._statusObj.fragmented=!!(e&this.STATUS_FLAGS.FRAGMENTED_MSG),this._metricsObj.processCount=this.metricsView[0],this._metricsObj.messagesProcessed=this.metricsView[1],this._metricsObj.messagesDropped=this.metricsView[2],this._metricsObj.schedulerQueueDepth=this.metricsView[3],this._metricsObj.schedulerQueueMax=this.metricsView[4],this._metricsObj.schedulerQueueDropped=this.metricsView[5],this._statusMessage.flags=e,this.port.postMessage(this._statusMessage);let t=e&this.STATUS_FLAGS.BUFFER_FULL;this.atomicStore(this.CONTROL_INDICES.STATUS_FLAGS,t)}}};registerProcessor("scsynth-processor",R);})();
|
|
1
|
+
(()=>{function O(T,e,t){return(t-1-T+e)%t}function w({uint8View:T,dataView:e,bufferStart:t,bufferSize:s,head:i,payload:r,sequence:o,messageMagic:c,headerSize:n,sourceId:E=0,headerScratch:_=null,headerScratchView:u=null}){let f=r.length,a=n+f+3&-4,l=s-i;if(a>l){let S=_||new Uint8Array(n),m=u||new DataView(S.buffer);m.setUint32(0,c,!0),m.setUint32(4,a,!0),m.setUint32(8,o,!0),m.setUint32(12,E,!0);let I=t+i,A=t;if(l>=n){T.set(S,I);let p=l-n;p>0&&T.set(r.subarray(0,p),I+n),T.set(r.subarray(p),A)}else{T.set(S.subarray(0,l),I),T.set(S.subarray(l),A);let p=n-l;T.set(r,A+p)}}else{let S=t+i;e.setUint32(S,c,!0),e.setUint32(S+4,a,!0),e.setUint32(S+8,o,!0),e.setUint32(S+12,E,!0),T.set(r,S+n)}return(i+a)%s}function C({uint8View:T,dataView:e,bufferStart:t,bufferSize:s,head:i,tail:r,messageMagic:o,paddingMagic:c,headerSize:n,maxMessages:E=1/0,onMessage:_,onCorruption:u}){let f=r,h=0,a=l=>{let S=l;if(S+4<=s)return e.getUint32(t+S,!0);let m=0;for(let I=0;I<4;I++)m|=T[t+(S+I)%s]<<I*8;return m};for(;f!==i&&h<E;){let l=s-f,S;if(l>=4?S=e.getUint32(t+f,!0):S=a(f),S===c){f=0;continue}if(S!==o){u&&u(f),f=(f+1)%s;continue}let m=a((f+4)%s),I=a((f+8)%s),A=a((f+12)%s);if(m<n||m>s){u&&u(f),f=(f+1)%s;continue}let p=m-n,M=t+(f+n)%s;_(M,p,I,A),f=(f+m)%s,h++}return{newTail:f,messagesRead:h}}function D(T,e){let t=T+e;return{IN_HEAD:(t+0)/4,IN_TAIL:(t+4)/4,OUT_HEAD:(t+8)/4,OUT_TAIL:(t+12)/4,DEBUG_HEAD:(t+16)/4,DEBUG_TAIL:(t+20)/4,IN_SEQUENCE:(t+24)/4,OUT_SEQUENCE:(t+28)/4,DEBUG_SEQUENCE:(t+32)/4,STATUS_FLAGS:(t+36)/4,IN_WRITE_LOCK:(t+40)/4,IN_LOG_TAIL:(t+44)/4}}var d={MAX_REPLY_MESSAGES:64,MAX_DEBUG_MESSAGES:32,MAX_LOG_ENTRIES:100,REPLY_BUFFER_SIZE:128*1024,DEBUG_BUFFER_SIZE:64*1024,LOG_BUFFER_SIZE:256*1024,LOG_MAX_MESSAGE_SIZE:16*1024,MAX_OSC_MESSAGE_SIZE:8192},R=class extends AudioWorkletProcessor{constructor(){super(),this.mode="sab",this.sharedBuffer=null,this.wasmModule=null,this.wasmInstance=null,this.isInitialized=!1,this.processCallCount=0,this.lastStatusCheck=0,this.ringBufferBase=null,this.pendingClearSched=!1,this.audioView=null,this.lastAudioBufferPtr=0,this.lastWasmBufferSize=0,this.lastTreeVersion=-1,this.treeSnapshotsSent=0,this.lastTreeSendTime=-1,this.treeSnapshotMinInterval=.15,this.atomicView=null,this.uint8View=null,this.dataView=null,this.localClockOffsetView=null,this.bufferConstants=null,this.CONTROL_INDICES=null,this.metricsView=null,this.STATUS_FLAGS={OK:0,BUFFER_FULL:1,OVERRUN:2,WASM_ERROR:4,FRAGMENTED_MSG:8},this.oscPorts=[],this.portSourceIds=new Map,this.leftChannelView=null,this.rightChannelView=null,this.lastNumSamples=0,this.pmPools=null,this._statusObj={bufferFull:!1,overrun:!1,wasmError:!1,fragmented:!1},this._metricsObj={processCount:0,messagesProcessed:0,messagesDropped:0,schedulerQueueDepth:0,schedulerQueueMax:0,schedulerQueueDropped:0},this._statusMessage={type:"status",flags:0,status:this._statusObj,metrics:this._metricsObj},this.port.onmessage=this.handleMessage.bind(this)}loadBufferConstants(){if(!this.wasmInstance||!this.wasmInstance.exports.get_buffer_layout)throw new Error("WASM instance does not export get_buffer_layout");let e=this.wasmInstance.exports.get_buffer_layout(),t=this.wasmMemory;if(!t)throw new Error("WASM memory not available");let s=new Uint32Array(t.buffer,e,34),i=new Uint8Array(t.buffer,e,140);if(this.bufferConstants={IN_BUFFER_START:s[0],IN_BUFFER_SIZE:s[1],OUT_BUFFER_START:s[2],OUT_BUFFER_SIZE:s[3],DEBUG_BUFFER_START:s[4],DEBUG_BUFFER_SIZE:s[5],CONTROL_START:s[6],CONTROL_SIZE:s[7],METRICS_START:s[8],METRICS_SIZE:s[9],NODE_TREE_START:s[10],NODE_TREE_SIZE:s[11],NODE_TREE_HEADER_SIZE:s[12],NODE_TREE_ENTRY_SIZE:s[13],NODE_TREE_DEF_NAME_SIZE:s[14],NODE_TREE_MIRROR_MAX_NODES:s[15],NTP_START_TIME_START:s[16],NTP_START_TIME_SIZE:s[17],DRIFT_OFFSET_START:s[18],DRIFT_OFFSET_SIZE:s[19],GLOBAL_OFFSET_START:s[20],GLOBAL_OFFSET_SIZE:s[21],AUDIO_CAPTURE_START:s[22],AUDIO_CAPTURE_SIZE:s[23],AUDIO_CAPTURE_HEADER_SIZE:s[24],AUDIO_CAPTURE_FRAMES:s[25],AUDIO_CAPTURE_CHANNELS:s[26],AUDIO_CAPTURE_SAMPLE_RATE:s[27],TOTAL_BUFFER_SIZE:s[28],MAX_MESSAGE_SIZE:s[29],MESSAGE_MAGIC:s[30],PADDING_MAGIC:s[31],scheduler_slot_size:s[32],scheduler_slot_count:s[33],DEBUG_PADDING_MARKER:i[136],MESSAGE_HEADER_SIZE:16},this.bufferConstants.MESSAGE_MAGIC!==3735928559)throw new Error("Invalid buffer constants from WASM")}calculateBufferIndices(e){if(!this.bufferConstants)throw new Error("Buffer constants not loaded. Call loadBufferConstants() first.");let t=this.bufferConstants.CONTROL_START,s=this.bufferConstants.METRICS_START;if(this.CONTROL_INDICES=D(e,t),this.mode==="sab"){let i=e+s;this.metricsView=new Uint32Array(this.sharedBuffer,i,this.bufferConstants.METRICS_SIZE/4)}else{this.atomicView=new Int32Array(this.wasmMemory.buffer),this.uint8View=new Uint8Array(this.wasmMemory.buffer),this.dataView=new DataView(this.wasmMemory.buffer);let i=e+s;this.metricsView=new Uint32Array(this.wasmMemory.buffer,i,this.bufferConstants.METRICS_SIZE/4);let r=this.atomicLoad(this.CONTROL_INDICES.IN_HEAD);this.atomicStore(this.CONTROL_INDICES.IN_LOG_TAIL,r)}}writeWorldOptionsToMemory(){if(!this.worldOptions||!this.wasmMemory)return;let e=this.ringBufferBase+65536,t=new Uint32Array(this.wasmMemory.buffer,e,32),s=new Float32Array(this.wasmMemory.buffer,e,32);t[0]=this.worldOptions.numBuffers||1024,t[1]=this.worldOptions.maxNodes||1024,t[2]=this.worldOptions.maxGraphDefs||1024,t[3]=this.worldOptions.maxWireBufs||64,t[4]=this.worldOptions.numAudioBusChannels||128,t[5]=this.worldOptions.numInputBusChannels||0,t[6]=this.worldOptions.numOutputBusChannels||0,t[7]=this.worldOptions.numControlBusChannels||4096,t[8]=this.worldOptions.bufLength||128,t[9]=this.worldOptions.realTimeMemorySize||16384,t[10]=this.worldOptions.numRGens||64,t[11]=this.worldOptions.realTime?1:0,t[12]=this.worldOptions.memoryLocking?1:0,t[13]=this.worldOptions.loadGraphDefs||0,t[14]=this.worldOptions.preferredSampleRate||0,t[15]=this.worldOptions.verbosity||0,t[16]=this.mode==="postMessage"?1:0}js_debug(e){if(!(!this.uint8View||!this.atomicView||!this.CONTROL_INDICES||!this.ringBufferBase))try{let t=this.bufferConstants.DEBUG_BUFFER_START,s=this.bufferConstants.DEBUG_BUFFER_SIZE,i=this.bufferConstants.DEBUG_PADDING_MARKER,r="[JS] "+e+`
|
|
2
|
+
`,c=new TextEncoder().encode(r);if(c.length>s)return;let n=this.CONTROL_INDICES.DEBUG_HEAD,E=this.atomicLoad(n),_=s-E,u=E;c.length>_&&(this.uint8View[this.ringBufferBase+t+E]=i,u=0);let f=this.ringBufferBase+t;for(let a=0;a<c.length;a++)this.uint8View[f+u+a]=c[a];let h=u+c.length;this.atomicStore(n,h),this.mode==="sab"&&Atomics.notify(this.atomicView,n,1)}catch{}}atomicLoad(e){return this.mode==="sab"?Atomics.load(this.atomicView,e):this.atomicView[e]}atomicStore(e,t){this.mode==="sab"?Atomics.store(this.atomicView,e,t):this.atomicView[e]=t}initPMPools(){if(this.mode!=="postMessage")return;let e=d;this.pmPools={replies:{message:{type:"oscReplies",messages:null,count:0},buffer:new ArrayBuffer(e.REPLY_BUFFER_SIZE),bufferView:null,entries:new Array(e.MAX_REPLY_MESSAGES).fill(null).map(()=>({offset:0,length:0,sequence:0}))},debug:{message:{type:"debugRawBatch",messages:null,count:0},buffer:new ArrayBuffer(e.DEBUG_BUFFER_SIZE),bufferView:null,entries:new Array(e.MAX_DEBUG_MESSAGES).fill(null).map(()=>({offset:0,length:0,sequence:0}))},snapshot:{message:{type:"snapshot",buffer:null,snapshotsSent:0},buffer:null,bufferView:null,size:0},log:{message:{type:"oscLog",entries:null,count:0,buffer:null},buffer:new ArrayBuffer(e.LOG_BUFFER_SIZE),bufferView:null,entries:new Array(e.MAX_LOG_ENTRIES).fill(null).map(()=>({offset:0,length:0,originalLength:0,sourceId:0,sequence:0}))},incoming:{headerBytes:new Uint8Array(16),headerView:null}};let t=this.pmPools;if(t.replies.bufferView=new Uint8Array(t.replies.buffer),t.debug.bufferView=new Uint8Array(t.debug.buffer),t.log.bufferView=new Uint8Array(t.log.buffer),t.replies.message.messages=t.replies.entries,t.debug.message.messages=t.debug.entries,t.log.message.entries=t.log.entries,t.incoming.headerView=new DataView(t.incoming.headerBytes.buffer),this.bufferConstants&&this.wasmMemory){let s=this.bufferConstants,i=s.METRICS_SIZE+s.NODE_TREE_SIZE;t.snapshot.buffer=new ArrayBuffer(i),t.snapshot.bufferView=new Uint8Array(t.snapshot.buffer),t.snapshot.size=i,t.snapshot.message.buffer=t.snapshot.buffer;let r=this.ringBufferBase+s.METRICS_START;t.snapshot.sourceView=new Uint8Array(this.wasmMemory.buffer,r,i)}}writeOscToRingBuffer(e,t=0){if(!this.bufferConstants||!this.uint8View||!this.pmPools)return!1;let s=this.bufferConstants.IN_BUFFER_SIZE,i=this.bufferConstants.MESSAGE_HEADER_SIZE,r=this.ringBufferBase+this.bufferConstants.IN_BUFFER_START,o=e.byteLength,n=i+o+3&-4,E=this.atomicLoad(this.CONTROL_INDICES.IN_HEAD),_=this.atomicLoad(this.CONTROL_INDICES.IN_TAIL),u=O(E,_,s);if(n>u)return console.error("[AudioWorklet] Ring buffer full, dropping OSC message"),!1;let f=this.atomicLoad(this.CONTROL_INDICES.IN_SEQUENCE);this.atomicStore(this.CONTROL_INDICES.IN_SEQUENCE,f+1);let h=new Uint8Array(e),a=w({uint8View:this.uint8View,dataView:this.dataView,bufferStart:r,bufferSize:s,head:E,payload:h,sequence:f,messageMagic:this.bufferConstants.MESSAGE_MAGIC,headerSize:i,sourceId:t,headerScratch:this.pmPools.incoming.headerBytes,headerScratchView:this.pmPools.incoming.headerView});return this.atomicStore(this.CONTROL_INDICES.IN_HEAD,a),!0}readOscReplies(){if(!this.pmPools)return;let e=this.atomicLoad(this.CONTROL_INDICES.OUT_HEAD),t=this.atomicLoad(this.CONTROL_INDICES.OUT_TAIL);if(e===t)return;let s=this.pmPools.replies,i=d,r=0,o=0,{newTail:c,messagesRead:n}=C({uint8View:this.uint8View,dataView:this.dataView,bufferStart:this.ringBufferBase+this.bufferConstants.OUT_BUFFER_START,bufferSize:this.bufferConstants.OUT_BUFFER_SIZE,head:e,tail:t,messageMagic:this.bufferConstants.MESSAGE_MAGIC,paddingMagic:this.bufferConstants.PADDING_MAGIC,headerSize:this.bufferConstants.MESSAGE_HEADER_SIZE,maxMessages:i.MAX_REPLY_MESSAGES,onMessage:(E,_,u,f)=>{if(r>=i.MAX_REPLY_MESSAGES||o+_>i.REPLY_BUFFER_SIZE)return;for(let a=0;a<_;a++)s.bufferView[o+a]=this.uint8View[E+a];let h=s.entries[r];h.offset=o,h.length=_,h.sequence=u,o+=_,r++}});n>0&&this.atomicStore(this.CONTROL_INDICES.OUT_TAIL,c),r>0&&(s.message.count=r,s.message.buffer=s.buffer,this.port.postMessage(s.message))}readNodeTree(){if(!this.bufferConstants||!this.wasmMemory||this.ringBufferBase===null)return null;let e=this.bufferConstants,t=this.ringBufferBase+e.NODE_TREE_START,s=new Uint32Array(this.wasmMemory.buffer,t,2),i=s[0],r=s[1],o=t+e.NODE_TREE_HEADER_SIZE,c=e.NODE_TREE_MIRROR_MAX_NODES,n=e.NODE_TREE_ENTRY_SIZE,E=e.NODE_TREE_DEF_NAME_SIZE,_=new DataView(this.wasmMemory.buffer,o,c*n),u=[],f=0;for(let h=0;h<c&&f<i;h++){let a=h*n,l=_.getInt32(a,!0);if(l===-1)continue;f++;let S=o+a+24,m=new Uint8Array(this.wasmMemory.buffer,S,E),I="";for(let A=0;A<E&&m[A]!==0;A++)I+=String.fromCharCode(m[A]);u.push({id:l,parentId:_.getInt32(a+4,!0),isGroup:_.getInt32(a+8,!0)===1,prevId:_.getInt32(a+12,!0),nextId:_.getInt32(a+16,!0),headId:_.getInt32(a+20,!0),defName:I})}return{nodeCount:i,version:r,nodes:u}}readMetrics(){return this.metricsView?new Uint32Array(this.metricsView):null}recordOscReceived(e,t=null){if(this.metricsView){if(this.mode==="sab")Atomics.add(this.metricsView,24,1),Atomics.add(this.metricsView,25,e);else if(this.metricsView[24]++,this.metricsView[25]+=e,t){this.metricsView[22]++;let i={nonBundle:38,immediate:39,nearFuture:40,late:41}[t];i!==void 0&&this.metricsView[i]++}}}checkAndSendSnapshot(e){let t=this.bufferConstants;if(!t||!this.wasmMemory||this.ringBufferBase===null||!this.pmPools)return!1;let i=(this.ringBufferBase+t.NODE_TREE_START+4)/4,r=this.atomicView[i];if(r!==this.lastTreeVersion)this.lastTreeVersion=r,this.lastTreeSendTime=e;else{if(this.lastTreeSendTime>=0&&e-this.lastTreeSendTime<this.treeSnapshotMinInterval)return!1;this.lastTreeSendTime=e}let c=this.pmPools.snapshot;return!c.buffer||!c.sourceView?!1:(c.bufferView.set(c.sourceView),this.treeSnapshotsSent++,c.message.snapshotsSent=this.treeSnapshotsSent,this.port.postMessage(c.message),!0)}readMetricsAndTreeBuffer(){if(!this.bufferConstants||!this.wasmMemory||this.ringBufferBase===null)return null;let e=this.bufferConstants,t=this.ringBufferBase+e.METRICS_START,s=e.METRICS_SIZE+e.NODE_TREE_SIZE,i=new Uint8Array(this.wasmMemory.buffer,t,s),r=new ArrayBuffer(s);return new Uint8Array(r).set(i),r}sendLogEntries(){if(!this.CONTROL_INDICES||!this.bufferConstants||!this.pmPools)return;let e=this.atomicLoad(this.CONTROL_INDICES.IN_HEAD),t=this.atomicLoad(this.CONTROL_INDICES.IN_LOG_TAIL);if(e===t)return;let s=this.pmPools.log,i=d,r=0,o=0,{newTail:c,messagesRead:n}=C({uint8View:this.uint8View,dataView:this.dataView,bufferStart:this.ringBufferBase+this.bufferConstants.IN_BUFFER_START,bufferSize:this.bufferConstants.IN_BUFFER_SIZE,head:e,tail:t,messageMagic:this.bufferConstants.MESSAGE_MAGIC,paddingMagic:this.bufferConstants.PADDING_MAGIC,headerSize:this.bufferConstants.MESSAGE_HEADER_SIZE,maxMessages:i.MAX_LOG_ENTRIES,onMessage:(E,_,u,f)=>{if(r>=i.MAX_LOG_ENTRIES)return;let h=Math.min(_,i.LOG_MAX_MESSAGE_SIZE);if(o+h>i.LOG_BUFFER_SIZE)return;for(let l=0;l<h;l++)s.bufferView[o+l]=this.uint8View[E+l];let a=s.entries[r];a.offset=o,a.length=h,a.originalLength=_,a.sourceId=f??0,a.sequence=u,o+=h,r++}});n>0&&this.atomicStore(this.CONTROL_INDICES.IN_LOG_TAIL,c),r>0&&(s.message.count=r,s.message.buffer=s.buffer,this.port.postMessage(s.message))}readDebugMessages(){if(!this.pmPools)return;let e=this.atomicLoad(this.CONTROL_INDICES.DEBUG_HEAD),t=this.atomicLoad(this.CONTROL_INDICES.DEBUG_TAIL);if(e===t)return;let s=this.pmPools.debug,i=d,r=0,o=0,{newTail:c,messagesRead:n}=C({uint8View:this.uint8View,dataView:this.dataView,bufferStart:this.ringBufferBase+this.bufferConstants.DEBUG_BUFFER_START,bufferSize:this.bufferConstants.DEBUG_BUFFER_SIZE,head:e,tail:t,messageMagic:this.bufferConstants.MESSAGE_MAGIC,paddingMagic:this.bufferConstants.PADDING_MAGIC,headerSize:this.bufferConstants.MESSAGE_HEADER_SIZE,maxMessages:i.MAX_DEBUG_MESSAGES,onMessage:(E,_,u,f)=>{if(r>=i.MAX_DEBUG_MESSAGES||o+_>i.DEBUG_BUFFER_SIZE)return;for(let a=0;a<_;a++)s.bufferView[o+a]=this.uint8View[E+a];let h=s.entries[r];h.offset=o,h.length=_,h.sequence=u,o+=_,r++}});n>0&&this.atomicStore(this.CONTROL_INDICES.DEBUG_TAIL,c),r>0&&(s.message.count=r,s.message.buffer=s.buffer,this.port.postMessage(s.message))}async handleMessage(e){let{data:t}=e;try{if(t.type==="osc"){this.mode==="postMessage"&&t.oscData&&(this.writeOscToRingBuffer(t.oscData,t.sourceId??0),this.recordOscReceived(t.oscData.byteLength,t.bypassCategory));return}if(t.type==="addOscPort"){let s=e.ports[0];if(s){let i=t.sourceId??0;this.portSourceIds.set(s,i),s.onmessage=r=>{if(r.data.type==="osc"&&r.data.oscData){let o=r.data.sourceId??this.portSourceIds.get(s)??0;this.writeOscToRingBuffer(r.data.oscData,o),this.recordOscReceived(r.data.oscData.byteLength,r.data.bypassCategory)}},this.oscPorts.push(s)}return}if(t.type==="clearSched"){if(this.CONTROL_INDICES){let s=this.atomicLoad(this.CONTROL_INDICES.IN_HEAD);this.atomicStore(this.CONTROL_INDICES.IN_TAIL,s)}this.pendingClearSched=!0,t.ack&&this.port.postMessage({type:"clearSchedAck"});return}if(t.type==="init"&&(this.mode=t.mode||"sab",t.snapshotIntervalMs&&(this.treeSnapshotMinInterval=t.snapshotIntervalMs/1e3),this.mode==="sab"&&t.sharedBuffer&&(this.sharedBuffer=t.sharedBuffer,this.atomicView=new Int32Array(this.sharedBuffer),this.uint8View=new Uint8Array(this.sharedBuffer),this.dataView=new DataView(this.sharedBuffer))),t.type==="loadWasm"){if(t.wasmBytes){let s;if(this.mode==="sab"){if(s=t.wasmMemory,!s){this.port.postMessage({type:"error",error:"No WASM memory provided!"});return}}else{let o=t.memoryPages||1280;s=new WebAssembly.Memory({initial:o,maximum:o,shared:!0})}this.wasmMemory=s,this.worldOptions=t.worldOptions||{},this.sampleRate=t.sampleRate||48e3;let i={env:{memory:s,emscripten_asm_const_double:()=>Date.now()*1e3,__syscall_getdents64:()=>0,__syscall_unlinkat:()=>0,_emscripten_init_main_thread_js:()=>{},_emscripten_thread_mailbox_await:()=>{},_emscripten_thread_set_strongref:()=>{},emscripten_exit_with_live_runtime:()=>{},_emscripten_receive_on_main_thread_js:()=>{},emscripten_check_blocking_allowed:()=>{},_emscripten_thread_cleanup:()=>{},emscripten_num_logical_cores:()=>1,_emscripten_notify_mailbox_postmessage:()=>{}},wasi_snapshot_preview1:{clock_time_get:(o,c,n)=>{let E=new DataView(s.buffer),_=BigInt(Math.floor(Date.now()*1e6));return E.setBigUint64(n,_,!0),0},environ_sizes_get:()=>0,environ_get:()=>0,fd_close:()=>0,fd_write:()=>0,fd_seek:()=>0,fd_read:()=>0,proc_exit:o=>{console.error("[AudioWorklet] WASM tried to exit with code:",o)}}},r=await WebAssembly.compile(t.wasmBytes);if(this.wasmInstance=await WebAssembly.instantiate(r,i),this.wasmInstance.exports.get_ring_buffer_base&&(this.ringBufferBase=this.wasmInstance.exports.get_ring_buffer_base(),this.loadBufferConstants(),this.calculateBufferIndices(this.ringBufferBase),this.initPMPools(),this.writeWorldOptionsToMemory(),this.wasmInstance.exports.init_memory)){this.wasmInstance.exports.init_memory(this.sampleRate),this.isInitialized=!0;let o=this.mode==="postMessage"?this.readMetricsAndTreeBuffer():void 0,c={type:"initialized",success:!0,ringBufferBase:this.ringBufferBase,bufferConstants:this.bufferConstants,exports:Object.keys(this.wasmInstance.exports),initialSnapshot:o};this.port.postMessage(c,o?[o]:[])}}else if(t.wasmInstance&&(this.wasmInstance=t.wasmInstance,this.wasmInstance.exports.get_ring_buffer_base&&(this.ringBufferBase=this.wasmInstance.exports.get_ring_buffer_base(),this.loadBufferConstants(),this.calculateBufferIndices(this.ringBufferBase),this.initPMPools(),this.writeWorldOptionsToMemory(),this.wasmInstance.exports.init_memory))){this.wasmInstance.exports.init_memory(this.sampleRate),this.isInitialized=!0;let s=this.mode==="postMessage"?this.readMetricsAndTreeBuffer():void 0,i={type:"initialized",success:!0,ringBufferBase:this.ringBufferBase,bufferConstants:this.bufferConstants,exports:Object.keys(this.wasmInstance.exports),initialSnapshot:s};this.port.postMessage(i,s?[s]:[])}}if(t.type==="getVersion")if(this.wasmInstance&&this.wasmInstance.exports.get_supersonic_version_string){let s=this.wasmInstance.exports.get_supersonic_version_string(),i=new Uint8Array(this.wasmMemory.buffer),r="";for(let o=s;i[o]!==0;o++)r+=String.fromCharCode(i[o]);this.port.postMessage({type:"version",version:r})}else this.port.postMessage({type:"version",version:"unknown"});if(t.type==="getTimeOffset")if(this.wasmInstance&&this.wasmInstance.exports.get_time_offset){let s=this.wasmInstance.exports.get_time_offset();this.port.postMessage({type:"timeOffset",offset:s})}else console.error("[AudioWorklet] get_time_offset not available! wasmInstance:",!!this.wasmInstance),this.port.postMessage({type:"error",error:"get_time_offset function not available in WASM exports"});if(t.type==="setNTPStartTime"&&this.wasmMemory&&this.ringBufferBase!==null&&this.bufferConstants){let s=this.ringBufferBase+this.bufferConstants.NTP_START_TIME_START,i=new Float64Array(this.wasmMemory.buffer,s,1);i[0]=t.ntpStartTime}if(t.type==="setDriftOffset"&&this.wasmMemory&&this.ringBufferBase!==null&&this.bufferConstants){let s=this.ringBufferBase+this.bufferConstants.DRIFT_OFFSET_START,i=new Int32Array(this.wasmMemory.buffer,s,1);i[0]=t.driftOffsetMs}if(t.type==="setGlobalOffset"&&this.wasmMemory&&this.ringBufferBase!==null&&this.bufferConstants){let s=this.ringBufferBase+this.bufferConstants.GLOBAL_OFFSET_START,i=new Int32Array(this.wasmMemory.buffer,s,1);i[0]=t.globalOffsetMs}if(t.type==="getMetrics"){let s=this.metricsView?new Uint32Array(this.metricsView):null;this.port.postMessage({type:"metricsSnapshot",requestId:t.requestId,metrics:s})}if(t.type==="copyBufferData")try{let{copyId:s,ptr:i,data:r}=t;if(!this.wasmMemory||!this.wasmMemory.buffer)throw new Error("WASM memory not initialized");let o=new Float32Array(r);new Float32Array(this.wasmMemory.buffer,i,o.length).set(o),this.port.postMessage({type:"bufferCopied",copyId:s,success:!0})}catch(s){console.error("[AudioWorklet] Buffer copy failed:",s),this.port.postMessage({type:"bufferCopied",copyId:t.copyId,success:!1,error:s.message})}}catch(s){console.error("[AudioWorklet] Error handling message:",s),this.port.postMessage({type:"error",error:s.message,stack:s.stack})}}process(e,t,s){if(this.processCallCount++,!this.isInitialized)return!0;try{if(this.wasmInstance&&this.wasmInstance.exports.process_audio){this.pendingClearSched&&(this.pendingClearSched=!1,this.wasmInstance.exports.clear_scheduler&&this.wasmInstance.exports.clear_scheduler());let i=currentTime,r=e[0]?.length||0,o=t[0]?.length||0;if(r>0&&this.wasmInstance?.exports?.get_audio_input_bus)try{let n=this.wasmInstance.exports.get_audio_input_bus(),E=this.wasmInstance.exports.get_audio_buffer_samples();if(n&&n>0){let _=this.sharedBuffer||this.wasmMemory?.buffer;if(_){let u=this.worldOptions?.numInputBusChannels||2,f=Math.min(r,u);(!this.inputView||this.lastInputBusPtr!==n||this.lastInputChannels!==u)&&(this.inputView=new Float32Array(_,n,E*u),this.lastInputBusPtr=n,this.lastInputChannels=u);for(let h=0;h<f;h++)e[0]?.[h]&&this.inputView.set(e[0][h],h*E)}}}catch{}let c=this.wasmInstance.exports.process_audio(i,o,r);if(this.wasmInstance.exports.get_audio_output_bus&&t[0]&&t[0].length>=2)try{let n=this.wasmInstance.exports.get_audio_output_bus(),E=this.wasmInstance.exports.get_audio_buffer_samples();if(n&&n>0){let _=this.wasmInstance.exports.memory||this.wasmMemory;if(!_||!_.buffer)return!0;let u=_.buffer,f=u.byteLength,h=n+E*2*4;if(n<0||n>f||h>f)return!0;(!this.audioView||this.lastAudioBufferPtr!==n||this.lastWasmBufferSize!==f||u!==this.audioView.buffer)&&(this.audioView=new Float32Array(u,n,E*2),this.lastAudioBufferPtr=n,this.lastWasmBufferSize=f),(!this.leftChannelView||this.lastNumSamples!==E||this.leftChannelView.buffer!==this.audioView.buffer)&&(this.leftChannelView=this.audioView.subarray(0,E),this.rightChannelView=this.audioView.subarray(E,E*2),this.lastNumSamples=E),t[0][0].set(this.leftChannelView),t[0][1].set(this.rightChannelView)}}catch{}if(this.mode==="postMessage")this.readOscReplies(),this.readDebugMessages(),this.checkAndSendSnapshot(i)&&this.sendLogEntries();else if(this.atomicView){let n=this.atomicLoad(this.CONTROL_INDICES.OUT_HEAD),E=this.atomicLoad(this.CONTROL_INDICES.OUT_TAIL);n!==E&&Atomics.notify(this.atomicView,this.CONTROL_INDICES.OUT_HEAD,1);let _=this.atomicLoad(this.CONTROL_INDICES.DEBUG_HEAD),u=this.atomicLoad(this.CONTROL_INDICES.DEBUG_TAIL);_!==u&&Atomics.notify(this.atomicView,this.CONTROL_INDICES.DEBUG_HEAD,1),Atomics.notify(this.atomicView,this.CONTROL_INDICES.IN_TAIL,1)}return this.processCallCount%3750===0&&this.checkStatus(),c!==0}}catch(i){console.error("[AudioWorklet] process() error:",i),console.error("[AudioWorklet] Stack:",i.stack),this.atomicView&&this.mode==="sab"&&Atomics.or(this.atomicView,this.CONTROL_INDICES.STATUS_FLAGS,this.STATUS_FLAGS.WASM_ERROR),this.metricsView&&(this.mode==="sab"?Atomics.add(this.metricsView,7,1):this.metricsView[7]++)}return!0}checkStatus(){if(!this.atomicView)return;let e=this.atomicLoad(this.CONTROL_INDICES.STATUS_FLAGS);if(e!==this.STATUS_FLAGS.OK){this._statusObj.bufferFull=!!(e&this.STATUS_FLAGS.BUFFER_FULL),this._statusObj.overrun=!!(e&this.STATUS_FLAGS.OVERRUN),this._statusObj.wasmError=!!(e&this.STATUS_FLAGS.WASM_ERROR),this._statusObj.fragmented=!!(e&this.STATUS_FLAGS.FRAGMENTED_MSG),this._metricsObj.processCount=this.metricsView[0],this._metricsObj.messagesProcessed=this.metricsView[1],this._metricsObj.messagesDropped=this.metricsView[2],this._metricsObj.schedulerQueueDepth=this.metricsView[3],this._metricsObj.schedulerQueueMax=this.metricsView[4],this._metricsObj.schedulerQueueDropped=this.metricsView[5],this._statusMessage.flags=e,this.port.postMessage(this._statusMessage);let t=e&this.STATUS_FLAGS.BUFFER_FULL;this.atomicStore(this.CONTROL_INDICES.STATUS_FLAGS,t)}}};registerProcessor("scsynth-processor",R);})();
|