方法: ソース ボイスのコールバックの使用

ソース音声を作成するときに、特定のオーディオ イベントのコールバックを定義する構造体をそれに渡すことができます。 これらのコールバックを使用して、アクションを実行したり、他のコードに通知したりできます。

  1. IXAudio2VoiceCallback インターフェイスから継承するクラスを作成します。 IXAudio2VoiceCallback のすべてのメンバー関数は純粋に仮想であり、定義する必要があります。 この例で関心のある関数は OnStreamEnd のみです。 そのため、残りの関数はスタブです。 OnStreamEnd 関数は、サウンドの再生が完了したことを示すイベントをトリガーします。

    class VoiceCallback : public IXAudio2VoiceCallback
    {
    public:
        HANDLE hBufferEndEvent;
        VoiceCallback(): hBufferEndEvent( CreateEvent( NULL, FALSE, FALSE, NULL ) ){}
        ~VoiceCallback(){ CloseHandle( hBufferEndEvent ); }
    
        //Called when the voice has just finished playing a contiguous audio stream.
        void OnStreamEnd() { SetEvent( hBufferEndEvent ); }
    
        //Unused methods are stubs
        void OnVoiceProcessingPassEnd() { }
        void OnVoiceProcessingPassStart(UINT32 SamplesRequired) {    }
        void OnBufferEnd(void * pBufferContext)    { }
        void OnBufferStart(void * pBufferContext) {    }
        void OnLoopEnd(void * pBufferContext) {    }
        void OnVoiceError(void * pBufferContext, HRESULT Error) { }
    };
    
  2. pCallback パラメーターとして以前に作成したコールバック クラスのインスタンスを使用して、IXAudio2::CreateSourceVoiceソース音声を作成します。

    VoiceCallback voiceCallback;
    if( FAILED(hr = pXaudio2->CreateSourceVoice( &pSourceVoice, (WAVEFORMATEX*)&wfx,
                                 0, XAUDIO2_DEFAULT_FREQ_RATIO, &voiceCallback, NULL, NULL ) ) ) return;
    
  3. 音声を開始した後、 WaitForSingleObjectEx メソッドを 使用して、イベントがトリガーされるのを待機します。

    WaitForSingleObjectEx( voiceCallback.hBufferEndEvent, INFINITE, TRUE );
    

コールバック

XAudio2 のコールバック

XAudio2 プログラミング ガイド

方法: 基本的なオーディオ処理グラフの作成

方法: ディスクからのサウンドのストリーム