如何判断WebAudio振荡器是否静音?

时间:2015-12-28 22:11:03

标签: javascript web-audio

是否可以找出WebAudio振荡器何时静音,然后调用其stop方法?

我之所以这样问是因为,如果你没有在振荡器上调用stop,它会无限期地挂在内存中。但是,振荡器没有长度或持续时间,因此无法确定它产生的声音是否已经完成,以便在完成时可以调用stop。所以我想知道是否有办法测试振荡器是否产生任何声音,或者是否是静音?

2 个答案:

答案 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秒后停止振荡器或将停止操作绑定到界面中的按钮或按键/释放键。