Procedura: Usare callback di voci di origine

Quando si crea una voce di origine, è possibile passare una struttura a essa che definisce i callback per determinati eventi audio. È possibile usare questi callback per eseguire azioni o per segnalare altro codice.

  1. Creare una classe che eredita dall'interfaccia IXAudio2VoiceCallback . Tutte le funzioni membro di IXAudio2VoiceCallback sono puramente virtuali e devono essere definite. L'unica funzione di interesse in questo esempio è OnStreamEnd. Di conseguenza, le altre funzioni sono stub. La funzione OnStreamEnd attiva un evento che indica che il suono viene eseguito.

    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. Creare una voce di origine con IXAudio2::CreateSourceVoice usando un'istanza della classe di callback creata in precedenza come parametro pCallback.

    VoiceCallback voiceCallback;
    if( FAILED(hr = pXaudio2->CreateSourceVoice( &pSourceVoice, (WAVEFORMATEX*)&wfx,
                                 0, XAUDIO2_DEFAULT_FREQ_RATIO, &voiceCallback, NULL, NULL ) ) ) return;
    
  3. Dopo aver avviato la voce, usare il metodo WaitForSingleObjectEx per attendere l'attivazione dell'evento.

    WaitForSingleObjectEx( voiceCallback.hBufferEndEvent, INFINITE, TRUE );
    

Callback

Callback di XAudio2

Guida alla programmazione di XAudio2

Procedura: Creare un grafico di elaborazione audio di base

Procedura: Trasmissione di un suono in un flusso da disco