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ファイルは各自で用意してください。