XAudio2を使ってみる。その5-スレッドによるポーリング-
ようやくthreadクラスが出来たので、以前(XAudio2を使ってみる。その4-ストリーミング再生- - while( c++ );)のストリーミング再生と組み合わせて、まずはポーリングスレッドを作ってみましょう。
auto_reset_event end( false ); //ポーリングスレッド終了イベント //ポーリングスレッド実行関数 struct polling { void operator()() { //endイベントがシグナル状態になるまでループ while( !end.wait( 0 ) ) { //ポーリング処理 ; } } polling( CWaveFile* wav ) : wav( wav ){} CWaveFile* wav; };
スレッドの実行関数内でauto_reset_eventを使ってループを作ります。
終了イベントは、プログラム終了時にメインスレッドからシグナル状態にされます。
int main() { try { // // XAudioの初期化 // init(); // // WAVファイルを開く // CWaveFile wav; if( FAILED( wav.Open( "WAVファイルを指定して下さい" ) ) ) throw xaudio_exception( "Open" ); // // WAVファイルのWAVEFORMATEXを使ってSourceVoiceを作成 // WAVEFORMATEX* format = wav.GetFormat(); if( FAILED( xaudio->CreateSourceVoice( &source_voice, format ) ) ) throw xaudio_exception( "CreateSourceVoice" ); // //1秒のバッファを2つ用意 // for( int i = 0; i < 2; i ++ ) data[ i ].resize( format->nAvgBytesPerSec * 1 ); // // ストリーム再生のためバッファの作成と初期化 // write = 0; //書き込みカーソル loop = true; //ループ再生するか // // あらかじめバッファを追加しておく // add_next_buffer( &wav ); // // ポーリングスレッド開始 // thread_ptr t = new thread( polling( &wav ) ); // // 再生 // source_voice->Start(); while( bool b = true ) { //とりあえず、ESCキーで終了 if( GetAsyncKeyState( VK_ESCAPE ) & 0x8000 )break; Sleep( 10 ); } source_voice->Stop(); source_voice->DestroyVoice(); // // ポーリングスレッドを終了させる // end.signal(); // // ポーリングスレッドの終了を待機 // t->join(); } catch( std::exception& e ) { std::cout << e.what() << std::endl; } cleanup(); return 0; }
次回はIXAudio2VoiceCallbackを使って、イベント通知を行います。
サンプル
- xaudio2_06.zip
- VC++2008EE用
- DirectXSDK(Nobember2008)
- CWaveFileクラスの不要なメンバ、メソッドは削除しています。
- WAVファイルは各自で用意してください。