- From: Dominic Cooney <dominicc@chromium.org>
- Date: Wed, 20 Feb 2013 18:18:45 +0900
- To: Lonce Wyse <lonce.wyse@zwhome.org>
- Cc: public-audio <public-audio@w3.org>
- Message-ID: <CAHnmYQ8MAX3qign8FYghen3avk8MtWMu=qw8tp2FMQ+Cn+4+_w@mail.gmail.com>
On Wed, Feb 20, 2013 at 3:04 AM, Lonce Wyse <lonce.wyse@zwhome.org> wrote: > > Thanks, Nick! It looks like the global binding does the trick. > BTW, Kumar has also written brilliantly on this and a collection of > related issues with ScriptProcessorNode lifetimes: > > http://sriku.org/blog/2013/01/30/taming-the-scriptprocessornode/#replacing-gain-node-with-scriptprocessornode > You may be interested in starring this Chromium bug: < https://code.google.com/p/chromium/issues/detail?id=82795> Regards, Dominic Cooney > > Best, > - lonce > > > On 2/20/2013 1:39 AM, Nick Thompson wrote: > > Hey Lonce, > > I've hit this problem before as well. The key is that you're defining > your scriptProcessor and the onaudioprocess callback within a function > namespace because of require.js, so the variables don't land on the global > namespace. This becomes problematic because the garbage collector will > swing by and clean your node and listener up after your code finishes > referencing it. Somebody listed a bug in Chrome to avoid garbage collecting > event listeners like this, but I can't find it... Maybe it's been fixed > since I last played around with it, in which case I'm not sure what the > problem is :) > > You should be able to fix it by binding the scriptprocessor or the > callback to the window to prevent garbage collection: > https://github.com/nick-thompson/flow/blob/master/public/js/flow.js#L96 > > Best, > Nick > > > > On Tue, Feb 19, 2013 at 5:11 AM, lonce <lonce.wyse@zwhome.org> wrote: > >> >> Hi - >> >> What might cause callbacks to onaudioprocess() for >> ScriptProcessorNode to suddenly cease? >> >> I have the simplest architecture: >> ScriptProcessorNode (generating random noise) -> Gain node -> >> audioContext.destination >> >> When left to run, I get anywhere from 150 to 1500 successsive callbacks >> to onaudioprocess(), and then it just quits (leaving a dirty buffer for the >> gain node to read) >> >> You can hear/see it here: >> http://animatedsoundworks.com/jsaSound/ (select "JS Node Test" from the >> drop-down menu, and hit "play" and let it run) >> You can see the callbacks to onaudioprocess() logged in the console >> window. Sometime in the first minute, they just stop. >> >> The core code: >> >> // ScriptProcessor to generate noise >> var noiseNode = >> config.audioContext.createScriptProcessor(config.k_bufferLength, 1, 1); >> noiseNode.onaudioprocess = function (e) { >> var outBuffer = e.outputBuffer.getChannelData(0); >> for (var i = 0; i < outBuffer.length; i += 1) { >> outBuffer[i] = Math.random() * 2 - 1; >> } >> } >> >> var gainLevelNode = config.audioContext.createGainNode(); >> >> // Connect graph >> noiseNode.connect(gainLevelNode); >> gainLevelNode.connect(config.audioContext.destination); >> gainLevelNode.gain.value = .1; >> >> To "start" and "stop" the sound, I just set the gain level. >> >> If I am not doing something properly, I would be glad to know about it! >> Thanks, >> - lonce >> >> >> > >
Received on Wednesday, 20 February 2013 09:19:17 UTC