Руководство: использование обратных вызовов речевых источников
При создании исходного голоса вы можете передать ему структуру, которая определяет обратные вызовы для определенных звуковых событий. Эти обратные вызовы можно использовать для выполнения действий или передачи сигналов другому коду.
Создайте класс, наследующий от интерфейса 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) { } };
Создайте исходный голос с помощью IXAudio2::CreateSourceVoice , используя экземпляр класса обратного вызова, созданного ранее в качестве параметра pCallback.
VoiceCallback voiceCallback; if( FAILED(hr = pXaudio2->CreateSourceVoice( &pSourceVoice, (WAVEFORMATEX*)&wfx, 0, XAUDIO2_DEFAULT_FREQ_RATIO, &voiceCallback, NULL, NULL ) ) ) return;
После запуска голоса используйте метод WaitForSingleObjectEx , чтобы дождаться активации события.
WaitForSingleObjectEx( voiceCallback.hBufferEndEvent, INFINITE, TRUE );
Связанные темы