emscripten-core/emscripten

Working with Audio Worklet

Open

#6,230 创建于 2018年2月12日

在 GitHub 查看
 (35 评论) (6 反应) (0 负责人)C++ (3,519 fork)batch import
help wanted

仓库指标

Star
 (27,361 star)
PR 合并指标
 (平均合并 19天 10小时) (30 天内合并 147 个 PR)

描述

Hey guys, I have a hard time integrating WASM + Emscripten with Audio Worklet. He's how we tried to do it:

  1. We are downloading and compiling .wasm file from the main thread.
  2. We are instantiating Emscripten's WASM module in the main thread
Module.instantiateWasm = (imports, successCallback) => {
       wasm.then((wasmBinary) => {
          WebAssembly.instantiate(new Uint8Array(wasmBinary), imports)
            .then((output) => {
              $window.Module.testWasmInstantiationSucceeded = 1;
              successCallback(output.instance, output.module);
            })
        });
        return {};
      };
  1. We are sending wasmModule and wasmMemory to AudioWorklet, thanks to the patch you did on message port
  2. From AudioWorklet thread we wanted to instantiate it by passing its' memory and module, like that:
AudioWorkletGlobalScope.Module['instantiateWasm'] = function(imports, receiveInstance) {
  AudioWorkletGlobalScope.wasmInstance = new WebAssembly.Instance(module, imports);
  receiveInstance(AudioWorkletGlobalScope.wasmInstance, AudioWorkletGlobalScope.Module.wasmModule);
  return AudioWorkletGlobalScope.wasmInstance.exports;
}

but this is problematic. To do that we need to import Emscripten glue-js output file in AudioWorklet context. So I've tried to do something like that: audioCtx.audioWorklet.addModule('wasm/sndt.js') but it didn't work since Emscripten is not prepared to work in the AudioWorklet context.

Best, Jacek.

贡献者指南