我正在使用 Angular 开发视频会议 Web 应用程序。我试图在我的AudioWorkletProcessor
课堂上调用一些 wasm 函数。但是,我非常坚持如何将 wasm 模块传递给AudioWorkletProcessor
然后调用这些函数。我能够从 emcc 生成的 js 文件中实例化 wasm 模块(使用命令:)emcc test.cpp -s WASM=1 -s MODULARIZE=1
,然后options.processorOptions
在我们构造AudioWorkletNode
;时尝试通过参数传递这个模块。但是,似乎 Function 对象无法传递,因为它提供了DataCloneError
. 有没有更好的方法来实例化 wasm 模块并将其传递给工作集处理器以便我可以使用它的功能?
audio.service.ts 的代码:
import { Injectable } from '@angular/core';
import { AudioContext, AudioWorkletNode } from 'standardized-audio-context';
import * as Module from '../../../assets/worklet/a.out.js'; // a.out.js is file generated by emcc
declare const WebAssembly: any;
@Injectable()
export class AudioService {
audioCtx = new AudioContext();
constructor() {}
async createNewSetting(track) {
const srcNode = this.audioCtx.createMediaStreamTrackSource(track);
const destNode = this.audioCtx.createMediaStreamDestination();
await this.audioCtx.resume();
await this.audioCtx.audioWorklet.addModule(
'./assets/worklet/spatial-processor.js'
);
// Instantiate the wasm module and put in path to file
const wasm = await Module({ locateFile: function(s) { return 'assets/worklet/' + s; }});
// Will throw DataCloneError
const spatialNode = new AudioWorkletNode(
this.audioCtx,
'spatial-processor',
{ processorOptions: {
compiledModule: wasm
}}
);
// Connect the nodes
srcNode.connect(spatialNode);
spatialNode.connect(destNode);
// Return the updated audio stream
return destNode.stream.getTracks()[0];
}
}