当我启动振荡器时,将其停止,然后重新启动;我收到以下错误:
Uncaught InvalidStateError: Failed to execute 'start' on 'OscillatorNode': cannot call start more than once.
显然我可以使用gain
来“停止”音频,但这让我觉得很糟糕。什么是一种更有效的方法来停止振荡器,同时能够再次启动它?
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/
答案 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
。
仅供参考每个浏览器页面的生命周期(或至少按照我的硬件),您只能创建6个oscillator
个对象:
audioContext
答案 2 :(得分:1)
据我所知,由于与精度有关的原因,振荡器只能播放一次,而且至今还没有人解释过。决定使用此“仅播放一次”模型的人,可能会认为使用零音量设置在序列中间插入静默是一种好习惯。毕竟,它确实是断开并重新创建方法的唯一替代方法。