(Web Audio API)振荡器节点错误:无法多次呼叫启动

时间:2015-08-22 23:44:25

标签: javascript web-audio javascript-oscillator

当我启动振荡器时,将其停止,然后重新启动;我收到以下错误:

Uncaught InvalidStateError: Failed to execute 'start' on 'OscillatorNode': cannot call start more than once.

显然我可以使用gain来“停止”音频,但这让我觉得很糟糕。什么是一种更有效的方法来停止振荡器,同时能够再次启动它?

代码(jsfiddle

var ctx = new AudioContext();
var osc = ctx.createOscillator();

osc.frequency.value = 8000;

osc.connect(ctx.destination);

function startOsc(bool) {
    if(bool === undefined) bool = true;

    if(bool === true) {
        osc.start(ctx.currentTime);
    } else {
        osc.stop(ctx.currentTime);
    }
}

$(document).ready(function() {
    $("#start").click(function() {
       startOsc(); 
    });
    $("#stop").click(function() {
       startOsc(false); 
    });
});

当前解决方案(在提问时):http://jsfiddle.net/xbqbzgt2/2/

最终解决方案:http://jsfiddle.net/xbqbzgt2/3/

3 个答案:

答案 0 :(得分:21)

更好的方法是启动一次振荡器节点,并在需要时连接/断开振荡器节点,即:

var ctx = new AudioContext();
var osc = ctx.createOscillator();   
osc.frequency.value = 8000;    
osc.start();    
$(document).ready(function() {
    $("#start").click(function() {
         osc.connect(ctx.destination);
    });
    $("#stop").click(function() {
         osc.disconnect(ctx.destination);
    });
});

这是如何在muting the thermin(mozilla web audio api文档)中完成静音

答案 1 :(得分:3)

到目前为止,我发现的最佳解决方案是在每次需要使用时重新设置SqlCommand com=new SqlCommand("Your Query","Your Connection"); com.CommandTimeout = 1; 时保持SAME audioContext

http://jsfiddle.net/xbqbzgt2/3/

仅供参考每个浏览器页面的生命周期(或至少按照我的硬件),您只能创建6个oscillator个对象:

audioContext

答案 2 :(得分:1)

据我所知,由于与精度有关的原因,振荡器只能播放一次,而且至今还没有人解释过。决定使用此“仅播放一次”模型的人,可能会认为使用零音量设置在序列中间插入静默是一种好习惯。毕竟,它确实是断开并重新创建方法的唯一替代方法。