2012-12-07 269 views
0

这个问题是关于Windows音频会话API的。在阅读微软的示例代码后,我发现在获得一个IAudioClient后,调用“GetService”方法来获得一个IAudioRenderClient。然后调用IAudioRenderClient的GetBuffer和ReleaseBuffer方法来添加要播放的缓冲区。为什么我们需要IAudioRenderClient接口

我的问题:

  1. 为什么IAudioRenderClient必要的,为什么不把的GetBuffer和ReleaseBuffer方法直接在IAudioClient?也就是说,我们需要多个IAudioRenderClient用于单个IAudioClient?

  2. 因为当我们播放音频,我们总是需要一个IAudioClient,并在此IAudioClient我们所说的GetService获得IAudioRenderClient,我们没有任何机会调用CoCreateInstance()创建IAudioRenderClient我们呢?那么为什么我们需要Iudio for IAudioRenderClient?

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

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

回答

3
  1. 因为IAudioCaptureClient也有GetBufferReleaseBuffer。如果您将GetBufferReleaseBuffer放在IAudioClient上,那么您如何知道您是在处理捕获还是渲染缓冲区?这种方法也可以阻止IAudioClient混淆所有可能的服务的方法太多。 (这被称为“interface segregation principle”,它被认为是很好的设计)。
  2. 您不使用CoCreateInstance,因为您的系统可能安装了多个声卡。它如何知道你想要的IAudioRenderClient如果你通过离子的IAudioRenderClient的IID?