Общий 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.