UNPKG

@doc.e.dub/csound-browser

Version:

[![npm (scoped with tag)](https://shields.shivering-isles.com/npm/v/@csound/browser/latest)](https://www.npmjs.com/package/@csound/browser) [![GitHub Workflow Status](https://shields.shivering-isles.com/github/workflow/status/csound/csound/csound_wasm)](h

89 lines (79 loc) 3.48 kB
// exec log-event: msg => cb(msg) export const messageEventHandler = (worker) => (event) => { if (event.data.log) { if (worker && worker.publicEvents && worker.publicEvents.triggerMessage) { worker.publicEvents.triggerMessage(event.data.log); } else { // in case of errors, this can happen // in which case, it's good to see the log console.log(event.data.log); } } else if (event.data.sabWorker && worker && worker.hasSharedArrayBuffer) { if (event.data.sabWorker === "unlocked" && typeof worker.startPromiz === "function") { worker.startPromiz(); } } else if (event.data.playStateChange && worker && worker.onPlayStateChange) { worker.onPlayStateChange(event.data.playStateChange); } }; const iterableMessageChannel = () => { const { port1, port2 } = new MessageChannel(); return [port1, port2]; }; const safelyClosePorts = ([p1, p2]) => { if (typeof p1.close !== "undefined") { try { p1.close(); // eslint-disable unicorn/prefer-optional-catch-binding } catch (_) {} } if (typeof p2.close !== "undefined") { try { p2.close(); // eslint-disable unicorn/prefer-optional-catch-binding } catch (_) {} } }; export class IPCMessagePorts { constructor() { const { port1: mainMessagePort, port2: workerMessagePort } = new MessageChannel(); this.mainMessagePort = mainMessagePort; this.workerMessagePort = workerMessagePort; const { port1: mainMessagePortAudio, port2: workerMessagePortAudio } = new MessageChannel(); this.mainMessagePortAudio = mainMessagePortAudio; this.workerMessagePortAudio = workerMessagePortAudio; const { port1: csoundWorkerFrameRequestPort, port2: audioWorkerFrameRequestPort, } = new MessageChannel(); this.csoundWorkerFrameRequestPort = csoundWorkerFrameRequestPort; this.audioWorkerFrameRequestPort = audioWorkerFrameRequestPort; const { port1: csoundWorkerAudioInputPort, port2: audioWorkerAudioInputPort, } = new MessageChannel(); this.csoundWorkerAudioInputPort = csoundWorkerAudioInputPort; this.audioWorkerAudioInputPort = audioWorkerAudioInputPort; const { port1: csoundWorkerRtMidiPort, port2: csoundMainRtMidiPort } = new MessageChannel(); this.csoundWorkerRtMidiPort = csoundWorkerRtMidiPort; this.csoundMainRtMidiPort = csoundMainRtMidiPort; const { port1: sabWorkerCallbackReply, port2: sabMainCallbackReply } = new MessageChannel(); this.sabWorkerCallbackReply = sabWorkerCallbackReply; this.sabMainCallbackReply = sabMainCallbackReply; const { port1: mainFilesystemPort, port2: workerFilesystemPort } = new MessageChannel(); this.mainFilesystemPort = mainFilesystemPort; this.workerFilesystemPort = workerFilesystemPort; this.restartAudioWorkerPorts = this.restartAudioWorkerPorts.bind(this); } restartAudioWorkerPorts() { safelyClosePorts([this.csoundWorkerAudioInputPort, this.audioWorkerAudioInputPort]); [this.csoundWorkerAudioInputPort, this.audioWorkerAudioInputPort] = iterableMessageChannel(); safelyClosePorts([this.mainMessagePortAudio, this.workerMessagePortAudio]); [this.mainMessagePortAudio, this.workerMessagePortAudio] = iterableMessageChannel(); safelyClosePorts([this.csoundWorkerFrameRequestPort, this.audioWorkerFrameRequestPort]); [ this.csoundWorkerFrameRequestPort, this.audioWorkerFrameRequestPort, ] = iterableMessageChannel(); } }