0

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脚本代码在上面

4

1 回答 1

1

在阅读了大量网络研究后,我找到了答案。问题似乎是正在传递的 .start()/.stop() 值。我变了:

audioOscillator1.start(0); audioOscillator1.stop(soundDuration)

audioOscillator1.start(audioContext.currentTime + 0)
audioOscillator1.stop(audioContext.currentTime + soundDuration)

该代码现在可以与脚本主体(全局)中的 audiocontext 一起使用,并且不会达到 audioconext 限制。增益/振荡器节点仍然是 onMessage 函数的本地节点。

于 2016-01-23T14:13:17.967 回答