ACP の概要
このセクションでは、ACP のプログラミング インターフェイスについて説明します。acphal ライブラリ (acphal.lib) は、Scalable Hardware Audio Processing Engine (SHAPE) の API セットを定義します。また、Microsoft Game Development Kit (GDK) には、SHAPE で使用するオーディオ データを準備するのに役立つオーディオ ユーティリティとソース コードのコレクションも含まれています。ユーティリティ ヘッダーは、次の内容を定義します。
- サポートされている各データ形式のコンテキスト構造体
- これらのコンテキストの読み取りと書き込みに使用できる完全な関数セット
- フローグラフ
- DMA ユーティリティ
- EQ コンプレッサー ユーティリティ
- フィルター ボリューム ユーティリティ
- PCM ユーティリティ
- SRC ユーティリティ
- XMA ユーティリティ
- ターゲット値
- スレッド セーフティ
- PCM および XMA データに SRC を使用するためのガイドライン
- タイトルの一時停止と再開
フローグラフ
SHAPE を使用するには、タイトルは通常、SHAPE フローグラフを作成します。代替方法の説明については、XMA ユーティリティセクションを参照してください。SHAPE フローグラフは、SHAPE ブロックごとのコマンドの配列と、個々のブロックの操作の順序およびそれらが処理するデータを記述する付随コンテキスト データです。ACP は、フローグラフ内のデータを使用して、SHAPE ブロック内の操作を適切にスケジュールします。 タイトルは、フローグラフの構築と ACP への送信に責任を持ちます。フローグラフを構築するには、ShapeFlowGraph (フローグラフ ユーティリティ メソッド) を使用してください。 以下の図では、緑のブロックが SHAPE コンポーネントを表し、シアンのブロックがソース素材、ラベル付きの黄色い円がハードウェア ミックス バッファーです。3D サウンド
図 1. 2 つの音声。それぞれが 2 つの出力の間でパンされ、共通の出力へのセンドがあります。 コードでは、このフローグラフは次のように表現できます。ソフトウェア オーディオ エンジンのフロント エンド
図 2. ソフトウェア エンジンの基本的なフロント エンド。このモデルを使用するすべての音声で、同じ構造を使用できる可能性があります。 コードでは、このフローグラフは次のように表現できます。オーディオのレンダリング
オーディオをレンダリングするには- 処理されるオーディオ グラフを定義する、前述の例のようなフローグラフを作成します。
- フローグラフが何をどのように処理するかを定義するコンテキスト構造体を作成します。
-
SubmitCommand メソッドを使用して、フローグラフを ACP に送信します。
SubmitCommandに渡されるパラメーターに基づいて、フローグラフは 1 回処理された後に破棄されるか、オーディオ フレームごとに処理されます。 -
タイトルは、
ACP_COMMAND_UPDATE_*_CONTEXTコマンドを使用するか、フローグラフ処理と適切に同期して手動でコンテキストを更新することにより、オーディオ フレームごとにコンテキスト データを更新する責任があります。- ACP_COMMAND_UPDATE_DMA_CONTEXT
- ACP_COMMAND_UPDATE_EQCOMP_CONTEXT
- ACP_COMMAND_UPDATE_FILTVOL_CONTEXT
- ACP_COMMAND_UPDATE_PCM_CONTEXT
- ACP_COMMAND_UPDATE_SRC_CONTEXT
- ACP_COMMAND_UPDATE_XMA_CONTEXT
ACP_COMMAND_TYPE_UPDATE_*_CONTEXT コマンドは、オーディオ フレームあたり少数のコンテキストを更新する場合に使用します。これらのコマンドを使用して大量のコンテキストを更新するのは、コマンドの処理に加えて大量のコンテキスト データを ACP にコピーおよび送信する必要があるため、効率的ではありません。大量のコンテキストを更新したい場合、タイトルはコンテキスト データを変更してから非永続的なフローグラフを ACP に送信するか、ACP_COMMAND_TYPE_START_FLOWGRAPH コマンドと ACP_COMMAND_LOAD_SHAPE_FLOWGRAPH コマンドの waitForStart パラメーターを上手く活用して、コンテキストが更新されるまで処理を保留する必要があります。フローグラフの処理が完了すると、コンテキストは再度更新可能な状態になります。
コンテキストを更新する第 3 の代替方法は、ダブル バッファリング プロセスを使用することです。タイトルは、フローグラフが処理されている間にコンテキストの 2 番目のコピーを更新し、オーディオ フレームの開始時にコンテキストをスワップできます。
フローグラフの解析
ACP は、オーディオ フレームの終了時に永続的なフローグラフの解析を終了します。ACP のオーディオ フレームは 2.667 ms の制限があります。タイトルにオーディオ フレームの 75% を処理に必要とするフローグラフがあるものの、タイトルがオーディオ フレームの 30% が経過するまで処理を開始させない場合、解析されなかったフローグラフの部分は削除されます。フローグラフ自体は変更されません。これが発生すると、タイトルがメッセージを受信するように登録されている場合、ACP はACP_MESSAGE_TYPE_FLOWGRAPH_TERMINATED メッセージを送信します。内部の SHAPE キューに挿入されなかったコマンドを特定するには、タイトルはフローグラフ コマンドの queued フラグを検査します。
非永続的なフローグラフは、送信タイミングに関係なく、通常は完了まで処理されます。例外の 1 つは、ソース データが利用できないことや disabled フラグの不適切な使用による、1 つ以上のコマンドのブロックです。タイトルは、ACP オーディオ フレーム内のどの時点でも非永続的なフローグラフを送信でき、(いくつかの境界条件を除いて) 完了することが確実です。利点は、タイトルが ACP オーディオ フレーム間隔の 2.667 ms 内でフローグラフを引き続きサービスしている限り、オーディオ クロックと完全に同期している必要はないことです。リスクは、フローグラフを一貫して送信しない場合や、フローグラフが 2.667 ms を超える必要がある場合に、タイトルがオーディオ ドロップアウトを発生させる可能性があることです。
フローグラフのライフタイムの概要を以下に示します。
- 永続的なフローグラフは、新しいフローグラフや null フローグラフ (実質的に削除されます) を送信して置き換えられるまで、ACP 上でアクティブな状態を維持します。
- クライアントが ACP に対して開始コマンドを待つように指示しない限り、ACP はオーディオ フレームの先頭で永続的なフローグラフの処理を開始します。
- ACP は、完全に処理されていなくても、オーディオ フレームの終了直前に永続的なフローグラフの処理を停止します。
- 非永続的なフローグラフは、完了するまでのみアクティブで、その後は削除されます。
- 非永続的なフローグラフは、オーディオ フレーム間でもアクティブな状態を維持します。完了後にのみ削除されます。
コマンドの処理は、フローグラフの解析には縛られません。ACP は常に新しいコマンドをスキャンし、フローグラフを解析したり他の作業を行ったりしている間、可能な限り高速に処理します。
フローグラフの更新
フローグラフを更新するためのオプションは、前述のコンテキストを更新するオプションと似ています。基本的なルールは同じで、処理中のフローグラフは更新しないでください。 フローグラフを更新するには、次の 3 つの戦略を使用できます。- 非永続的なフローグラフを使用し、必要に応じて再構築し、オーディオ フレームの先頭で送信します。タイトルは、同じフローグラフを必要なだけ再利用できます。フローグラフが変わらない場合、タイトルはそれを再構築する必要はありません。古いフローグラフが処理されている間に新しいフローグラフを構築することで、このアプローチをダブル バッファーとすることもできます。再構築されるとき、フローグラフをゼロから構築できるだけでなく、ミックス バッファー ID を適切に設定することで、そのセクションを保存してリンクすることもできます。
-
永続的なフローグラフを使用し、変更が必要な場合にのみ再構築および置換します。ここでもダブル バッファリングは機能します。ACP_COMMAND_LOAD_SHAPE_FLOWGRAPH の
waitForStartパラメーターを使用しないことで、ACP を自由に実行できます。ACP はオーディオ フレームが開始した直後、そのオーディオ フレームにタグ付けされたコマンドが処理された直後にフローグラフの処理を開始します。あるいは、waitForStartパラメーターを設定して、ACP_COMMAND_TYPE_START_FLOWGRAPHコマンドが送信されるまでフローグラフが処理されないようにすることもできます。これはフローグラフの更新自体に直接影響しませんが、同期の若干の改善を可能にします。 -
フローグラフ コマンドの
disabledフラグを使用して、フローグラフの一部を無効にします。たとえば、マスター フローグラフを構築し、実行ごとに必要なセクションのみ有効にできます。ACP に新しいフローグラフを反映するには、これをオプション 1 または 2 と組み合わせる必要があります。ACP は現時点で孤立したブロックを探すためにフローグラフをトラバースしない点に注意してください。タイトルはフローグラフを介して完全なパスを無効にする必要があります (最初のノードだけではありません)。これが行われない場合、SHAPE コマンドが一時的にハードウェアを停止させます。これらの停止は、処理できず小さなコストで削除される単一ブロックなど、単純なものである可能性があります。また、音声全体を停止させるほど深刻なものである可能性もあります。
ACP_MESSAGE_TYPE_FLOWGRAPH_COMPLETED を使用して更新を管理している場合、ACP がメッセージ キューにメッセージを追加してからタイトルが PopMessage を呼び出すまでの間、ACP は長期間アイドル状態のままになる可能性があります。このアプローチで更新を管理しないでください - ACP をアクティブに保ってください。
複数のフローグラフ
タイトルは、複合的な要件がハードウェア機能を超えない限り、オーディオ フレームごとに複数のフローグラフを処理できます。利点は、タイトルがミドルウェアとカスタムの両方の複数のオーディオ エンジンを実行したり、解析をより管理しやすいチャンクに分割したりできることです。欠点は、このモードでは SHAPE ハードウェアが効率的に実行されないことです。SHAPE の最大スループットを実現するには、各 SHAPE ブロックを 100% ビジーに保つ必要がありますが、複数のフローグラフが処理されているときには不可能です。 ACP クライアントあたり読み込めるフローグラフは 1 つだけです。クライアントが新しいフローグラフを送信すると、既存のものと置き換わります。複数のフローグラフのサポートが必要なタイトルは、各フローグラフ タイプごとに個別のクライアント (各クライアントに独自のコマンドおよびメッセージ キューを持つ) を持つか、新しいフローグラフを送信する前にフローグラフの完了を待つ必要があります。 複数のフローグラフのサポートは、単一クライアントではなく、複数のクライアントで使用されるように設計されています。これにより、ミドルウェア エンジンがフローグラフを送信し、タイトルが追加のカスタム処理のために別のフローグラフを送信できます。タイトルが必要とする ACP クライアントごとに、IACPHAL インターフェイスのインスタンスを作成してください。
すべての ACP および SHAPE リソースはすべてのクライアント間で共有されるため (特にコンテキスト配列)、クライアントはそれらのリソースの割り当てと共有を調整する必要があります。
DMA ユーティリティ
Direct Memory Access (DMA) ユーティリティは、ShapeDMAContext.h ファイルにインクルードされています。以下のユーティリティは、SHAPE_DMA_CONTEXT 構造体を操作します。詳細については、ShapeDmaContext (DMA ユーティリティ メソッド) を参照してください。EQ コンプレッサー ユーティリティ
EQCOMP ユーティリティは、ShapeEqCompContext.h ファイルにインクルードされています。これらのユーティリティは、SHAPE_EQCOMP_CONTEXT 構造体を操作します。 詳細については、ShapeEqCompContext (EQCOMP ユーティリティ メソッド) を参照してください。フィルター ボリューム ユーティリティ
フィルター ボリューム ユーティリティは、ShapeFiltVolContext.h ファイルにインクルードされています。これらのユーティリティは、SHAPE_FILTVOL_CONTEXT 構造体を操作します。 詳細については、ShapeFiltVolContext (FLTVOL ユーティリティ メソッド) を参照してください。PCM ユーティリティ
Pulse Code Modulation (PCM) ユーティリティは、ShapePCMContext.h ファイルにインクルードされています。これらのユーティリティは、SHAPE_PCM_CONTEXT 構造体を操作します。 詳細については、ShapePcmContext (PCM ユーティリティ メソッド) を参照してください。SRC ユーティリティ
Sample Rate Convertor (SRC) ユーティリティは、ShapeSRCContext.h ファイルにインクルードされています。これらのユーティリティは、SHAPE_SRC_CONTEXT 構造体を操作します。 詳細については、ShapeSrcContext (SRC ユーティリティ メソッド) を参照してください。XMA ユーティリティ
XMA ユーティリティは、ShapeXMAContext.h ファイルにインクルードされています。これらのユーティリティは、SHAPE_XMA_CONTEXT 構造体を操作します。 詳細については、ShapeXmaContext (XMA ユーティリティ メソッド) を参照してください。 ハードウェア エミュレーションの XMA デコード機能は制限されています。詳細については、SHAPE_XMA_CONTEXT 構造体トピックを参照してください。 タイトルは、フローグラフを使用せずに XMA データを使用できますが、次の表に示すように、データは ACP_COMMAND_TYPE コマンドを使用して ACP を経由する必要があります。
これらのコマンドを使用することで、タイトルは XBOX One ACP HAL を XBOX 360 XMA HAL とほぼ同じように、次の操作順序で使用できます。
- バッファー、オフセットなどの関連データでコンテキストを設定します。
- コンテキストを有効にします。
-
コンテキストを更新します。コンテキストが無効になっている場合、タイトルは自由に内容を直接変更できます。コンテキストが有効になっている場合、タイトルはまず無効にするか、
ACP_COMMAND_TYPE_UPDATE_XMA_CONTEXTコマンドを使用できます。後者では、ACP が無効化、待機、および更新を処理してくれるため、より効率的な場合があります。
ターゲット値
ユーティリティ関数で設定できるターゲット値は、オーディオ フレーム終了時のパラメーターの最終値を表します。たとえば、SHAPE_FILTVOL_CONTEXT 構造体には、gain と gainTarget の値が含まれます。フレームが処理されている間、gain は次の方程式による線形補間を使用して計算されます。
gain は gainTarget と等しくなります。
ACP のターゲット パラメーターは、次の表に示すように設定できます。
スレッド セーフティ
IACPHAL インターフェイスのメソッドおよび ACPHAL メソッドはスレッドセーフです。ApuCreateHeap 呼び出しが行われる場合、ヒープはすべてのスレッドで使用されます。 以下のユーティリティ関数はスレッドセーフではありません。ただし、それらのソース コードが提供されています。必要に応じて、スレッドセーフにできます。一般的な方法は、Critical Section Objects を使用することです。- ShapeFlowGraph (フローグラフ)
- ShapeDmaContext (DMA)
- ShapeEqCompContext (EQCOMP)
- ShapeFiltVolContext (FLTVOL)
- ShapePcmContext (PCM)
- ShapeSrcContext (SRC)
- ShapeXmaContext (XMA)
PCM および XMA データに SRC を使用するためのガイドライン
次の表は、SRC ブロックを PCM および XMA データで使用するためのガイドラインを示しています。これらのシナリオのいずれかが完了すると、SRC コマンドは
SHAPE_SRC_COMMAND_TYPE_STOP_IMMEDIATE になります。タイトルの一時停止と再開
タイトルは、たとえばユーザーが Constrained モードにしたときなど、一時停止と再開ができる必要があります。IAcpHal を使用して SHAPE ハードウェアに直接コーディングする場合の一時停止と再開では、タイトルは単にコマンドの送信を停止するようにしてください。既に送信されたコマンドは正常に完了し、メッセージ キューを埋める可能性があります。
タイトルが永続的なフローグラフを使用している場合は、処理を停止するために null フローグラフを読み込む必要があります。これは、XAudio2 を使用してコーディングする場合の一時停止および再開プロセスとは異なります。詳細については、XAudio2 の概要を参照してください。
