为啥我们需要 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也有GetBufferReleaseBuffer。如果你把GetBufferReleaseBuffer 放在IAudioClient 上,那么你怎么知道你是在处理捕获缓冲区还是渲染缓冲区?这种方法还可以防止IAudioClient 为所有可能的服务提供太多方法。 (这被称为“interface segregation principle”,它被认为是好的设计)。 您不使用CoCreateInstance,因为您的系统可能安装了许多声卡。如果你传递了IAudioRenderClient 的IID,它怎么知道你想要哪个IAudioRenderClient

【讨论】:

以上是关于为啥我们需要 IAudioRenderClient 接口的主要内容,如果未能解决你的问题,请参考以下文章

为啥我们需要回调事件?

为啥我们需要`cacheRedirects`?

为啥我们需要单子?

为啥我们需要使用 flatMap?

为啥我们需要 void 函数? [关闭]

为啥我们需要 Hadoop KMS?