Web Audio API事件是否在单独的线程中运行?

时间:2012-11-08 11:40:55

标签: javascript html5 web-audio

我对 ScriptProcessorNode onaudioprocess 特别感兴趣(直到最近才称为 JavaScriptNode )。它是一个事件监听器,定期调用它进行音频处理。它是在单独的线程中运行的吗?

我想将数据提供给循环缓冲区并在此回调之外处理它,这样我就不会占用CPU了。我可以使用Web worker进行异步处理,但AFAIK在不同线程的情况下我需要不同的环形缓冲区实现。

有没有办法测试这个?

1 个答案:

答案 0 :(得分:0)

使用Bergi的解决方案,您将遇到structured clone algorithm无法复制audioProcessingEvent中的只读参数的问题。您需要做的是从可克隆的事件中分离出您需要的部分,并将它们传递给您的工作者,使用不同的数据结构,如下所示:

_onAudioProcess(audioProcessingEvent) {
  const {inputBuffer, outputBuffer} = audioProcessingEvent;
  // The output buffer contains the samples that will be modified and
  // eventually played, so we need to keep a reference to it.
  this._outputBuffer = outputBuffer;
  const numChannels = inputBuffer.numberOfChannels;

  const inputChannels =
    Array.from({length: numChannels}, (i) => {
      return inputBuffer.getChannelData(i);
    });

  this._worker.postMessage({
    command: 'DO_STUFF',
    inputChannels: inputChannels,
  });
}

您还需要访问setMessageHandler中对outputBuffer的引用,以便将处理后的数据复制回最终由用户播放。