Cómo: usar devoluciones de llamadas de voces de origen

Al crear una voz de origen, puede pasarle una estructura que defina devoluciones de llamada para determinados eventos de audio. Puede usar estas devoluciones de llamada para realizar acciones o para indicar otro código.

  1. Cree una clase que herede de la interfaz IXAudio2VoiceCallback . Todas las funciones miembro de IXAudio2VoiceCallback son puramente virtuales y deben definirse. La única función de interés en este ejemplo es OnStreamEnd. Por lo tanto, el resto de las funciones son códigos auxiliares. La función OnStreamEnd desencadena un evento que indica que el sonido ha terminado de reproducirse.

    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. Cree una voz de origen con IXAudio2::CreateSourceVoice mediante una instancia de la clase de devolución de llamada creada anteriormente como el parámetro pCallback.

    VoiceCallback voiceCallback;
    if( FAILED(hr = pXaudio2->CreateSourceVoice( &pSourceVoice, (WAVEFORMATEX*)&wfx,
                                 0, XAUDIO2_DEFAULT_FREQ_RATIO, &voiceCallback, NULL, NULL ) ) ) return;
    
  3. Después de iniciar la voz, use el método WaitForSingleObjectEx para esperar a que se desencadene el evento.

    WaitForSingleObjectEx( voiceCallback.hBufferEndEvent, INFINITE, TRUE );
    

Devoluciones de llamada

Devoluciones de llamadas de XAudio2

Guía de programación de XAudio2

Cómo: crear un gráfico de procesamiento de audio básico

Cómo: transmitir un sonido de un disco