Как остановить процессор веб-аудио скриптов и очистить буфер?
Я пытаюсь выяснить, как остановить запуск узла процессора веб-аудио скриптов, не отключая его.
моей первоначальной мыслью было просто установить "onaudioprocess" в "null", чтобы остановить его, но когда я это делаю, я слышу очень короткий цикл воспроизведения звука. Я предполагаю, что звуковой буфер не очищается или что-то еще, и он неоднократно воспроизводит один и тот же буфер.
я попробовал некоторые дополнительные методы, такие как первая установка массива буферных каналов значения все до 0, а затем установка "onaudioprocess" в "null", это все равно произвело циклический срез звука вместо тишины.
у меня есть код, как показано ниже (coffeescript)
context = new webkitAudioContext()
scriptProcessor = context.createScriptProcessor()
scriptProcessor.onaudioprocess = (e)->
outBufferL = e.outputBuffer.getChannelData(0)
outBufferR = e.outputBuffer.getChannelData(1)
i = 0
while i < bufferSize
outBufferL[i] = randomNoiseFunc()
outBufferR[i] = randomNoiseFunc()
i++
return null
return null
тогда, когда я хочу остановить его
stopFunc1: ->
scriptProcessor.onaudioprocess = null
Я также попытался установить массивы буферных каналов в 0, а затем установить обратный вызов в null
stopFunc2: ->
scriptProcessor.onaudioprocess = (e)->
outBufferL = e.outputBuffer.getChannelData(0)
outBufferR = e.outputBuffer.getChannelData(1)
i = 0
while i < bufferSize
outBufferL[i] = 0
outBufferR[i] = 0
i++
scriptProcessor.onaudioprocess = null
return null
return null
оба метода приводят к срезу звука, который петляет очень быстро, а не без звука.
Is есть способ сделать это правильно или я просто думаю об этом неправильно?
любая помощь очень ценится.
1 ответов
возможно, я неправильно понял...
но если вы null out onaudioprocess
, Он не остановит воспроизведение сразу, если вы просто не нажмете его в самом конце текущего буфера.
давайте скажем ваш bufferSize
- 2048, и вы случайно null out onaudioprocess
half-way через настоящую продолжительность буфера 46ms (2048 / 44100 * 1000). У вас все равно будет еще 23 мс аудио, которое уже было обработано вашим ScriptProcessor
до вы аннулировали его из.
лучше всего, вероятно, бросить узел усиления в путь и просто отключить его по требованию.