Skip to content
This repository has been archived by the owner on Jan 23, 2021. It is now read-only.

Commit

Permalink
non-SAB in progress
Browse files Browse the repository at this point in the history
  • Loading branch information
hlolli committed Jul 3, 2020
1 parent 5dc7c84 commit 601bc56
Show file tree
Hide file tree
Showing 23 changed files with 524 additions and 318 deletions.
27 changes: 22 additions & 5 deletions rollup.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,23 +28,36 @@ const pluginsCommon = [
export default [
{
input: 'src/workers/sab.worker.js',
// external: ['../lib/libcsound.wasm.zlib'],
output: {
file: 'dist/__compiled.sab.worker.js',
format: 'es',
format: 'iife',
name: 'sab.worker',
sourcemap: false,
globals
},
plugins: [
...pluginsCommon,
arraybufferPlugin({ include: ['**/*.wasm', '**/*.wasm.zlib'] })
...pluginsCommon
// arraybufferPlugin({ include: ['**/*.wasm', '**/*.wasm.zlib'] })
]
},
{
input: 'src/workers/vanilla.worker.js',
// external: ['../lib/libcsound.wasm.zlib'],
output: {
file: 'dist/__compiled.vanilla.worker.js',
format: 'iife',
name: 'vanilla.worker',
sourcemap: false,
globals
},
plugins: [...pluginsCommon]
},
{
input: 'src/workers/worklet.worker.js',
output: {
file: 'dist/__compiled.worklet.worker.js',
format: 'es',
format: 'iife',
name: 'worklet.worker',
sourcemap: false,
globals
Expand All @@ -65,7 +78,11 @@ export default [
include: ['**/worklet.worker.js'],
dataUrl: true
}),
inlineWebWorkerPlugin({ include: ['**/sab.worker.js'], dataUrl: false })
inlineWebWorkerPlugin({
include: ['**/sab.worker.js', '**/vanilla.worker.js'],
dataUrl: false
}),
arraybufferPlugin({ include: ['**/*.wasm', '**/*.wasm.zlib'] })
]
}
];
14 changes: 4 additions & 10 deletions script/inline-webworker.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ function __inlineWorker(content) {
return new Worker(URL.createObjectURL(blob));
} catch (e) {
return new Worker(
'data:application/javascript,' + encodeURIComponent(content)
"object-src 'self' blob: data:application/javascript," + encodeURIComponent(content)
);
}
} catch (e) {
Expand All @@ -51,22 +51,16 @@ export default function inlineWebworker(options = {}) {
if (filter(id)) {
const filename = basename(id);
id = resolve('./dist', `__compiled.${filename}`);
// `URL.createObjectURL(new Blob([${JSON.stringify(
// contents
// )}]))``"data:,importScripts('"+location.origin+${workerUrl}+"')"`;
// var workerUrl = (window.URL || window.webkitURL).createObjectURL(new Blob([${JSON.stringify(
// readFileSync(id, { encoding: 'base64' })
// )}]));
return {
code: dataUrl
? `
export default 'data:application/javascript;base64,${readFileSync(
export default () => "data:application/javascript;base64,${readFileSync(
id,
{ encoding: 'base64' }
)}';
)}";
`
: `
export default (window.URL || window.webkitURL).createObjectURL(new Blob([${JSON.stringify(
export default () => (window.URL || window.webkitURL).createObjectURL(new Blob([${JSON.stringify(
readFileSync(id).toString('utf8')
)}]));`,
map: { mappings: '' }
Expand Down
10 changes: 8 additions & 2 deletions script/rollup-arraybuffer.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,16 @@ import { createFilter } from 'rollup-pluginutils';

const arraybufferCode = () =>
`
function bufferFromBrowser(base64Data) {
return window.atob(base64Data);
}
function bufferFromNodeJS(base64Data) {
return Buffer.from(base64Data, 'base64').toString('binary');
}
function __toArrayBuffer(base64Data) {
var window = window || this;
var isBrowser = typeof window !== 'undefined';
var binary = isBrowser ? window.atob(base64Data) : Buffer.from(base64Data, 'base64').toString('binary');
var isBrowser = typeof process === 'undefined';
var binary = isBrowser ? bufferFromBrowser(base64Data) : bufferFromNodeJS(base64Data);
var bytes = new Uint8Array(binary.length);
for (var i = 0; i < binary.length; ++i) {
bytes[i] = binary.charCodeAt(i);
Expand Down
39 changes: 22 additions & 17 deletions src/filesystem.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,44 +14,47 @@ export const preopens = {
export const workerMessagePort = {
ready: false,
post: () => {},
broadcastPlayState: () => {}
broadcastPlayState: () => {},
vanillaWorkerState: undefined
};

let stdErrPos = 0;
const stdErrBuffer = [];
let stdErrorPos = 0;
const stdErrorBuffer = [];

let stdOutPos = 0;
const stdOutBuffer = [];

const stdErrCallback = data => {
const stdErrorCallback = data => {
const cleanString = cleanStdout(uint2Str(data));
if (cleanString.includes('\n')) {
const [firstEl, ...next] = cleanString.split('\n');
const [firstElement, ...next] = cleanString.split('\n');
let outstr = '';
while (stdErrBuffer.length > 0) {
outstr += stdErrBuffer[0];
stdErrBuffer.shift();
while (stdErrorBuffer.length > 0) {
outstr += stdErrorBuffer[0];
stdErrorBuffer.shift();
}
outstr += firstEl || '';

outstr += firstElement || '';

if (outstr && workerMessagePort.ready) {
workerMessagePort.post(outstr);
}
next.forEach(s => stdErrBuffer.push(s));

next.forEach(s => stdErrorBuffer.push(s));
} else {
stdErrBuffer.push(cleanString);
stdErrorBuffer.push(cleanString);
}
};

const createStdErrStream = () => {
const createStdErrorStream = () => {
wasmFs.fs.watch(
'/dev/stderr',
{ encoding: 'buffer' },
(eventType, filename) => {
if (filename) {
const contents = wasmFs.fs.readFileSync('/dev/stderr');
stdErrCallback(contents.slice(stdErrPos));
stdErrPos = contents.length;
stdErrorCallback(contents.slice(stdErrorPos));
stdErrorPos = contents.length;
}
}
);
Expand All @@ -60,16 +63,18 @@ const createStdErrStream = () => {
const stdOutCallback = data => {
const cleanString = cleanStdout(uint2Str(data));
if (cleanString.includes('\n')) {
const [firstEl, ...next] = cleanString.split('\n');
const [firstElement, ...next] = cleanString.split('\n');
let outstr = '';
while (stdOutBuffer.length > 0) {
outstr += stdOutBuffer[0];
stdOutBuffer.shift();
}
outstr += firstEl;

outstr += firstElement;
if (outstr && workerMessagePort.ready) {
workerMessagePort.post(outstr);
}

next.forEach(s => stdOutBuffer.push(s));
} else {
stdOutBuffer.push(cleanString);
Expand Down Expand Up @@ -110,6 +115,6 @@ export async function mkdirp(filePath) {

export const intiFS = async () => {
await wasmFs.volume.mkdirSync('/csound');
createStdErrStream();
createStdErrorStream();
createStdOutStream();
};
18 changes: 10 additions & 8 deletions src/index.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import * as Comlink from 'comlink';
import { apply, curry, prop } from 'ramda';
import VanillaWorkerMainThread from '@root/mains/vanilla.main';
import SharedArrayBufferMainThread from '@root/mains/sab.main';
import AudioWorkletMainThread from '@root/mains/worklet.main';
import wasmDataURI from '../lib/libcsound.wasm.zlib';
import { areWorkletsSupportet, isSabSupported } from '@root/utils';
export { Csound };
export default Csound;
Expand All @@ -19,21 +21,21 @@ async function Csound() {
: null;

if (!audioWorker) {
console.error(`No detectable WebAudioAPI in current environment`);
console.error('No detectable WebAudioAPI in current environment');
return {};
}

const worker = isSabSupported()
? new SharedArrayBufferMainThread(audioWorker)
: null;

console.log('PRE');
const worker = false //isSabSupported()
? new SharedArrayBufferMainThread(audioWorker, wasmDataURI)
: new VanillaWorkerMainThread(audioWorker, wasmDataURI);
console.log('POST');
if (worker) {
await worker.initialize();
csoundWasmApi = worker.api;
} else {
console.error(`No detectable WebAssembly support in current environment`);
console.error('No detectable WebAssembly support in current environment');
return {};
}

console.log('EXPORT API', csoundWasmApi);
return csoundWasmApi;
}
6 changes: 3 additions & 3 deletions src/mains/messages.main.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ loggerPool.add(defaultLogger);

// exec log-event: msg => cb(msg)
export const messageEventHandler = worker => event =>
event.data.log
? loggerPool.forEach(cb => cb(event.data.log))
: worker.onPlayStateChange(event.data.playStateChange);
event.data.log ?
loggerPool.forEach(callback => callback(event.data.log)) :
worker.onPlayStateChange(event.data.playStateChange);

export const {
port1: mainMessagePort,
Expand Down
Loading

0 comments on commit 601bc56

Please sign in to comment.