为什么需要IAudioRenderClient接口

问题描述 投票:0回答:2

这个问题是关于Windows音频会话API的。阅读微软的示例代码后,我发现在获取IAudioClient后,会在其上调用“GetService”方法来获取IAudioRenderClient。然后调用IAudioRenderClient的GetBuffer和ReleaseBuffer方法添加要播放的buffer。

我的问题:

  1. 为什么需要IAudioRenderClient,为什么不直接把GetBuffer和ReleaseBuffer方法放在IAudioClient中呢?即什么时候我们需要为单个 IAudioClient 提供多个 IAudioRenderClient ?

  2. 既然我们播放音频的时候,总是需要一个IAudioClient,而在这个IAudioClient上我们调用GetService来获取IAudioRenderClient,那么我们就没有机会调用CoCreateInstance()来创建IAudioRenderClient吧?那为什么 IAudioRenderClient 需要 IID 呢?

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

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

windows audio com wasapi
2个回答
3
投票
  1. 因为
    IAudioCaptureClient
    还有
    GetBuffer
    ReleaseBuffer
    。如果您将
    GetBuffer
    ReleaseBuffer
    放在
    IAudioClient
    上,那么您如何知道您正在处理捕获缓冲区还是渲染缓冲区?这种方法还可以防止
    IAudioClient
    因所有可能的服务有太多方法而变得混乱。 (这被称为“接口隔离原则”,被认为是好的设计)。
  2. 您不使用
    CoCreateInstance
    ,因为您的系统可能安装了许多声卡。如果你传递
    IAudioRenderClient
    的 IID,它怎么知道你想要哪个
    IAudioRenderClient

0
投票

从 eRender 端点初始化的音频客户端还会公开用于环回的捕获客户端。所以它必须支持两个不同的流媒体客户端。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.