839 lines · 28.2 KB · JavaScript
RawDownload
var AudioContext = window.AudioContext || window.webkitAudioContext;var audioContext = undefined;var theChuck = undefined;var theChuckAlmostReady = defer();var theChuckReady = defer();var filesToPreload = [];var whereIsChuck = whereIsChuck || "./js";var currentChuckID = 1; var chuckPrint = function( text ){    // override me!}  // START taken from emscripten sourcevar readAsync = function( url, onload, onerror ){    var xhr = new XMLHttpRequest();    xhr.open('GET', url, true);    xhr.responseType = 'arraybuffer';    xhr.onload = function xhr_onload()     {        if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) // file URLs can return 0        {             onload(xhr.response);            return;        }        onerror();    };    xhr.onerror = onerror;    xhr.send(null);}; var asyncLoadFile = function( url, onload, onerror ) {    readAsync(url, function(arrayBuffer) {        onload(new Uint8Array(arrayBuffer));    }, function(event) {        if (onerror) {            onerror();        } else {            throw 'Loading data file "' + url + '" failed.';        }    });}// END taken from emscripten source var loadWasm = new Promise( function( resolve, reject ){    asyncLoadFile( whereIsChuck + '/webchuck.wasm', resolve, reject ); }); var preloadFilenames = async function( filenamesToPreload ){    var promises = [];    for( var i = 0; i < filenamesToPreload.length; i++ )    {        (function( filenameToPreload )        {            promises.push( new Promise( function( resolve, reject )            {                asyncLoadFile( filenameToPreload.serverFilename, function( byteArray )                {                    filesToPreload.push({                        filename: filenameToPreload.virtualFilename,                        data: byteArray                    });                    resolve();                }, function()                {                    console.error( "Error fetching file:", filenameToPreload.serverFilename );                    //reject( e );                    resolve();                });            }) );        })( filenamesToPreload[i] );            }    await Promise.all( promises );} var theWasm;var startAudioContext = async function(){    theWasm = await loadWasm;    audioContext = new AudioContext({        //sampleRate: 48000    });    await audioContext.audioWorklet.addModule( whereIsChuck + '/webchuck.js');} var startChuck = async function() {    if( audioContext === undefined )    {        await startAudioContext();                var newID = currentChuckID;        currentChuckID++;                theChuck = await createAChuck( newID, theChuckReady );        theChuck.connect( audioContext.destination );        theChuckAlmostReady.resolve();    }}; var createAChuck = function( chuckID, initPromise ){    // important: "number of inputs / outputs" is like an aggregate source    // most of the time, you only want one input source and one output    // source, but each one has multiple channels    var numInOutChannels = 2;        var aChuck = new AudioWorkletNode( audioContext, 'chuck-node', {         numberOfInputs: 1,        numberOfOutputs: 1,        outputChannelCount: [numInOutChannels],        processorOptions: {            chuckID: chuckID,            srate: audioContext.sampleRate,            preloadedFiles: filesToPreload,            wasm: theWasm        }    } );        aChuck.chuckID = chuckID;        (function( self )    {        self.eventCallbacks = {};        self.deferredPromises = {};        self.eventCallbackCounter = 0;        self.deferredPromiseCounter = 0;        self.amReady = initPromise;                self.onprocessorerror = function( e )        {            console.log( e );        }                // respond to messages        self.port.onmessage = function( event )        {            switch( event.data.type )             {                case "initCallback":                    if( self.amReady )                    {                        self.amReady.resolve();                    }                    break;                case "console print":                    chuckPrint( event.data.message );                    break;                case "eventCallback":                    if( event.data.callback in self.eventCallbacks )                    {                        self.eventCallbacks[event.data.callback]();                    }                    break;                case "intCallback":                case "floatCallback":                case "stringCallback":                case "intArrayCallback":                case "floatArrayCallback":                    if( event.data.callback in self.deferredPromises )                    {                        self.deferredPromises[event.data.callback].resolve(event.data.result);                        delete self.deferredPromises[event.data.callback];                    }                    break;                case "newShredCallback":                    if( event.data.callback in self.deferredPromises )                    {                        if( event.data.shred > 0 )                        {                            self.deferredPromises[event.data.callback].resolve(event.data.shred);                        }                        else                        {                            self.deferredPromises[event.data.callback].reject("Running code failed");                        }                    }                    break;                case "replacedShredCallback":                    if( event.data.callback in self.deferredPromises )                    {                        if( event.data.newShred > 0 )                        {                            self.deferredPromises[event.data.callback].resolve({                                newShred: event.data.newShred,                                oldShred: event.data.oldShred                            });                        }                        else                        {                            self.deferredPromises[event.data.callback].reject("Replacing code failed");                        }                    }                    break;                case "removedShredCallback":                    if( event.data.callback in self.deferredPromises )                    {                        if( event.data.shred > 0 )                        {                            self.deferredPromises[event.data.callback].resolve(event.data.shred);                        }                        else                        {                            self.deferredPromises[event.data.callback].reject("Removing code failed");                        }                    }                    break;                default:                    break;            }        }        self.nextDeferID = function()        {            var callbackID = self.deferredPromiseCounter++;            self.deferredPromises[callbackID] = defer();            return callbackID;        }        // ================== Filesystem ===================== //        self.createFile = function( directory, filename, data )        {            self.port.postMessage( {                type: 'loadFile',                directory: directory,                filename: filename,                data: data            } );        }        // ================== Run / Compile ================== //        self.runCode = function( code )        {            var callbackID = self.nextDeferID();            self.port.postMessage( {                 type: "runChuckCode",                 code: code,                callback: callbackID            } );            return self.deferredPromises[callbackID];        }        self.runCodeWithReplacementDac = function( code, dac_name )        {            var callbackID = self.nextDeferID();            self.port.postMessage( {                 type: "runChuckCodeWithReplacementDac",                 code: code,                dac_name: dac_name,                callback: callbackID            } );            return self.deferredPromises[callbackID];        }        self.runFile = function( filename )        {            var callbackID = self.nextDeferID();            self.port.postMessage( {                type: "runChuckFile",                filename: filename,                callback: callbackID            } );            return self.deferredPromises[callbackID];        }        self.runFileWithReplacementDac = function( filename, dac_name )        {            var callbackID = self.nextDeferID();            self.port.postMessage( {                 type: "runChuckFileWithReplacementDac",                 filename: filename,                dac_name: dac_name,                callback: callbackID            } );            return self.deferredPromises[callbackID];        }        self.runFileWithArgs = function( filename, colon_separated_args )        {            var callbackID = self.nextDeferID();            self.port.postMessage( {                 type: "runChuckFileWithArgs",                 filename: filename,                colon_separated_args: colon_separated_args,                callback: callbackID            } );            return self.deferredPromises[callbackID];        }        self.runFileWithArgsWithReplacementDac = function( filename, colon_separated_args, dac_name )        {            var callbackID = self.nextDeferID();            self.port.postMessage( {                 type: "runChuckFileWithArgs",                 filename: filename,                colon_separated_args: colon_separated_args,                dac_name: dac_name,                callback: callbackID            } );            return self.deferredPromises[callbackID];        }        self.replaceCode = function( code )        {            var callbackID = self.nextDeferID();            self.port.postMessage( {                type: "replaceChuckCode",                code: code,                callback: callbackID            } );            return self.deferredPromises[callbackID];        }        self.replaceCodeWithReplacementDac = function( code, dac_name )        {            var callbackID = self.nextDeferID();            self.port.postMessage( {                 type: "replaceChuckCodeWithReplacementDac",                 code: code,                dac_name: dac_name,                callback: callbackID            } );            return self.deferredPromises[callbackID];        }        self.replaceFile = function( filename )        {            var callbackID = self.nextDeferID();            self.port.postMessage( {                type: "replaceChuckFile",                filename: filename,                callback: callbackID            } );            return self.deferredPromises[callbackID];        }        self.replaceFileWithReplacementDac = function( filename, dac_name )        {            var callbackID = self.nextDeferID();            self.port.postMessage( {                 type: "replaceChuckFileWithReplacementDac",                 filename: filename,                dac_name: dac_name,                callback: callbackID            } );            return self.deferredPromises[callbackID];        }        self.replaceFileWithArgs = function( filename, colon_separated_args )        {            var callbackID = self.nextDeferID();            self.port.postMessage( {                 type: "replaceChuckFileWithArgs",                 filename: filename,                colon_separated_args: colon_separated_args,                callback: callbackID            } );            return self.deferredPromises[callbackID];        }        self.replaceFileWithArgsWithReplacementDac = function( filename, colon_separated_args, dac_name )        {            var callbackID = self.nextDeferID();            self.port.postMessage( {                 type: "replaceChuckFileWithArgs",                 filename: filename,                colon_separated_args: colon_separated_args,                dac_name: dac_name,                callback: callbackID            } );            return self.deferredPromises[callbackID];        }        self.removeLastCode = function()        {            var callbackID = self.nextDeferID();            self.port.postMessage( {                type: "removeLastCode",                callback: callbackID            } );            return self.deferredPromises[callbackID];        }        self.removeShred = function( shred )        {            var callbackID = self.nextDeferID();            self.port.postMessage( {                type: "removeShred",                shred: shred,                callback: callbackID            } );            return self.deferredPromises[callbackID];        }        self.isShredActive = function( shred )        {            var callbackID = self.nextDeferID();            self.port.postMessage( {                type: "isShredActive",                shred: shred,                callback: callbackID            } );            return self.deferredPromises[callbackID];        }        // ================== Int, Float, String ============= //        self.setInt = function( variable, value )        {            self.port.postMessage( {                 type: 'setChuckInt',                 variable: variable,                value: value            } );        }        self.getInt = function( variable )        {            var callbackID = self.nextDeferID();            self.port.postMessage( {                type: 'getChuckInt',                variable: variable,                callback: callbackID            } );            return self.deferredPromises[callbackID];        }        self.setFloat = function( variable, value )        {            self.port.postMessage( {                 type: 'setChuckFloat',                 variable: variable,                value: value            } );        }        self.getFloat = function( variable )        {            var callbackID = self.nextDeferID();            self.port.postMessage( {                type: 'getChuckFloat',                variable: variable,                callback: callbackID            } );            return self.deferredPromises[callbackID];        }        self.setString = function( variable, value )        {            self.port.postMessage( {                 type: 'setChuckString',                 variable: variable,                value: value            } );        }        self.getString = function( variable )        {            var callbackID = self.nextDeferID();            self.port.postMessage( {                type: 'getChuckString',                variable: variable,                callback: callbackID            } );            return self.deferredPromises[callbackID];        }        // ================== Event =================== //        self.signalEvent = function( variable )        {            self.port.postMessage( { type: 'signalChuckEvent', variable: variable } );        }        self.broadcastEvent = function( variable )        {            self.port.postMessage( { type: 'broadcastChuckEvent', variable: variable } );        }        self.listenForEventOnce = function( variable, callback )        {            var callbackID = self.eventCallbackCounter++;            self.eventCallbacks[callbackID] = callback;            self.port.postMessage( {                 type: 'listenForChuckEventOnce',                variable: variable,                callback: callbackID            } );        }        self.startListeningForEvent = function( variable, callback )        {            var callbackID = self.eventCallbackCounter++;            self.eventCallbacks[callbackID] = callback;            self.port.postMessage( {                 type: 'startListeningForChuckEvent',                variable: variable,                callback: callbackID            } );            return callbackID;        }        self.stopListeningForEvent = function( variable, callbackID )        {            self.port.postMessage( {                 type: 'stopListeningForChuckEvent',                variable: variable,                callback: callbackID            } );        }        // ================== Int[] =================== //        self.setIntArray = function( variable, values )        {            self.port.postMessage( {                type: 'setGlobalIntArray',                variable: variable,                values: values            } );        }        self.getIntArray = function( variable )        {            var callbackID = self.nextDeferID();            self.port.postMessage( {

Lines 1–500 of 839.

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t