sound:start
差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
sound:start [2014/04/28 03:09] – [OpenAL] oga | sound:start [2014/04/28 16:39] (現在) – [OpenSL ES] oga | ||
---|---|---|---|
行 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 に依存します。 | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
行 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 ====== | ||
行 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.1398622161.txt.gz · 最終更新: 2014/04/28 03:09 by oga