XAudio2 回调

XAudio2 可以调用客户端提供的函数,以异步方式通知它音频处理线程中发生的某些事件。 这些回调可以是全局回调,也可以特定于给定的源语音。 若要接收全局引擎回调,客户端必须在初始化 XAudio2 时提供实现 IXAudio2EngineCallback 接口的类的实例。 若要接收源语音回调,客户端必须在创建源语音时提供实现 IXAudio2VoiceCallback 接口的类的实例。 有关详细信息,请参阅 IXAudio2EngineCallbackIXAudio2VoiceCallback

必须小心地实现回调,以避免在音频中造成中断。 每当回调运行时,XAudio2 都无法生成任何音频。 超过几毫秒的延迟可能会导致音频问题。 这种性质的延迟也会生成调试器输出。 这表示存在潜在的性能问题。 回调函数不得至少执行以下操作:

  • 访问硬盘或其他永久存储
  • 进行昂贵或阻止 API 调用
  • 与客户端代码的其他部分同步
  • 需要大量 CPU 使用率

如果客户端设计需要回调来触发操作(如前面列出的操作),则回调应向其他客户端线程发出信号以执行该工作。 可以使用简单的 SetEvent 机制或更复杂的机制(如另一个线程使用的非阻塞命令队列)来执行此操作。

IXAudio2EngineCallback

IXAudio2EngineCallback 类包含当 XAudio2 引擎中发生某些事件时通知客户端的方法。 这些方法应由 XAudio2 客户端实现。 XAudio2 通过使用 IXAudio2::RegisterForCallbacks 方法通过客户端提供的接口指针调用这些方法。 所有这些方法都返回 void,而不是 HRESULT

IXAudio2VoiceCallback

IXAudio2VoiceCallback 类包含当特定 XAudio2 源语音中发生某些事件时通知客户端的方法。 XAudio2 通过 客户端在 IXAudio2::CreateSourceVoice 中提供的接口指针调用这些方法。 与 IXAudio2EngineCallback 一样,这些方法应由 XAudio2 客户端实现,并返回 void 而不是 HRESULT

如前所述,客户端提供的这些回调实现必须尽快返回,最好在毫秒内返回。 回调在音频处理线程中执行,所有处理都会中断,直到回调返回。 回调延迟很容易导致音频问题。

回调

XAudio2 编程指南

如何:使用源语音回调

如何:使用引擎回调

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