Как остановить процессор веб-аудио скриптов и очистить буфер?

Я пытаюсь выяснить, как остановить запуск узла процессора веб-аудио скриптов, не отключая его.

моей первоначальной мыслью было просто установить "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 до вы аннулировали его из.

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