Windows音量控制 – 应用程序与设备

我的VoIP应用程序托pipe在Win7上。 它包括音量控制。 由于Win Vista引入了通过混音器API单独控制每个应用程序音量的function,因此我select了这种function。 所以,我使用:

  • mixerOpen
  • mixerSetControlDetail – 更改我的应用程序的音量级别
  • mixerGetControlDetail – 获取我的应用程序的音量级别

mixerOpen调用是使用CALLBACK_WINDOW进行的,我有一个窗口设置来捕获控制消息,包括MM_MIXM_CONTROL_CHANGE。 此事件触发我通过调用mixerGetControlDetail刷新我的音量级别。

这工作正常。 我可以转到Windows音量混音器面板,并更改我的应用程序的音量滑块。 我得到MM_MIXM_CONTROL_CHANGE消息,并且由mixerGetControlDetail返回的值具有更新的级别。

但是,如果我更改设备级别,则不会收到此类通知。 如果我查询我的应用程序的音量级别,它保持不变。 然而,当我滑动设备音量滑块时,应用的音量滑块在“音量混合器”对话框中发生变化。

我以为我明白搅拌机API和IAudioEndpointVolume(callback)的差异,但显然我错过了一些东西。 为什么混音器为我的应用程序返回相同的音量电平,即使Windows音量混音器面板显示它正在改变?

好吧,我现在明白了,这很有道理。

应用程序音频 – >应用程序音量控制 – >混音器 – >设备音量控制 – >设备。

应用程序音量控制实际上是与设备分开的控制。 Windows音量混音器对话框滑块表示相对于设备滑块级别的应用程序滑块级别(即level =(Device Level *(App Volume Control / max))/ max)。

所以,当两个滑块开始于@ 100%(控制值= 65536)时,随着设备级别升高/降低,应用级别跟踪它。 但是,如果应用程序级别开始了设备级别的@ 50%(32767),则当设备级别变为50%(32767)时,应用程序级别将降低到25%。 应用程序音量控制的标量保持不变,但滑块级别跟踪设备级别。