为啥我们需要 IAudioRenderClient 接口
Posted
技术标签:
【中文标题】为啥我们需要 IAudioRenderClient 接口【英文标题】:Why do we need IAudioRenderClient Interface为什么我们需要 IAudioRenderClient 接口 【发布时间】:2012-12-07 10:56:15 【问题描述】:这个问题是关于 Windows 音频会话 API 的。看了微软的示例代码,发现得到一个IAudioClient后,在其上调用“GetService”方法,得到一个IAudioRenderClient。然后调用IAudioRenderClient的GetBuffer和ReleaseBuffer方法添加要播放的缓冲区。
我的问题:
为什么需要IAudioRenderClient,为什么不直接把GetBuffer和ReleaseBuffer方法放到IAudioClient中呢?即在什么情况下我们需要多个 IAudioRenderClient 用于单个 IAudioClient?
既然我们在播放音频的时候,总是需要一个IAudioClient,而在这个IAudioClient上我们调用GetService来获取一个IAudioRenderClient,我们就没有机会调用CoCreateInstance()来创建IAudioRenderClient吧?那为什么我们需要 IAudioRenderClient 的 IID?
================================================ ================================
经过更多阅读,我认为 IAudioClient 可以是 IAudioRenderClient 或 IAudioCaptureClient。但是另一个问题来了,为什么我们调用GetService来获取IAudioRenderClient而不是QueryInterface?
【问题讨论】:
【参考方案1】:-
因为
IAudioCaptureClient
也有GetBuffer
和ReleaseBuffer
。如果你把GetBuffer
和ReleaseBuffer
放在IAudioClient
上,那么你怎么知道你是在处理捕获缓冲区还是渲染缓冲区?这种方法还可以防止IAudioClient
为所有可能的服务提供太多方法。 (这被称为“interface segregation principle”,它被认为是好的设计)。
您不使用CoCreateInstance
,因为您的系统可能安装了许多声卡。如果你传递了IAudioRenderClient
的IID,它怎么知道你想要哪个IAudioRenderClient
?
【讨论】:
以上是关于为啥我们需要 IAudioRenderClient 接口的主要内容,如果未能解决你的问题,请参考以下文章