XAudio2を使ってみる。その3-WAVファイルの再生-

XAudio2で音を再生する場合、音データを格納したバッファと音源となるSourceVoiceが必要になります。

    //
    //  SourceVoiceの作成
    //
    if( FAILED( xaudio->CreateSourceVoice( &source_voice, WAVEフォーマット ) ) )
        throw "CreateSourceVoice";
    //
    //  SourceVoiceにデータを送信
    //
    XAUDIO2_BUFFER submit = { 0 };
    submit.AudioBytes = バッファのバイト数;
    submit.pAudioData = バッファの先頭アドレス;
    submit.Flags = XAUDIO2_END_OF_STREAM;   // tell the source voice not to expect any data after this buffer
    source_voice->SubmitSourceBuffer( &submit );

今回はWAVファイルからバッファを作ってみます。

WAVファイルから再生に必要な情報(WAVEフォーマット、WAVEデータ、WAVEデータのバイト数)を取得するには、mmio系のAPIを使用することになりますが、正直チャンクの操作が面倒なので、SDK付属のCWaveFileクラスを流用しましょう。

  • 主なメソッド
    • CWaveFile::Open
      • WAVファイルを開く
    • CWaveFile::Close
      • WAVファイルを閉じる
    • CWaveFile::GetFormat
      • WAVEフォーマットを取得
    • CWaveFile::GetSize
      • WAVEデータのサイズを取得
    • CWaveFile::Read
      • WAVEデータの取得
#include "SDKwavefile.h"

    IXAudio2SourceVoice* source_voice = 0;
    //
    //  WAVファイルを開く
    //
    CWaveFile wav;
    if( FAILED( wav.Open( "WAVファイル名" ) ) )
        throw "Open";

    //
    //  WAVファイルのWAVEFORMATEXを使ってSourceVoiceを作成
    //
    if( FAILED( xaudio->CreateSourceVoice( &source_voice, wav.GetFormat() ) ) )
        throw "CreateSourceVoice";

    //
    //  WAVファイルのサイズ分のバッファを作成し、データを書き込む
    //
    DWORD size = wav.GetSize();
    std::vector< BYTE > data( size );
    if( FAILED( wav.Read( &data[ 0 ], size, &size ) ) )
        throw "Read";


    //
    //  SourceVoiceにデータを送信
    //
    XAUDIO2_BUFFER submit = { 0 };
    submit.AudioBytes = size;               //バッファのバイト数
    submit.pAudioData = &data[ 0 ];         //バッファの先頭アドレス
    submit.Flags = XAUDIO2_END_OF_STREAM;   // tell the source voice not to expect any data after this buffer
    source_voice->SubmitSourceBuffer( &submit );

次回はXAudio2を使ったストリーミング再生を行います。

サンプル

  • xaudio2_04.zip 直
  • VC++2008EE用
  • DirectXSDK(Nobember2008)
  • CWaveFileクラスの不要なメンバ、メソッドは削除しています。