SDL用の1ソース完結OpenAL実装 MojoAL
久々に新しいOpenAL実装が現われた気がする。
- https://hg.icculus.org/icculus/mojoAL
- http://openal.org/pipermail/openal/2018-March/000675.html
- アナウンス投稿
MojoALはSDL作者のRyan C. GordonによるステレオOpenAL実装で、1ソースでOpenALの実装に必要なチャンネル管理やステレオミキサを実装している。もともと氏はLokiでSDL関連の開発をやっていて、そのLokiはOpenALの開祖でもあるので、ある意味本家筋から追加の実装が出てきたと言える。(今普及しているOpenAL-SoftもCreativeがメンテナンスしていた参照実装ベースなので本家筋に相当する。)
オープンソースなOpenAL実装には既に多機能なOpenAL-Softが有るが、これはLGPLなのでプロジェクトによっては使いづらい。またSteam RuntimeにもOpenAL-Softは含まれているが激烈に古く( https://github.com/ValveSoftware/steam-runtime/issues/18 )、あまり良いWindows向けのディストリビューションも無い。
OpenALは元々OpenGLのようにIGDを提供してハードウェアベンダがそれぞれのハードウェアに最適化したOpenALドライバを提供できるように配慮しているが、それを実際に行ったのはCreative(とnForce時代のnVidia)くらいで、結局のところ単なるオーディオAPIとして使用されることが多い。
MojoALで興味深いのはマルチスレッド安全であることを念頭に置いている点で、ソースコードのコメント https://github.com/spurious/mojoAL-mirror/blob/a0d889c447a1f4e1e4dabedf63ad1e45722c5789/mojoal.c#L51 でポイントを解説している。
- デバイスハンドルの加除はスレッドセーフにしない(他のスレッドからの操作中にデバイスの加除を行うことはスレッドセーフにしない - ゲーム中にデバイスの加除をしない) https://github.com/spurious/mojoAL-mirror/blob/a0d889c447a1f4e1e4dabedf63ad1e45722c5789/mojoal.c#L60
- バッファは一度確保したら解放しない(再利用はされる) https://github.com/spurious/mojoAL-mirror/blob/a0d889c447a1f4e1e4dabedf63ad1e45722c5789/mojoal.c#L76
- ソース(OpenALでのオーディオ入出力ポート)を確保できるだけ確保するようなアプリケーションに(lock-freeで)対応するために、ソースオブジェクトは静的に事前確保する。ソースに関連付けられるバッファは動的に確保されるため、バッファリスト自体はロックが必要になる。https://github.com/spurious/mojoAL-mirror/blob/a0d889c447a1f4e1e4dabedf63ad1e45722c5789/mojoal.c#L80
- 等
SDLが提供するオーディオI/Fは"pull型"、つまり、オーディオデバイスが再生を進めるにつれ、非同期のコールバックが呼び出されてアプリケーションに新しいPCMデータを要求する。対して、OpenALは"push型"で、アプリケーションは適当なタイミングでオーディオを生成し、再生デバイスに対してpushする形になっている。
MojoALはこのギャップを埋めてSDL上でpush型のAPIを提供する。Waveファイルを再生するといったハイレベル機能は提供しない。(これは既にSDL_Mixer https://www.libsdl.org/projects/SDL_mixer/docs/SDL_mixer_frame.html が有る)
各種OpenAL実装
現時点で気にする必要のあるOpenAL実装は3つ:
- OpenAL-soft: http://kcat.strangesoft.net/openal.html (各種PCMバックエンドに対応したLGPL実装)
- AppleのOpenAL実装(XCodeに含まれる、Core Audioのwrapper)
- EmscriptenのOpenAL実装: https://kripken.github.io/emscripten-site/docs/porting/Audio.html (WebAudioのwrapper)
これにMojoALも加えて良い気はする。
Creativeはここ数年ハードウェアアクセラレーションに対応したOpenALデバイスを開発していない。
VR/xRの普及はOpenALのようなAPIに良い影響を与える気がするが、実際にはOculus等のSDKは専用のAPIを提供しており、従来OpenALを統合用のAPIとしていたBlueRippleも専用のC++ API( http://www.blueripplesound.com/products/rapture3d-universal-sdk )を販売している。AeonWaveも去年発表した3.xではOpenAL実装を更新しなかった ( http://www.adalin.com/ )。
...というわけで世間の立体音響への盛り上りとは裏腹に、OpenALのようなAPIはあまり盛り上りを見せていないのが現状と言える。