是否可以找出WebAudio振荡器何时静音,然后调用其stop
方法?
我之所以这样问是因为,如果你没有在振荡器上调用stop
,它会无限期地挂在内存中。但是,振荡器没有长度或持续时间,因此无法确定它产生的声音是否已经完成,以便在完成时可以调用stop
。所以我想知道是否有办法测试振荡器是否产生任何声音,或者是否是静音?
答案 0 :(得分:4)
您可以在振荡器和输出之间放置一个分析器:
var size = 2048;
var analyser = audioCtx.createAnalyser();
var data = new Float32Array(size);
analyser.fftSize = size;
theOscillator.connect(analyser);
analyser.connect(theOutput);
var silenceChecker = setInterval(function() {
analyser.getFloatTimeDomainData(data);
for (var i = 0; i < size; ++i) {
if (data[i] !== 0) return;
}
// It is silent.
clearInterval(silenceChecker);
theOscillator.stop();
theOscillator.disconnect();
analyser.disconnect();
}, Math.floor(size / audioCtx.sampleRate * 1000));
请注意,这是一个愚蠢的算法,只能检测纯静音,而不是振荡器是否如此安静以至于它是否有效静音。为此,您需要运行更复杂的算法,甚至可能不在主线程中。
答案 1 :(得分:1)
如你所说,振荡器没有长度或持续时间,那么你或其他人应该告诉它停止。
您可以设置超时并在x秒后停止振荡器或将停止操作绑定到界面中的按钮或按键/释放键。