如何:使用源语音回调

创建源语音时,可以向其传递一个结构,该结构定义某些音频事件的回调。 可以使用这些回调来执行操作或向其他代码发出信号。

  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. 使用以前作为 pCallback 参数创建的回调类的实例,使用 IXAudio2::CreateSourceVoice 创建源语音

    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 编程指南

如何:构建基本的音频处理图

如何:对磁盘中的声音进行流式处理