Open4
pthread emscriptenでもSDL2のオーディオ出力したい

前回はオーディオを諦めたけど、まぁ簡単(当社比)にできるので対応してしまう。
prev

問題
問題は、SDL2の実装手法の都合でオーディオコールバックは常にメインスレッドから呼ばれるという点がある。SDL2は(既にdeprecatedだけど)Web Audioの ScriptProcessorNode
を使用して、そこからのコールバックにPCMデータを埋めさせるという手法を使っている。ここでは、ほぼそのまま SDL_OpenAudio
APIに渡したコールバックが呼ばれることになる。
今回、blockingなAPIを自由に使いたいがためにプログラム全体をサブスレッドで動かすという方法を取っているが、この ScriptProcessorNode に渡したコールバックはworkerではなくメインスレッドに無ければならない。

PROXY_TO_PTHREAD
する
手動で
やることは簡単で、
main
を別名に置き換えてしまい、自分でmainを pthread_create
したスレッドから呼出すようなコードを実装する。
SDL_OpenAudio
も置き換えておき、メインスレッドでは毎フレーム置き換えた SDL_OpenAudio
が呼出されていないか監視し、必要に応じて実際の SDL_OpenAudio
呼出しを行う。
元々、SDLのオーディオコールバックは別スレッドから呼ばれる可能性があるものなので、コールバックだけメインスレッドから呼ぶ形にしても特に問題はない。

Emscripten上のオーディオはF32のみ
適当に変換を実装したけど適当すぎるので後で直す必要がある。。具体的には波形のノーマライズ。
よくわからないので実測した。。