文書の過去の版を表示しています。
Sound API
Platform | API |
---|---|
Android NDK | OpenSL ES / OpenMAX |
iOS | OpenAL |
WindowsPhone | XAudio2 |
Windows | DirectSound / DirectShow / XAudio2 |
Mac OS X | OpenAL (Core Audio) |
Linux | ALSA |
API | Wave | Stream | 3D |
---|---|---|---|
Android NDK OpenSL ES | Y | Y | |
Android NDK OpenMAX AL | |||
iOS OpenAL | Y | N | Y |
Windows DirectSound | Y | N | Y |
Windows DirectShow | Y |
OpenSL ES
Windows の COM Object によく似た API 構造を持っています。 そのため名称とは裏腹に使い方は OpenGL よりも DirectX (DirectShow) に似ています。
COM と異なるのは、Object と Interface が完全に分かれていること。 インスタンスを持っているのは Object だけで、Interface は Release (Destroy) する必要がありません。
Interface は C言語から呼び出せる構造になっています。 lpVtbl を経由しないので実装に依存しませんが、C++ からの呼び出しでも第一引数が必要となっています。
再生するデータが Buffer Object を持たない構造です。 PCM などのサウンドデータは自分でメモリ管理します。
再生には Player が必要です。 再生するデータのパラメータが異なる場合は、新たな Player が必要になります。
Object | Create Object | Interface | QueryInterface | ||
---|---|---|---|---|---|
Buffer Object | 無し | – | – | – | – |
Player Object | あり | SLObjectItf | EngineObject→CreateAudioPlayer() | SLPlayItf | PlayerObject→GetInterface( SL_IID_PLAYER ) |
OpenAL
名称通り OpenGL によく似ています。
操作対象(つまり this 相当)は第一引数で渡すので、OpenGL のようにいちいち Bind する必要がありません。 その分、OpenGL よりも明確でより扱いやすい構造となっています。
Buffer を作り、Player (Source) 経由で再生を行います。 非常にわかりやすい API です。 上位 API として Linux, Windows でも利用可能。
Object | Create Object | Interface | QueryInterface | ||
---|---|---|---|---|---|
Buffer Object | あり | ALuint | alGenBuffers() | ||
Player Object | あり | ALuint | alGenSources() |
DirectSound 8
あくまで Buffer が主であって Player Object がありません。 再生機能は Buffer のメソッドのひとつです。
DirectX7 以前の Direct3D レンダリングが、Surface に対するメソッドとして実装されていたことによく似ています。
そのため同じ Buffer のデータを多重で鳴らすことができず、 ゲームでは必要に応じて Buffer を複製することになります。
Object | Create Object | Interface | QueryInterface | ||
---|---|---|---|---|---|
Buffer Object | あり | IDirectSoundBuffer | DS→CreateSoundBuffer() | ||
Player Object | 無し | – | – |
OpenMAX
OpenSL に対する DirectShow のような位置づけ。 オーディオだけでなく Video を含めた Multi media API となっています。
API 構造は OpenSL と同一で、COM のように Object から必要な Interface を取り出して呼び出します。 オーディオ部分は OpenSL と重複しますが、名前が違うだけで API の使い方も命令も同一です。 内部構造的にも OpenMAX と OpenSL の実装は、部分的に共有されているようです。
OpenSL ES 同様、Android NDK では Android 独自の拡張があります。