XAudio2を使ってみる。その1-初期化-

WindowsVista以降、DirectSound3Dを使ってハードウェア的に3Dオーディオエフェクトをかけることはできません。

DirectSound - Wikipedia

クロスプラットフォーム(WindowsXbox)で共通に使える低レベルオーディオAPIである「Xaudio2」に置き換えられるそうです。

しかしネット上では「XAudio2」に関する(日本語の)記述があまり見られません。というか、サウンドプログラムに興味を持っている人が少ないのかな?

さすがにDirectSoundでは時代遅れだろうということで、今回から「XAudio2」を使ってみたいと思います。ついでに「OpenAL」も触ってみる予定。

開発環境

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;
}

以上で初期化は完了です。とくにパラメータを設定する必要はないのです。デフォルトで構いません。

サンプル

次回は実際に音の再生を行います。