我试图使振荡器在 Canvas 上播放时播放,而在鼠标不在 Canvas 上时停止播放。但是,使用当前代码,它在加载页面后仅工作一次,当鼠标第二次出现在 Canvas 上时,会发生错误:


var ac = new window.AudioContext() || new window.webkitAudioContext();
var osc = ac.createOscillator();
var canvas1 = document.getElementById("canvas1");
canvas1.addEventListener("mouseover", playosc);
canvas1.addEventListener("mouseout", stoposc);

function playosc() {
    osc.frequency.value = 440;
    osc.connect(ac.destination);
    osc.start();
}

function stoposc() {
    osc.stop();
}

如何重启振荡器?谢谢。

最佳答案

由于OscillatorNodes不可重用,因此每次都需要创建一个Oscillator对象。例:

var canvas1 = document.getElementById("canvas1");
canvas1.addEventListener("mouseover", playosc);
canvas1.addEventListener("mouseout", stoposc);

var ac = new window.AudioContext() || new window.webkitAudioContext();
var osc;

function playosc() {
    osc = ac.createOscillator()
    osc.frequency.value = 440;
    osc.connect(ac.destination);
    osc.start();
}

function stoposc() {
    osc.stop();
}

请引用此excellent blog post以获得更多指导。

08-28 20:23