Поделиться через


Как использовать голосовые обратные вызовы исходного кода

При создании источника голоса в него можно передать структуру, которая определяет обратные вызовы для определенных звуковых событий. Эти обратные вызовы можно использовать для выполнения действий или для передачи сигналов другому коду.

  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. Создайте голос источника с IXAudio2::CreateSourceVoice, используя созданный ранее экземпляр класса обратного вызова в качестве параметра pCallback.

    VoiceCallback voiceCallback;
    if( FAILED(hr = pXaudio2->CreateSourceVoice( &pSourceVoice, (WAVEFORMATEX*)&wfx,
                                 0, XAUDIO2_DEFAULT_FREQ_RATIO, &voiceCallback, NULL, NULL ) ) ) return;
    
  3. После запуска голоса используйте метод WaitForSingleObjectEx, чтобы ждать активации события.

    WaitForSingleObjectEx( voiceCallback.hBufferEndEvent, INFINITE, TRUE );
    

Обратные вызовы

XAudio2 обратные вызовы

Руководство по программированию по XAudio2

Как: Построить Основной Аудиограф Обработки

Как осущствить потоковую передачу звука с диска