Share via


So wird's gemacht: Verwenden der Rückrufe für Quellstimmen

Wenn Sie eine Quellstimme erstellen, können Sie eine Struktur an diese übergeben, die Rückrufe für bestimmte Audioereignisse definiert. Sie können diese Rückrufe verwenden, um Aktionen auszuführen oder anderen Code zu signalisieren.

  1. Erstellen Sie eine Klasse, die von der IXAudio2VoiceCallback-Schnittstelle erbt. Alle Memberfunktionen von IXAudio2VoiceCallback sind rein virtuell und müssen definiert werden. Die einzige interessante Funktion in diesem Beispiel ist OnStreamEnd. Daher sind die restlichen Funktionen Stubs. Die OnStreamEnd-Funktion löst ein Ereignis aus, das angibt, dass die Wiedergabe des Sounds abgeschlossen ist.

    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. Erstellen Sie eine Quellstimme mit IXAudio2::CreateSourceVoice mithilfe einer instance der Rückrufklasse, die zuvor als pCallback-Parameter erstellt wurde.

    VoiceCallback voiceCallback;
    if( FAILED(hr = pXaudio2->CreateSourceVoice( &pSourceVoice, (WAVEFORMATEX*)&wfx,
                                 0, XAUDIO2_DEFAULT_FREQ_RATIO, &voiceCallback, NULL, NULL ) ) ) return;
    
  3. Nachdem Sie die Stimme gestartet haben, verwenden Sie die WaitForSingleObjectEx-Methode , um zu warten, bis das Ereignis ausgelöst wird.

    WaitForSingleObjectEx( voiceCallback.hBufferEndEvent, INFINITE, TRUE );
    

Rückrufe

XAudio2-Rückrufe

XAudio2-Programmieranleitung

So wird's gemacht: Erstellen eines grundlegenden Audioverarbeitungsdiagramms

So wird's gemacht: Streamen von Sound von einem Datenträger