这个问题是关于Windows音频 session API的。阅读Microsoft的示例代码后,我发现在获取IAudioClient之后,将在其上调用“GetService”方法以获得IAudioRenderClient。然后调用IAudioRenderClient的GetBuffer和ReleaseBuffer方法以添加要播放的缓冲区。

我的问题:

  • 为什么需要IAudioRenderClient,为什么不直接将GetBuffer和ReleaseBuffer方法放在IAudioClient中呢?即何时需要为单个IAudioClient使用多个IAudioRenderClient?
  • 由于播放音频时,我们始终需要IAudioClient,并且在此IAudioClient上我们调用GetService来获取IAudioRenderClient,我们没有任何机会调用CoCreateInstance()创建IAudioRenderClient吗?那么,为什么我们需要IAudioRenderClient的IID?

  • ================================================== ===========================

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

    最佳答案

  • 因为IAudioCaptureClient也具有GetBufferReleaseBuffer。如果将GetBufferReleaseBuffer放在IAudioClient上,那么您如何知道是要处理捕获缓冲区还是渲染缓冲区?这种方法还可以防止IAudioClient过多地使用所有可能的服务的方法。 (这被称为“interface segregation principle”,被认为是好的设计)。
  • 您不使用CoCreateInstance,因为您的系统可能安装了许多声卡。如果您传递了IAudioRenderClient的IID,它将如何知道您想要的IAudioRenderClient
  • 08-17 04:28