- From: Lonce Wyse <lonce.wyse@zwhome.org>
- Date: Wed, 20 Feb 2013 02:04:34 +0800
- To: public-audio@w3.org
- Message-ID: <5123BEB2.4040506@zwhome.org>
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 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 > <mailto: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 Tuesday, 19 February 2013 18:05:46 UTC