audioContext 振荡器在一秒后'stuck'并且不会停止



我想创建一个振荡器,当用户按下一个键(现在只是空格键(时启动和停止。但如果按键时间太长,大约有一秒钟——振荡器卡住了,没有停止((;

let signal = {}
class Beep {
constructor() { 
this.audioCtx = new window.AudioContext();
this.osc =      this.audioCtx.createOscillator();
this.gainNode = this.audioCtx.createGain();
this.gainNode.connect(this.audioCtx.destination);
this.osc.connect(this.gainNode);
signal.beep = this;
}
}
function startTransmission(e) {     
if(e.keyCode == 32) {
let b = new Beep();
signal.beep.osc.start();
}
}
function stopTransmission(e) {      
if(e.keyCode == 32) {
signal.beep.osc.stop();
}
}
document.body.onkeydown = (e) => startTransmission(e);
document.body.onkeyup = (e) => stopTransmission(e);

如果有人感兴趣,可以找到解决方案。。。问题是,只要按下onKeyDown,它就会激发的一个新实例。因此,该函数在现有对象的顶部创建一个新的"Beep"对象。这样,当"stopTransmission"函数被触发时,它只会停止最后一个振荡器,而让它下面的其他振荡器运行。

克服这一问题的方法是创建一个标志,该标志在创建第一个振荡器后立即从"false"切换到"true",然后不允许函数创建更多的振荡器。当函数在键上启动时,该标志应重置为"false"。

最新更新