如何确定 WebAudio 振​​荡器是否静音?

How can I find out if a WebAudio oscillator is silent?

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

我问这个问题的原因是,如果您不在振荡器上调用 stop,它会无限期地停留在内存中。但是,振荡器没有长度或持续时间,因此无法确定它所产生的声音是否已经结束,以便您可以在它结束时调用 stop。所以我想知道是否有一种方法可以测试振荡器是否产生任何可听见的声音,或者是无声的?

正如您已经说过的,振荡器没有长度或持续时间,那么您或其他人应该告诉它停止。

您可以设置超时并在 x 秒后停止振荡器,或者将停止动作绑定到界面中的按钮或键 press/release。

您可以在振荡器及其输出之间放置一个分析器:

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));

请注意,这是一个只能检测纯粹静音的愚蠢算法,而不是振荡器是否安静到有效静音。为此,您需要 运行 复杂得多的算法,甚至可能不需要在主线程中。