- From: Seth Nickell <snickell@gmail.com>
- Date: Mon, 17 Jun 2013 13:59:40 -0700
- To: public-audio@w3.org
- Message-ID: <CANL-LfQumB8bsRyWToYPij+=PbfZR3HBckAAeYB+zx2=_Tyf4w@mail.gmail.com>
Thanks for defining these cool audio interfaces! PROBLEM: I want to implement a particularly CPU intensive ScriptProcessorNode, and have it not block the main event loop. I'd suggest that having audio processing not run on the main event-loop/thread/core might be the preferred way to structure an application that both has UI and processes audio, and the ScriptProcesorNode API would do well to encourage this sort of structure. A FEW IDEAS: 1) Define a ScriptProcessorWorker which receives an onaudioprocess event (in addition to the standard-for-web-worker 'message' event) app.js: var node = audioContext.createScriptProcessorWorker(2048, 1, 1, 'my-worker.js'); my-worker.js: self.addEventListener('onaudioprocess', function (event) { // ... event.inputBuffer, event.outputBuffer, etc are available }); 2) Allow the entire AudioContext to be instantiated inside a Worker (or possibly a special AudioWorker), instead of on the main event loop. Since an audio chain ideally doesn't coordinate between multiple threads, this might be a preferred way to handle an AudioContext, whereas idea (1) might require browser vendors to implement relatively-more-complex and less performant cross-thread synchronization. 3) Requiring less involvement with the Web Worker specification, but creating a less desirable API: allow a ScriptProcessor to designate a regular Worker to receive audio data, and define a standard message format, PARTICULARLY defining the semantics of handing the sample buffer back and forth as a Transferable, to permit zero-copy processing. app.js: var node = audioContext.createScriptProcessor(2048, 1, 1); node.worker = new Worker('my-worker.js'); my-worker.js: self.addEventListener('message', function (event) { if (event.onaudioprocess) { // event.onaudioprocess.inputBuffer, event.onaudioprocess.outputBuffer, etc.... // .... event.onaudioprocess.done(); } }); -Seth
Received on Tuesday, 18 June 2013 07:21:11 UTC