根据文档,您应该每页只调用一次AudioContext。
当我尝试正确使用它并在函数外部调用它时,不会产生声音。上下文变量已定义并填充,控制台中不会抛出任何错误,它只是不会产生声音。
当我在一个名为on' onClick'事件它最初起作用,但我第六次调用它时不出所料地得到一个错误,因为我达到了我可以调用它的极限。
var context = new AudioContext; //when defined here, no sound is produced
function playChord() {
var context = new AudioContext; //when defined here, sound is produced (only 6 times)
var time = 0.05;
var frequencies = [...];
frequencies.forEach(function(frequency) {
var oscillator = context.createOscillator();
var gain = context.createGain();
gain.gain.setValueAtTime(0, audioContext.currentTime);
gain.gain.linearRampToValueAtTime(1, time);
gain.gain.linearRampToValueAtTime(0, time + 60*0.25);
oscillator.frequency.value = frequency;
oscillator.connect(gain);
gain.connect(context.destination);
oscillator.start(...);
oscillator.stop(...);
});
};
为什么仅仅移动上下文变量的实例化会阻止我的浏览器(chrome)产生声音?
答案 0 :(得分:0)
找到我自己的问题。不出所料,这是一个愚蠢的错误。问题在于这一行
gain.gain.linearRampToValueAtTime(1, time);
我没有将增益设置为1,相对于context.currentTime。
在函数内部定义AudioContext时它正常工作的原因是因为'currentTime'从0开始计数,并且足够接近仍然影响有问题的振荡器。
当它移出函数时,时间远远超过linearRamptoValueAtTime()影响任何东西的范围。只需添加context.currentTime,一切都会好的:)
gain.gain.linearRampToValueAtTime(1, context.currentTime + time);
gain.gain.linearRampToValueAtTime(0, context.currentTime + time + 0.25);