2016-01-22 2 views
0

Shared Chrome AudioContext в Persistent фоне Сценарий

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

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

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

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

+0

Tried 'var audioContext = audioContext || новое окно.AudioContext'? –

ответ

1

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

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

в

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

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

Смежные вопросы