Как я могу остановить обработчик скриптов Web Audio и очистить буфер?
Я пытаюсь найти способ остановить работу узла процессора веб-аудио скриптов, не отключая его.
Моя первоначальная мысль состояла в том, чтобы просто установить "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
Оба метода приводят к получению фрагмента аудио, который зацикливается очень быстро, а не аудио.
Есть ли способ сделать это правильно, или я просто думаю об этом неправильно?
Любая помощь с благодарностью.
1 ответ
Может быть, я неправильно понимаю...
Но если вы обнулите onaudioprocess
, он не остановит воспроизведение немедленно, если только вы не нажмете его в самом конце текущего буфера.
Скажем ваш bufferSize
2048, и вы случайно обнулили onaudioprocess
на полпути через текущую длительность буфера 46 мс (2048 / 44100 * 1000). Вы по-прежнему будете иметь еще 23 мс аудио, которые уже были обработаны вашим ScriptProcessor
прежде чем вы обнулили это.
Лучшая ставка, вероятно, состоит в том, чтобы бросить узел усиления в путь и просто отключить его по требованию.