EndpointVolume API

EndpointVolume API 让专门的客户端能够控制和监控音频终结点设备的音量水平。 客户端通过获取音频终结点设备的 IMMDevice 接口并调用 IMMDevice::Activate 方法,即可获得 EndpointVolume API 中的接口引用。

头文件 Endpointvolume.h 定义了 EndpointVolume API 中的接口。

使用 MMDevice APIWASAPI 的音频应用程序通常使用 ISimpleAudioVolume 接口来按会话控制音量水平。 只有两类音频应用程序需要使用 EndpointVolume API。 这些应用程序类型包括:

  • 管理音频终结点设备主音量水平的应用程序,类似于 Windows 音量控制程序 Sndvol.exe。
  • 专业音频 ("pro audio") 应用程序需要以独占模式来访问音频终结点设备。

EndpointVolume API 使用不当会干扰 Windows 音频策略,并破坏用户的系统音量设置。

如果音频终结点设备实现了硬件音量和静音控制,则 EndpointVolume API 就会使用这些控制来管理设备音量。 否则,EndpointVolume API 将以对客户端透明的方式在软件中实现控制。

如果设备有硬件音量和静音控件,通过 EndpointVolume API 对设备音量和静音设置所做的更改会影响共享模式和独享模式下的音量水平。 如果设备没有硬件音量和静音控件,则通过 EndpointVolume API 对软件音量和静音控制所做的更改会影响共享模式下的音量,但不会影响独享模式下的音量水平。 在独占模式下,客户端和设备会绕过软件控件来直接交换音频数据。

对于必须管理硬件音量和静音控件的应用程序,EndpointVolume API 与 DeviceTopology API 相比具有两项潜在优势。

首先,许多音频适配器设备缺乏硬件音量控件。 如果设备缺乏硬件音量控件,EndpointVolume API 中的 IAudioEndpointVolume 接口会自动在流向该设备或从该设备流出的流上实现软件音量控件。 对于 EndpointVolume API 的客户端而言,无论音量控制是通过设备的硬件实现,还是通过 EndpointVolume API 接口的软件来实现,结果都是一样的。

其次,即使适配器设备确实实现了硬件音量控件,使用 DeviceTopology API 实现拓扑遍历算法的应用程序也可能找不到它要查找的控件。 通常情况下,此类应用程序旨在遍历特定设备或一组相关设备的硬件拓扑。 如果应用程序尝试遍历其未经专门设计或测试的设备拓扑,就有可能失败。

只有必须访问除音量和静音控件以外的硬件功能的专门应用程序才需要使用 DeviceTopology API。 对于只需要控制独占模式流的音量水平的应用程序,EndpointVolume API 使用起来更简单,而且能与更多音频硬件设备可靠地配合使用。

有关使用 EndpointVolume API 中接口的代码示例,请参阅以下主题:

要查看使用 EndpointVolume API 的示例,请参阅 Windows SDK 中的 EndpointVolume

EndpointVolume API 实现了以下接口。

接口 说明
IAudioEndpointVolume 表示对音频终结点设备之间音频流的音量控制。
IAudioMeterInformation 表示与音频终结点设备之间的音频流峰值。

 

此外,需要通知音频终结点设备音量和静音变化的 EndpointVolume API 客户端应实现以下接口。

接口 说明
IAudioEndpointVolumeCallback 当音频终结点设备的音量水平或静音状态发生变化时提供通知。

 

音量控件

IMMDevice 接口

IMMDevice::Activate

ISimpleAudioVolume

编程参考