Javascript JS音频API-振荡器内部函数不';我不能放声音

Javascript JS音频API-振荡器内部函数不';我不能放声音,javascript,web-audio-api,Javascript,Web Audio Api,使用Opera 44.0,我在摆弄音频API,并尝试了一个简单的示例: var ac = new AudioContext(); var osc = ac.createOscillator(); osc.connect(ac.destination); osc.start(); osc.stop(2); 它按预期工作,声音播放2秒钟,然后停止 然后我试着往上一点,在点击按钮时播放一个声音: function play(){ var osc = ac.createOscillator();

使用Opera 44.0,我在摆弄音频API,并尝试了一个简单的示例:

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

osc.connect(ac.destination);
osc.start();
osc.stop(2);
它按预期工作,声音播放2秒钟,然后停止

然后我试着往上一点,在点击按钮时播放一个声音:

function play(){
  var osc = ac.createOscillator();
  osc.connect(ac.destination);
  osc.start();
  osc.stop(2);
}

var ac = new AudioContext();

var playBtn = document.querySelector("#play");
playBtn.addEventListener("click", play);
它不起作用。当我单击按钮时(我使用函数中的
console.log()
进行了检查),会调用该函数,但不会播放声音。我尝试刷新页面,重新启动浏览器。。没什么

经过一些研究,我发现当调用
stop()
时,振荡器会被丢弃,因此每次我都必须创建一个新的振荡器。我发现的几乎所有示例都围绕这个概念展开,这就是我在函数中创建它的原因。但是没有任何错误,我不明白为什么它不起作用

那么,问题出在哪里呢?

通过深入研究,我设法解决了问题

最初,我假设传递给osc.stop(2)的参数是以秒为单位的播放时间,类似于“播放2秒,然后停止”。 但这并不正确:参数是“…振荡器应该停止的音频上下文时间”

通过在
play()
函数中记录
ac.currentTime
,我单击按钮时返回的值为~5。因此,通过将2传递给
osc.stop()
我告诉osc在上下文时间为2时停止,这已经过去了

解决方案很简单:

function play(){
  var osc = ac.createOscillator();
  osc.connect(ac.destination);
  osc.start();
  //take into account the current time of the context
  osc.stop(ac.currentTime + 2);
}
智慧的话语现在回荡在我的脑海里。。。R…T…F…M