我有下面的例子。我尝试通过调用super(...)
来传递options
参数。当我这样做时,我没有得到我指定的2个输出通道,而是只得到1个输出通道。
class Processor extends AudioWorkletProcessor {
constructor() {
super({outputChannelCount: [2]});
}
process(inputs, outputs, parameters) {
console.log("output channels: ", outputs[0].length);
return true;
}
}
registerProcessor('processor', Processor);
当我尝试同样的传递options
到AudioWorkletNode
时,就像下面的例子一样,它像预期的那样工作。
let audioContext = new AudioContext();
(async () => {
await audioContext.audioWorklet.addModule('processor.js');
audioWorkletNode = new AudioWorkletNode(audioContext, 'processor', {outputChannelCount: [2]});
audioWorkletNode.connect(audioContext.destination);
})();
这在我尝试的任何浏览器中都无法工作。
我做错了什么吗?这是臭虫吗?是否有一些在Web音频API规范,我在这里失踪?
我认为你所描述的是意料之中的。AudioWorkletProcessor
的构造函数不接受IDL定义中定义的任何参数:
https://webaudio.github.io/web-audio-api/AudioWorkletProcessor
在主线程上传递给AudioWorkletNode
构造函数的选项被存储为pending processor construction data
。它们是自动应用的,无法从处理器内部更改它们。
我想这是为了确保AudioWorkletNode
及其相应的AudioWorkletProcessor
始终具有相同的配置。如果您可以更改处理器内的配置,则AudioWorkletNode
将不同步,直到信息再次传输回来。