XACT とゲームの統合
このトピックでは、Microsoft Cross-Platform Audio Creation Tool (XACT) についてプログラマの視点から説明します。
- XACT のスコープ
- XACT の統合
- 関連トピック
XACT のスコープ
XACT API は、Microsoft クロスプラットフォーム オーディオ作成ツールでパッケージ化されたアセットを使用して機能する高レベルのインターフェイスを提供し、サウンドをレンダリングするために、ローレベル オーディオ ソフトウェア エンジンを使用します。API はデザイナーからは見えません。
XACT とその機能は、ほとんどのオーディオのニーズを満たす簡単かつ洗練されたソリューションとなります。XACT API は、ローレベル オーディオ ソフトウェア エンジンに置き換わるものではなく、このエンジンを基盤にして構築されています。オーディオ データを低レベルで管理する必要がある場合は、XAudio2 を使用して、オーディオ エンジンの機能に直接アクセスすることもできます。
オーディオ テクノロジ スタックへの XACT の適合に関するマップについては、「コア オーディオの概要」を参照してください。
XACT の統合
通常のワークフローでは、オーディオ デザイナーが、ゲームのオーディオ コンポーネントに必要なファイルを XACT を使用して作成します (これらのファイルの説明については、「XACT ファイルの種類」を参照してください)。プログラマはデザイナーから XACT ファイルを受け取り、それをゲームに統合します。統合には次のような作業が含まれます。
- XACT の初期化
- 処理ループの設定
- Wave バンクおよびサウンド バンクの作成
- キューの再生
Xbox 360: XACT API の使用方法の詳細については、「オーディオ サンプル」を参照してください。
XACT の初期化
XACT オーディオ エンジンを起動するには、最初に IXACT3Engine::Initialize を呼び出します。次の例は、既定の設定を示す空の初期化パラメーターのセットを使用してこの関数を呼び出す方法を示しています。この関数は、アプリケーションの先頭で 1 回だけ呼び出します。
XACT_RUNTIME_PARAMETERS EngineParameters = {0};
if ( FAILED ( hr = pXACT3Engine->Initialize( &EngineParameters ) ) ) return hr;
処理ループの設定
アプリケーションでは、定期的に IXACT3Engine::DoWork を呼び出す必要があります。この関数は、通常、30 ~ 100 ミリ秒ごと (1 ~ 4 フレームごとに 1 回) に呼び出す必要があります。次の例では、アプリケーションのメイン実行ループ内で IXACT3Engine::DoWork を呼び出しています。
BOOL fDone = false;
do {
// update all the game action
Update();
// render graphic elements to the screen
Render();
pXACT3Engine->DoWork();
} while (!fDone);
Wave バンクおよびサウンド バンクの作成
ゲームは Wave バンクおよびサウンド バンクのデータにメモリーを割り当ててから、ファイルをメモリーに読み込みます。その後で、データを制御する Wave バンク オブジェクトとサウンド バンク オブジェクトをインスタンス化します。これらのバンクが不要になったら、オブジェクトを破棄してメモリーを解放します。
これらの関数は通常、シーンの開始時と終了時に呼び出します。
次の例では、メモリー内のウェーブ バンクを作成します。Wave バンクのストリーミングについては、「XACT のストリーミング」を参照してください。
IXACT3WaveBank * pWaveBank;
IXACT3SoundBank * pSoundBank;
if ( FAILED( hr = pXACT3Engine->CreateInMemoryWaveBank( pvWaveBank, dwFileSize, 0, 0, &pWaveBank ) ) )
return hr;
if ( FAILED( hr = pXACT3Engine->CreateSoundBank( pvSoundBank, dwFileSize, 0, 0, &pSoundBank ) ) )
return hr;
キューの再生
サウンド バンク内のキューはインデックスで参照します。ただし、IXACT3SoundBank::GetCueIndex メソッドを使用すれば、フレンドリ名を使用してキューのインデックスを調べることができます。フレンドリ名とは、デザイナーがビルド時にキューに関連付けることができるテキスト文字列です。
XACTINDEX dwSoundCueIndex = 0;
dwSoundCueIndex = pSoundBank->GetCueIndex( "MusicMono" );
IXACT3Cue* pCue;
if( FAILED( hr = pSoundBank->Play( dwSoundCueIndex, 0, 0, &pCue ) ) ) return hr;