0

这个问题是关于 Windows 音频会话 API 的。看了微软的示例代码,发现得到一个IAudioClient后,在其上调用“GetService”方法,得到一个IAudioRenderClient。然后调用IAudioRenderClient的GetBuffer和ReleaseBuffer方法添加要播放的缓冲区。

我的问题:

  1. 为什么需要IAudioRenderClient,为什么不直接把GetBuffer和ReleaseBuffer方法放在IAudioClient中呢?即在什么情况下我们需要多个 IAudioRenderClient 用于单个 IAudioClient?

  2. 因为当我们播放音频时,总是需要一个 IAudioClient,而在这个 IAudioClient 上我们调用 GetService 来获得一个 IAudioRenderClient,我们没有任何机会调用 CoCreateInstance() 来创建 IAudioRenderClient 是吗?那么为什么我们需要一个 IID 用于 IAudioRenderClient 呢?

==================================================== ==============================

经过更多阅读,我认为 IAudioClient 可以是 IAudioRenderClient 或 IAudioCaptureClient。但是另一个问题来了,为什么我们调用GetService来获取IAudioRenderClient而不是QueryInterface呢?

4

1 回答 1

3
  1. 因为IAudioCaptureClient也有GetBufferReleaseBuffer。如果你把GetBufferand ReleaseBufferon IAudioClient,那么你怎么知道你是在处理捕获缓冲区还是渲染缓冲区?这种方法还可以防止IAudioClient对所有可能的服务使用过多的方法。(这被称为“接口隔离原则”,被认为是好的设计)。
  2. 您不使用CoCreateInstance,因为您的系统可能安装了许多声卡。IAudioRenderClient如果你传递 ion 的 IID,它怎么知道你想要哪个IAudioRenderClient
于 2012-12-08T09:34:03.767 回答