Emscripten pthread版DOSBox-xを動かしたい会
とりあえずビルドは通したので細かい調整をする。
prev
JSPIあるしあんまり頑張らなくても良いか
本当はupstreamするくらいまで作り込むつもりだったけど、そもそもJSPI使えばメインスレッドをblockingに書けるので、あと1、2年で不要になる考察で大改造をupstreamするのはちょっと良くないなと思い直した。(Asyncify=2がこれ専用のモードとして用意されている。)
一旦、現状のAsyncify前提のコードを分離して専用のifdefを付けるのが良いかな。このコミットで消したコードが該当する。
オーディオサポートを一旦無効化
最初ChromeのAuto play規制で失敗してるのかと思ったけど、
そもそもEmscriptenはオーディオをサブスレッドで実行できないようだ(Proxyが無い)。また、Emscripten Audio WorkletはJS的なWorkerで動作するのでpthreadから操作できない。
たぶんメインスレッドでオーディオ読み書きをするのが簡単だろう。とりあえず後回しにしてオーディオを無効化した。
COEPするWebサーバを用意する
Emscriptenのpthreadは動作に SharedArrayBuffer
が必要なので適当にCOEPのhttpヘッダを設定する。
#!/usr/bin/env python3
from http import server # Python 3
class TheHandler(server.SimpleHTTPRequestHandler):
def end_headers(self):
self.send_my_headers()
server.SimpleHTTPRequestHandler.end_headers(self)
def send_my_headers(self):
self.send_header("Cross-Origin-Embedder-Policy", "require-corp")
self.send_header("Cross-Origin-Opener-Policy", "same-origin")
server.test(HandlerClass=TheHandler, port=3000)
coi-serviceworker
とか組込むべきなのかねぇ。。(というか、これでワークアラウンドできちゃったらあんまり意味なくない。。?)
とりあえずHTTPサーバをローカルに立てて、あとはngrokで。
ssh -R 443:localhost:3000 tunnel.jp.ngrok.com http
クリック位置がズレる
window.devicePixelRatio
!= 1 の環境に対応していない。 ...一応DOSBox-xはhigh DPI awareなのでそちらを利用するように修正するのが良いだろう。
Emscriptenは emscripten_get_device_pixel_ratio
を提供している。
DPI関連が真面目に実装されるのはSDL3を待った方が良いんだろうか。。?ひとまず後回し。
そこそこ動いた
まだ音が鳴らないけど。
ファイルシステムの投入
$EMSDK/upstream/emscripten/tools/file_packager pack.data --preload ./data@/data --js-output=data.js
こういう感じで data.js
を作り、本体よりも前に <script>
で読めばOK。
ついでにコマンドラインオプションも書いたけど、 callMain
に渡さないといけないのが盲点だった。