読者です 読者をやめる 読者になる 読者になる

pysdl2でオーディオ再生(コールバック方式)

以前SDL2でのコールバック方式オーディオ再生について書きましたが、同様のコードをpysdl2で試してみました(全コードを置いておきます)。

スレッド間のやりとりには標準のqueue.Queueを使っていますが、これが最適かどうかはよくわかりません。

動かしてみると一応まともに鳴っているように思われますが、少し気になるところもあります。pythonにはGIL(Global Interpreter Lock)があり、C++版と違ってメインスレッドとオーディオスレッドの並列動作が不可能なため、負荷が高くなったり環境が変わったりしたとき正常に再生できるかどうかはやや怪しい気がします。また、SDL_Delay()を省略して出力を/dev/nullに捨ててみると音が止まる現象が確認されています。*1

今書いているNESエミュレータは後々コア部分のみをライブラリ化してpythonから利用できるようにしたいと考えていて、そのために特定の映像/音声ライブラリには依存しない作りにしてあったのですが、オーディオ再生に関しては何かしら補助的なインターフェースを加えてC++側で行えるようにした方が無難かもしれないと考えています。

そういえばpygameにはコールバック方式のオーディオ再生機能はなかった気がしますが、この辺が理由なんですかね…?

*1:sys.setswitchinterval(0.001)を行うと止まらなくなりますが、Ctrl-Cは受け付けられません。