var audioContext = new window.AudioContext
chrome.runtime.onMessage.addListener(
function(imageUrl, sender, sendResponse) {
if (imageUrl != "") sound(523.251, 587.330) else sound(523.251, 493.883)
})
function sound(frequency1, frequency2) {
soundDuration = 0.1
var audioGain1 = audioContext.createGain()
audioGain1.gain.value = 0.1
audioGain1.connect(audioContext.destination)
var audioGain2 = audioContext.createGain()
audioGain2.gain.value = 0.1
audioGain2.connect(audioContext.destination)
var audioOscillator1 = audioContext.createOscillator()
audioOscillator1.type = "sine"
audioOscillator1.frequency.value = frequency1
audioOscillator1.connect(audioGain1)
var audioOscillator2 = audioContext.createOscillator()
audioOscillator2.type = "sine"
audioOscillator2.frequency.value = frequency2
audioOscillator2.connect(audioGain2)
audioOscillator1.start(0); audioOscillator1.stop(soundDuration)
audioOscillator2.start(soundDuration); audioOscillator2.stop(soundDuration*2)
}
我正在开发一个 Google Chrome 扩展程序(版本 47.0.2526.111 m)。我遇到的问题是我超过了六 (6) 的 AudioContext (AC) 限制,并且代码在网页内容脚本 (CS) 中运行。我重写了代码让 CS 向持久后台脚本 (BS) 发送消息。我在 BS 的正文中定义了 AudioContext,希望它只会创建一个副本。每次 CS 向 BS 发送消息时,我都想播放两 (2) 个音调。我发现我需要在 BS .onMessage.addListener 函数中创建 GainNodes 和 OscillatorNodes 以避免这些节点的“一次性使用”行为。
测试时,不会产生任何音调。如果我对代码进行断点并逐步执行 .start() 和 .stop() 语句,则会生成音调。如果我让代码在 .start() 和 .stop() 以及 .stop() 之后的断点上自由运行,则没有音调。我怀疑范围问题并尝试使用 .createGain() 和 .createOscillator() 创建本地(var)和全局(无 var)变量,但这并没有改变行为。
如果我将所有 AC 对象的创建都放在侦听器函数中,它可以正常工作,但我又会用完 AC。
BS脚本代码在上面