WebAudio:没有调用firefox onaudioprocess回调?

时间:2014-07-23 10:15:00

标签: javascript firefox web-audio

我有用JavaScript编写的8位计算机模拟器,它使用WebAudio和createScriptProcessor来根据"虚拟"的内部状态生成声音。声音芯片仿真(即使是数字样本,因此它不是基于webaudio振荡器的解决方案)。它适用于Chrome,但不适用于Firefox,Firefox完全没有声音(使用版本30和31测试)。奇怪的是:似乎onaudioprocess提供的功能在Firefox上根本没有调用,但它在Chrome上。我已经通过将console.log()放入该回调函数来测试它,但是在JavaScript控制台中没有显示由它生成的单行。我单独测试的解决方案的最小骨架:

window.AudioContext = window.AudioContext || window.webkitAudioContext;
var audioCtx = new AudioContext();
/* comment: see later */
var audioNode = audioCtx.createScriptProcessor(4096, 2, 2);
audioNode.connect(audioCtx.destination);
audioNode.onaudioprocess = function (e) { console.log("process: " + e.toString()); };

当然它不会产生太多声音,但它应该定期在javascript控制台上打印消息(但肯定,至少一次......)。确实如此,在firefox(!!)和chrome上都有。现在奇怪的是我无法理解:在我的模拟器中使用了相同的方案,但是在那里,使用audioNode.onaudioprocess注册的回调函数是而不是。我无法想象为什么,因为它的工作原理如上所述。但据我所知,这导致我的代码在Firefox上不会产生任何声音的情况。上面的代码与我的模拟器之间的唯一区别在于"注释"当你使用" run!"启动模拟器时,会单独给出。按钮,在加载仿真器(页面)时执行之前的部件。

我不太准确的问题:这会导致什么样的问题?如果上面的测试代码片段工作,并且在我的模拟器中使用了相同的代码片段,我无法理解可能有什么不同。我的模拟器使用setTimeout()来计算仿真机器的速度,是否会以某种方式弄乱onaudioprocess?

更新,替代方法

似乎解决方案是将new AudioContext()置于创建audioNode.connect()的同一部分,然后才能运行。但是我不明白为什么它是一个问题:audioCtx存储在全局变量范围内(因为我已经读过它可能是一个问题,让一些垃圾收集搞乱webaudio一点) 。有没有人知道这种行为的原因是什么?

非常感谢,欢迎任何反馈!

0 个答案:

没有答案