XAudio2を使ってみる。その1-初期化-
WindowsVista以降、DirectSound3Dを使ってハードウェア的に3Dオーディオエフェクトをかけることはできません。
クロスプラットフォーム(WindowsとXbox)で共通に使える低レベルオーディオAPIである「Xaudio2」に置き換えられるそうです。
しかしネット上では「XAudio2」に関する(日本語の)記述があまり見られません。というか、サウンドプログラムに興味を持っている人が少ないのかな?
さすがにDirectSoundでは時代遅れだろうということで、今回から「XAudio2」を使ってみたいと思います。ついでに「OpenAL」も触ってみる予定。
開発環境
- windows7 professional 64bit
- DirectX SDK(Nobember 2008)
- Visual C++ Express Edition
- XAudio2 の概要 | Microsoft Docs
OSはwindows7ですが、XAudio2はwindowsVista、XPでも動作します。
SDK付属のサンプル「XAudio2BasicSound」も参考にしてください。
初期化
XAudioに限らず、音の再生には「リスナー」「ソース」「バッファ」の3つのオブジェクトが必要です。
- リスナー
- 音を聞くための「耳」に相当。3Dサウンドで必要。今回は使用しない。
- ソース
- 音を発する「音源」に相当。スピーカー。XAudio2ではVoiceと呼ばれる。
- バッファ
- 音データを格納しておくバッファ。WAVファイル、OGGファイルなどからロード。
XAudioには「XAudio2 エンジン」「ボイス」「オーディオグラフ」「コールバック」という主要な概念がありますが、とりあえず「XAudio2 エンジン」「ボイス」を知っておけばよいかと。詳細はドキュメントXAudio2 の概要 | Microsoft Docsをご覧ください。
まずは、XAudioエンジンを作成、初期化し、MasteringVoiceを作ります。
初期化手順
- 0.xaudio2.hのinclude
- 1.COMの初期化
- 2.XAudio2エンジンのインスタンスを作成
- 3.MasteringVoiceの作成
- DirectSoundのプライマリバッファにあたる。チャンネル数とサンプリングレートを指定。デフォルトの設定で良い。
- 4.XAudio2のCleanup
とりあえずコンソールで動くものを作ってみます。SDK付属サンプル「XAudio2BasicSound」のコピペです。
#include <windows.h> #include <xaudio2.h> #include <iostream> IXAudio2* xaudio; IXAudio2MasteringVoice* mastering_voice; void init() { // // Initialize XAudio2 // HRESULT hr; if( FAILED( hr = CoInitializeEx( NULL, COINIT_MULTITHREADED ) ) ) throw "CoInitializeEx"; UINT32 flags = 0; #ifdef _DEBUG flags |= XAUDIO2_DEBUG_ENGINE; #endif if( FAILED( hr = XAudio2Create( &xaudio, flags ) ) ) throw "XAudio2Create"; // // Create a mastering voice // if( FAILED( hr = xaudio->CreateMasteringVoice( &mastering_voice ) ) ) throw "CreateMasteringVoice"; } void cleanup() { // // Cleanup XAudio2 // if( mastering_voice != 0 ) { mastering_voice->DestroyVoice(); mastering_voice = 0; } if( xaudio != 0 ) { xaudio->Release(); xaudio = 0; } CoUninitialize(); } int main() { try { init(); } catch( const char* e ) { std::cout << e; } cleanup(); return 0; }
以上で初期化は完了です。とくにパラメータを設定する必要はないのです。デフォルトで構いません。