Как я могу остановить обработчик скриптов 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 прежде чем вы обнулили это.

Лучшая ставка, вероятно, состоит в том, чтобы бросить узел усиления в путь и просто отключить его по требованию.

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