带有 SDL 音频的 Emscripten 工作模型

Posted

技术标签:

【中文标题】带有 SDL 音频的 Emscripten 工作模型【英文标题】:Emscripten worker-model with SDL audio 【发布时间】:2016-05-19 08:33:39 【问题描述】:

据我了解 Emscripten 工作者模型,它不支持共享状态。但是,我可以在 SDL 音频回调和我的主循环之间共享全局变量,如果我理解正确的话,这应该是不可能的。 emscripten 是否在主线程上执行音频回调,因此这是可能的,还是我完全误解了工作者概念和全局变量共享?

(我的假设是音频回调在工作人员中执行)。

注意:我指的是没有 pthreads 支持的 emscripten。

【问题讨论】:

【参考方案1】:

emscripten 是否在主线程上执行音频回调

是的。

据我所知,浏览器中的 javascript(无论是否从 C++ 编译)都无法从主线程播放音频

从https://github.com/kripken/emscripten/blob/1.36.4/src/library_sdl.js 可以看出,Emscripten 在底层使用了 AudioContext,通过https://developer.mozilla.org/en/docs/Web/API/AudioContext 和https://developer.mozilla.org/en-US/docs/Web/API/DedicatedWorkerGlobalScope,AudioContext 只能在主线程中创建,而不能在 Worker 范围内访问。

https://developer.mozilla.org/en/docs/Web/API/AudioContext 提到了 AudioWorker,但它声明了关于 createAudioWorker...

创建一个 AudioWorkerNode,它可以与 Web 工作线程交互以直接生成、处理或分析音频。这已于 2014 年 8 月 29 日添加到规范中,尚未在任何浏览器中实现。

【讨论】:

以上是关于带有 SDL 音频的 Emscripten 工作模型的主要内容,如果未能解决你的问题,请参考以下文章

Emscripten 调用 SDL_Init 冻结浏览器文本输入

如何在 cmake 中使用 emscripten 端口(SDL2 和 Freetype)

如何在 Emscripten + SDL 中禁用窗口事件捕获?

emscripten + sdl = 抛出异常:TypeError:无法设置未定义的属性“widthNative”

Emscripten SDL 编译失败

在 Edge 和 Safari (emscripten) 中使用 SDL_mixer 播放 .ogg 文件