sound:start
差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
| sound:start [2014/04/27 18:19] – [Sound API] oga | sound:start [2014/04/28 16:39] (現在) – [OpenSL ES] oga | ||
|---|---|---|---|
| 行 3: | 行 3: | ||
| ^ Platform | ^ Platform | ||
| - | | Android NDK | OpenSL ES, OpenMAX | + | | Android NDK | OpenSL ES / OpenMAX |
| | iOS | OpenAL | | iOS | OpenAL | ||
| | WindowsPhone | | WindowsPhone | ||
| 行 11: | 行 11: | ||
| - | ^ API | + | ^ API |
| - | | Android NDK OpenSL ES | Y | + | | Android NDK OpenSL ES | Y | Y | |
| - | | Android NDK OpenMAX AL | | + | | Android NDK OpenMAX AL | | | |
| - | | iOS OpenAL | + | | iOS / OSX OpenAL |
| - | | Windows DirectSound | + | | Windows DirectSound |
| - | | Windows DirectShow | + | | Windows DirectShow |
| + | |||
| + | * ↑空欄は未確認。実装により機能差があります。 | ||
| + | * PCM はストレートのみ。OpenSL ES は再生可能な周波数固定。 | ||
| + | |||
| + | |||
| + | ====== Game と Sound API ====== | ||
| + | |||
| + | レガシーなゲームに必要なサウンド機能は大きく分けて 2種類あります。 | ||
| + | |||
| + | - 効果音 | ||
| + | * できるだけ低レイテンシで再生可能なこと | ||
| + | * ワンショット | ||
| + | * 多重再生 | ||
| + | - BGM | ||
| + | * MIDI かストリームによりメモリ消費を抑える | ||
| + | * Loop 再生が可能。できれば Loop ポイントを指定できることが望ましい | ||
| + | |||
| + | 多くの場合効果音はオンメモリのシンプルな PCM で、同じデータを多重に再生可能です。 | ||
| + | BGM は手軽かつリソース管理が簡単なストリーム再生が用いられます。 | ||
| + | |||
| + | 現在はハードウエアの高機能化、ゲーム内容の多様化により、必ずしもこの通りではありません。 | ||
| + | |||
| + | |||
| + | ===== API 構成 ===== | ||
| + | |||
| + | 多くの API は下記の構造を持っています。 | ||
| + | |||
| + | - Engine | ||
| + | - Player Object | ||
| + | - Buffer Object | ||
| + | - Stream API | ||
| + | |||
| + | |||
| + | ==== Engine ==== | ||
| + | |||
| + | Application 毎の Context のようなものです。 | ||
| + | リソース管理、各種 Object 管理を行います。 | ||
| + | |||
| + | ==== Player ==== | ||
| + | |||
| + | データを再生するチャンネルに相当します。 | ||
| + | 多重再生を行う場合は、Player を複数用意します。 | ||
| + | ハードウエアや API 仕様により、ミックス可能なプレイヤー(チャンネル)数には上限があります。 | ||
| + | |||
| + | ==== Buffer ==== | ||
| + | |||
| + | 実際に再生を行う PCM データです。 | ||
| + | ハードウエアがサポートしているフォーマットに制限されます。 | ||
| + | |||
| + | 動的に Buffer に書き込みを行うストリーム再生を行う場合は、複数の Buffer を Queue として扱います。 | ||
| + | Buffer 毎に再生完了 Event が発生するので、そのタイミングで次の Buffer を Player に渡します。 | ||
| + | |||
| + | ==== Stream API ==== | ||
| + | |||
| + | ストリーム再生をサポートする API が用意されている場合があります。 | ||
| + | Queue の管理を行ってくれるものから、ファイル名や URL を指定するだけで全部自動で再生してくれるものまでさまざまです。 | ||
| + | |||
| + | どの程度の機能を持っているのかは API に依存します。 | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| 行 24: | 行 90: | ||
| Windows の COM Object によく似た API 構造を持っています。 | Windows の COM Object によく似た API 構造を持っています。 | ||
| - | そのため、名称とは裏腹に使い方は OpenGL よりも DirectX (DirectShow) に似ています。 | + | そのため名称とは裏腹に使い方は OpenGL よりも DirectX (DirectShow) に似ています。 |
| COM と異なるのは、Object と Interface が完全に分かれていること。 | COM と異なるのは、Object と Interface が完全に分かれていること。 | ||
| 行 34: | 行 100: | ||
| 再生するデータが Buffer Object を持たない構造です。 | 再生するデータが Buffer Object を持たない構造です。 | ||
| PCM などのサウンドデータは自分でメモリ管理します。 | PCM などのサウンドデータは自分でメモリ管理します。 | ||
| + | |||
| + | その代わり再生可能なフォーマットに制限があり、Android NDK 版では対応する周波数が 9種類程度に固定されています。 | ||
| + | おそらくバッファオブジェクトを持つ他のフォーマットと違い、ロード時にハードウエアが対応しているフォーマットに変換できないためと思われます。 | ||
| + | |||
| 再生には Player が必要です。 | 再生には Player が必要です。 | ||
| 再生するデータのパラメータが異なる場合は、新たな Player が必要になります。 | 再生するデータのパラメータが異なる場合は、新たな Player が必要になります。 | ||
| + | |||
| + | Android NDK の OpenSL ES ではすべての API が使えるわけではなく、Caps 等対応していない Interface も多数あります。 | ||
| + | 反対に Android 向けに単純化した、専用の API も用意されています。 | ||
| + | Android 4.0 からは OpenMAX に対応しており、OpenSL ES は事実上 OpenMAX の一部として動作しています。 | ||
| + | |||
| + | Android 版の対応フォーマット | ||
| + | |||
| + | * unsigned 8bit / signed 16bit | ||
| + | * mono / stereo | ||
| + | * 8KHz, 11.025KHz, 12KHz, 16KHz, 22.05KHz, 24KHz, 32KHz, 44.1KHz, 48KHz | ||
| + | |||
| + | なお Locator の指定によりデータ配置の自由度が非常に高く、ファイル名や URI 指定でメモリ以外のデータ再生も可能です。 | ||
| + | |||
| 行 42: | 行 125: | ||
| | Buffer Object | | Buffer Object | ||
| | Player Object | | Player Object | ||
| + | |||
| + | |||
| + | |||
| ====== OpenAL ====== | ====== OpenAL ====== | ||
| 行 52: | 行 138: | ||
| Buffer を作り、Player (Source) 経由で再生を行います。 | Buffer を作り、Player (Source) 経由で再生を行います。 | ||
| 非常にわかりやすい API です。 | 非常にわかりやすい API です。 | ||
| + | 上位 API として Linux, Windows でも利用可能。 | ||
| ^ ^ ^ Object | ^ ^ ^ Object | ||
| 行 70: | 行 156: | ||
| DirectX7 以前の Direct3D レンダリングが、Surface に対するメソッドとして実装されていたことによく似ています。 | DirectX7 以前の Direct3D レンダリングが、Surface に対するメソッドとして実装されていたことによく似ています。 | ||
| - | そのため、同じ Buffer のデータを多重で鳴らすことができず、 | + | そのため同じ Buffer のデータを多重で鳴らすことができず、 |
| ゲームでは必要に応じて Buffer を複製することになります。 | ゲームでは必要に応じて Buffer を複製することになります。 | ||
| 行 84: | 行 170: | ||
| + | |||
| + | |||
| + | ====== OpenMAX ====== | ||
| + | |||
| + | OpenSL に対するちょうど DirectShow のような位置づけです。 | ||
| + | オーディオだけでなく Video を含めた Multi media API となっています。 | ||
| + | |||
| + | API 構造は OpenSL と同一で、COM のように Object から必要な Interface を取り出して呼び出します。 | ||
| + | オーディオ部分は OpenSL と重複しますが、名前が違うだけで API の使い方も命令も同一です。 | ||
| + | 内部構造的にも OpenMAX と OpenSL の実装は、部分的に共有されているようです。 | ||
| + | |||
| + | OpenSL ES 同様、Android NDK では Android 独自の API があります。 | ||
sound/start.1398590369.txt.gz · 最終更新: by oga
