如何:使用源语音回调
创建源语音时,可以向其传递一个结构,该结构定义某些音频事件的回调。 可以使用这些回调来执行操作或向其他代码发出信号。
创建继承自 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) { } };
使用以前作为 pCallback 参数创建的回调类的实例,使用 IXAudio2::CreateSourceVoice 创建源语音。
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 );
相关主题