这个问题是关于Windows音频会话API的。阅读微软的示例代码后,我发现在获取IAudioClient后,会在其上调用“GetService”方法来获取IAudioRenderClient。然后调用IAudioRenderClient的GetBuffer和ReleaseBuffer方法添加要播放的buffer。
我的问题:
为什么需要IAudioRenderClient,为什么不直接把GetBuffer和ReleaseBuffer方法放在IAudioClient中呢?即什么时候我们需要为单个 IAudioClient 提供多个 IAudioRenderClient ?
既然我们播放音频的时候,总是需要一个IAudioClient,而在这个IAudioClient上我们调用GetService来获取IAudioRenderClient,那么我们就没有机会调用CoCreateInstance()来创建IAudioRenderClient吧?那为什么 IAudioRenderClient 需要 IID 呢?
====================================================== ===============================
经过更多阅读,我认为 IAudioClient 可以是 IAudioRenderClient 或 IAudioCaptureClient。但又出现了一个问题,为什么我们调用GetService来获取IAudioRenderClient而不是QueryInterface呢?
IAudioCaptureClient
还有GetBuffer
和ReleaseBuffer
。如果您将 GetBuffer
和 ReleaseBuffer
放在 IAudioClient
上,那么您如何知道您正在处理捕获缓冲区还是渲染缓冲区?这种方法还可以防止 IAudioClient
因所有可能的服务有太多方法而变得混乱。 (这被称为“接口隔离原则”,被认为是好的设计)。CoCreateInstance
,因为您的系统可能安装了许多声卡。如果你传递 IAudioRenderClient
的 IID,它怎么知道你想要哪个 IAudioRenderClient
? 从 eRender 端点初始化的音频客户端还会公开用于环回的捕获客户端。所以它必须支持两个不同的流媒体客户端。