这个问题是由于每次调用createOscillator()方法时都会返回一个新的OscillatorNode实例,并且播放时只能触发一次。要解决这个问题,需要在每次播放时重新创建一个新的OscillatorNode实例,并将其连接到音频上下文的目标节点。
以下是一个示例代码:
const audioCtx = new AudioContext();
function playTone() {
const oscillator = audioCtx.createOscillator();
oscillator.frequency.setValueAtTime(440, audioCtx.currentTime);
oscillator.type = 'sine';
oscillator.connect(audioCtx.destination);
oscillator.start();
oscillator.stop(audioCtx.currentTime + 1);
}
playTone();
在这个示例中,每次调用playTone()函数时,都会创建一个新的OscillatorNode实例,并将其连接到目标节点。调用start()方法来播放声音,并调用stop()方法来停止播放。
这样,即使调用多次,每次播放都会产生一个新的声音。