How can I stop a Web Audio Script Processor and clear the buffer?

浪子不回头ぞ 提交于 2019-12-10 13:39:54

问题


I'm trying to figure out a way to stop a web audio script processor node from running, without disconnecting it.

My initial thought was to just set the "onaudioprocess" to "null" to stop it, but when I do this I hear a really short loop of audio playing. My guess is that the audio buffer is not being cleared or something and it's repeatedly playing the same buffer.

I tried some additional techniques like first setting the buffer channel array values all to 0, then setting the "onaudioprocess" to "null", this still produced a looping slice of audio instead of silence.

I have some code like the below (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

Then when I want to stop it

stopFunc1: ->
  scriptProcessor.onaudioprocess = null

I also tried setting the buffer channel arrays to 0, then setting the callback to 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

Both techniques result in a slice of audio that loops really fast, instead of no audio.

Is there a way to do this correctly or am I just thinking about it wrong?

Any help greatly appreciated.


回答1:


Maybe I'm misunderstanding...

But if you null out onaudioprocess, it won't stop playback immediately unless you just happen to hit it at the very end of the current buffer.

Let's say your bufferSize is 2048, and you happen to null out onaudioprocess half-way through the current buffer duration of 46ms (2048 / 44100 * 1000). You're still going to have the another 23ms of audio that's already been processed by your ScriptProcessor before you nulled it out.

Best bet is probably to throw a gain node into the path and just mute it on-demand.



来源:https://stackoverflow.com/questions/17648819/how-can-i-stop-a-web-audio-script-processor-and-clear-the-buffer

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!