Общий Chrome AudioContext в постоянном фоновом скрипте

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). Я столкнулся с проблемой, когда я превысил ограничение AudioContext (AC) в шесть (6) с кодом, выполняемым в скрипте содержимого веб-страницы (CS). Я переписал код, чтобы CS отправлял сообщение постоянному фоновому скрипту (BS). Я определил AudioContext в теле BS, надеясь, что это создаст только одну копию. Каждый раз, когда CS отправляет сообщение в BS, я хочу воспроизвести два (2) тона. Я обнаружил, что мне нужно создать GainNodes и OscillatorNodes в функции BS.onMessage.addListener, чтобы избежать "одноразового использования" этих узлов.

При тестировании тоны не генерируются. Если я остановлю код и пройдусь по операторам.start () и.stop (), сгенерируются тоны. Если я позволю коду свободно проходить через.start () и.stop () и точку останова сразу после.stop (), никаких тонов. Я подозревал проблемы с областью действия и пробовал.createGain () и.createOscillator (), создавая локальные (var) и глобальные (no var) переменные, но это не меняет поведение.

Если я добавлю все функции создания объекта AC в функцию слушателя, она будет работать нормально, но я вернусь к исчерпанию AC.

Код сценария BS выше

1 ответ

Я нашел ответ после прочтения большого количества веб-исследований. Кажется, проблема в том, что передаются значения.start()/. Stop(). Я изменился:

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

в

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

Теперь код работает с аудиоконтекстом в теле скрипта (глобальном) и не достигает предела аудиоконтекста. Узлы усиления / осциллятора все еще являются локальными для функции onMessage.

Другие вопросы по тегам