AudioContext振荡器不止一次播放

时间:2015-06-24 17:36:19

标签: javascript html5 audiocontext

我知道你不能多次播放一个振荡器,所以我写了一个每次创建一个新函数的函数:

function playFrequency(f, t0, t1){
    console.log(f, t0, t1);
    var oscillator = self.audioContext.createOscillator();
    oscillator.type = "square";
    oscillator.frequency.value = f;
    oscillator.connect(self.audioContext.destination);
    oscillator.start(t0);
    oscillator.stop(t1);
}

但奇怪的是,该功能实际上只播放一次声音。我无法理解为什么会这样。我每次调用函数时都不会创建新的振荡器吗?

当我创建一个函数" playFrequency2(f,t0,t1)"它具有完全相同的代码,即使在第一个功能播放声音后也会播放声音。但是当我第二次打电话时,它不会播放声音。

1 个答案:

答案 0 :(得分:1)

您的问题是start时间传递给您的功能。开始时间是根据创建audioContext时开始的currentTime audioContext计算的,并从此开始继续前进。因此,当您以0为例开始第一个声音然后以3结束时,audioContext将继续运行。因此,如果您使用相同的时间参数调用新声音,则因为start时间早于currentTime而无法播放。 您可以像这样修改:

function playFrequency(f, t1){
    console.log(f, t0, t1);
    var oscillator = self.audioContext.createOscillator();
    oscillator.type = "square";
    oscillator.frequency.value = f;
    oscillator.connect(self.audioContext.destination);
    oscillator.start();
    oscillator.stop(self.audioContext.currentTime+t1);
}