Udostępnij przez


Jak używać wywołań zwrotnych źródłowego głosu

Podczas tworzenia głosu źródłowego można przekazać do niej strukturę, która definiuje wywołania zwrotne dla niektórych zdarzeń dźwiękowych. Tych wywołań zwrotnych można użyć do wykonywania działań lub sygnalizowania innemu kodowi.

  1. Utwórz klasę, która dziedziczy z interfejsu IXAudio2VoiceCallback. Wszystkie funkcje składowe IXAudio2VoiceCallback są wyłącznie wirtualne i muszą być zdefiniowane. Jedyną funkcją, która nas interesuje w tym przykładzie, jest OnStreamEnd. W związku z tym pozostałe funkcje są wycinkami. Funkcja OnStreamEnd wyzwala zdarzenie wskazujące, że dźwięk został odtworzony do końca.

    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. Utwórz źródłowy głos za pomocą IXAudio2::CreateSourceVoice przy użyciu wystąpienia klasy wywołania zwrotnego utworzonego wcześniej jako parametr pCallback.

    VoiceCallback voiceCallback;
    if( FAILED(hr = pXaudio2->CreateSourceVoice( &pSourceVoice, (WAVEFORMATEX*)&wfx,
                                 0, XAUDIO2_DEFAULT_FREQ_RATIO, &voiceCallback, NULL, NULL ) ) ) return;
    
  3. Po uruchomieniu dźwięku użyj metody WaitForSingleObjectEx w celu oczekiwania na aktywację zdarzenia.

    WaitForSingleObjectEx( voiceCallback.hBufferEndEvent, INFINITE, TRUE );
    

wywołania zwrotnego

wywołania zwrotne XAudio2

przewodnik programowania XAudio2

Instrukcje: tworzenie podstawowego grafu przetwarzania dźwięku

Jak streamować dźwięk z dysku