XAudio2とは?
Microsoftが提供しているサウンドを扱う低レベルなAPIです。
※低レベルとはハードウェアに近い部分を操作できるという意味です。
主にゲームのサウンド制御の用途で提供されています。
WindowsやXBox系の環境でゲームを開発する際には必須と言っていいAPIとなります。
BGMやSE等の再生やミキシングなどを行うことが出来ます。
XAudioはVoiceと呼ばれるインターフェイスで制御されています。
ボイスには次の3種類のボイスが存在します。
- ソースボイス(SourceVoice)
- サブミックスボイス(IXAurio2SubmixVoice)
- マスターボイス(MasteringVoice)
ソースボイス
ソースボイスとは、各サウンドの波形を受け取って再生する機能を持ったオブジェクトです。
XAudio2でサウンドを鳴らす際の起点となります。
各SEやBGM毎にソースボイスを作成して管理するので最低でも同時に鳴らすサウンド数分のボイスが必要となります。
サブミックスボイス
サブミックスボイスとは、関連付けた複数のソースボイスの出力をまとめてエフェクトをかける機能を持ったオブジェクトです。
例えばSE、BGM、VOICEといった形にグループ化して、それぞれの音量を調整する機能を作ったりできます。
もしエフェクトをかける必要がない場合は省略することが出来ます。
マスターボイス
マスターボイスとは、ソースボイスとサブミックスボイスの出力を全てまとめてサウンドカードへ送る機能を持ったオブジェクトです。
XAudio2で音を鳴らす場合は、最終的に必ずここを通るようになっています。
XAudio2の初期化
XAudio2を使用するためには3つの手順を行う必要があります。
- COMコンポーネントの初期化
- XAudio2の初期化
- MasteringVoiceの作成
この3つの手順を踏んでいく事でXAudio2を扱う為の準備が整います。
では早速それぞれを実装していきましょう。
Comコンポーネントの初期化
COMコンポーネントとはMicrodoftが提唱しているコードの再利用を目的とした技術の事です。
XAudio2を含めて、Microsoftが提供しているCOMを使用した機能を使う際に必要となります。
※詳しくはこちらを参照してください。
初期化と言っていますが、実際にはCOMのスレッド間の同期を自身で行うかどうかの設定をしています。
ただ細かい話は今回の記事と関係ないので割愛します。
CoInitializeEx(0, COINIT_MULTITHREADED);
これでCOMコンポーネントの初期化は完了です。
一行なので一瞬ですね!
XAudio2の初期化
これでやっとXAudio2の初期化が始まります。
XAudio2の初期化もDirectXなどと比べて凄く簡単です。
IXAudio2* pXAudio; XAudio2Create(&pXAudio);
たったこれだけです。
IXAudio2のポインターに対してXAudio2のインスタンスを返してくれます。
MasteringVoiceの作成
次にマスターボイスの作成です。
最初の項目の説明で書いた通り、再生される全てのボイスの最終到達地点となります。
では早速作成する処理を書いていきましょう。
IXAudio2MasteringVoice* pMasteringVoice; pXAudio->CreateMasteringVoice(&pMasteringVoice));
IXAurio2のオブジェクトから生成するだけです、
特に指定するものもないので簡単ですね!
終了処理
XAudio2ももちろん作ったら解放する必要があります。
解放も簡単でそれぞれ下記の関数を呼び出すだけです。
COMコンポーネントの解放
CoUninitialize();
XAudio2の解放
pXAudio->Release();
マスターボイスの解放
pMasteringVoice->DestroyVoice();
大して注意する点もありませんね!
まとめ
XAudio2の初期化をまとめると下記のような形になります。
IXAudio2* pXAudio; IXAudio2MasteringVoice* pMasteringVoice; bool InitXAudio2() { if (FAILED(CoInitializeEx(0, COINIT_MULTITHREADED))) { return false; } if (FAILED(XAudio2Create(&pXAudio))) { return false; } if (FAILED(pXAudio->CreateMasteringVoice(&pMasteringVoice))) { return false; } } void FinalizeXAudio2() { if (pMasteringVoice) { pMasteringVoice->DestroyVoice(); pMasteringVoice= nullptr; } if (pXAudio) { pXAudio->Release(); pXAudio= nullptr; } CoUninitialize(); }
各APIからは失敗した際にエラーコードが返ってきます。
こうやってチェックしておけばエラーの際に途中で中断してくれます。
実際にはエラーコードを出力するなどすればもっと細かい内容が分かったりします。
それでは初期化はこの辺りで終了とします。
次回はSourceVoiceを使ったWaveファイルの再生を記事にしようかと思います。