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

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

ソース ボイスのコールバックを使用するには

次の手順は、サウンドの再生が終了することを通知するコールバックを使用して、サウンドを再生します。

  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. パラメーターとして先に作成したコールバック クラスのインスタンスを使用してソース ボイスを作成します。

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

    WaitForSingleObject( voiceCallback.hBufferEndEvent, INFINITE );
    

関連トピック