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

如何:使用源语音回调

如何:使用引擎回调

如何:从磁盘流式传输声音