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データの取得
- CWaveFile::Open
#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クラスの不要なメンバ、メソッドは削除しています。