实现自定义音频终结点枚举器

从 Windows Server 2008 R2 开始,你可以实现自定义远程音频终结点枚举器作为远程桌面协议提供程序的一部分。 远程桌面协议提供程序可以使用自定义音频终结点枚举器来检索具有一组特定功能的音频终结点的集合。

实现自定义远程音频终结点枚举器

  1. 自定义终结点枚举器解决方案应实现四种main类型的对象:设备枚举器对象、设备集合对象、设备对象和属性存储对象。
对象类型 说明
设备枚举器对象
设备枚举器对象提供终结点枚举器功能。 它公开返回默认终结点和指定终结点集合的方法。 例如,根据指定的条件,枚举器可以返回通信终结点、播放终结点或捕获终结点。 设备枚举器对象必须实现 IMMDeviceEnumerator 接口。
设备集合对象
设备集合对象表示音频设备的集合。 它必须实现 IMMDeviceCollection 接口。
设备对象
设备对象表示特定的音频设备。 它提供对音频设备属性存储的访问,并公开设备上可用的音频播放和捕获接口。 设备对象必须实现 IMMDeviceIMMEndpoint 接口。
属性存储对象
属性存储对象公开与音频设备关联的属性。 其中一些属性由系统使用,但应用程序也可以将任意属性与音频终结点一起存储。
所有音频设备都具有以下三个属性:
属性存储对象必须实现 IPropertyStore 接口。
  1. 自定义终结点枚举器必须在可加载到音频系统和其他应用程序的 DLL 中实现。 必须对 DLL 进行签名,以便安全进程可以加载它。 DLL 必须实现并导出 GetTSAudioEndpointEnumeratorForSession 函数,该函数充当自定义终结点枚举器的入口点。

远程桌面服务服务调用 QueryProperty 方法并将 QueryType 参数设置为 WTS_QUERY_AUDIOENUM_DLL 以检索枚举器对象的名称。

自定义枚举器对象使用类似于 COM 的接口和类似于 COM 的引用计数机制,但它们不是真正的 COM 对象。 自定义终结点枚举器必须能够处理不支持 COM 的应用程序使用的旧音频接口。 因此,自定义终结点枚举器不得依赖于 COM 的生命周期管理机制。 音频终结点枚举器的使用者(例如MMDevAPI.dll)在用户应用程序需要时加载自定义终结点枚举器 DLL,并且当枚举器持有对设备枚举器对象、设备集合对象、设备对象或属性存储对象的引用时,它们将不会卸载枚举器。 但是,这些使用者无法跟踪对自定义终结点枚举器拥有的其他类型的对象的引用。 因此,我们建议自定义终结点枚举器不要创建任何可能超过这四种对象类型的对象。

实现自定义音频终结点

若要实现自定义音频设备枚举器,必须实现自定义音频终结点。 链接自定义音频设备的方式是使用以下两个语句:

  • IMMDevice::Activate(IAudioOutputEndpointRT)
  • IMMDevice::Activate(IAudioInputEndpointRT)

我们不希望你在自定义音频设备枚举器中实现 IMMDevice::Activate 接口的完整列表。 相反,应实现 IAudioOutputEndpointRTIAudioInputEndpointRT。 可以选择实现其他几个,例如 IAudioEndpointVolume。 对于未实现的任何接口,应返回 E_NOINTERFACE (必须使用此特定故障代码) 。 然后,Windows 将回退到接口 (的常用实现,例如 IAudioClient2) 。

有关如何实现和注册音频终结点的其他参考文档,请参阅 IAudioInputEndpointRT。 有关显示 WASAPI 工作原理的关系图,请参阅 用户模式音频组件。 请注意,从 Windows Server 2008 开始,所有用户模式音频都是新的。

创建远程桌面协议提供程序

GetTSAudioEndpointEnumeratorForSession

IMMDevice

IMMDeviceCollection

IMMDeviceEnumerator

IMMEndpoint

IPropertyStore