我的VoIP应用程序托管在Win7上。它包括音量控制。由于Win Vista引入了通过混音器API单独控制每个应用程序的音量的能力,我选择了它。所以,我用:
使用CALLBACK_WINDOW调用mixerOpen,我有一个窗口设置来捕获控制消息,包括MM_MIXM_CONTROL_CHANGE。此事件触发我通过调用mixerGetControlDetail刷新我的音量级别。
这很好用。我可以转到Windows Volume Mixer面板并更改我的应用程序的音量滑块。我收到了MM_MIXM_CONTROL_CHANGE消息,并且mixerGetControlDetail返回的值具有更新的级别。
但是,如果我更改设备级别,则不会收到此类通知。如果我查询应用程序的音量级别,它将保持不变。然而,当我滑动设备音量滑块时,应用程序的音量滑块在音量混合器对话框中发生变化。
我以为我理解了混音器API和IAudioEndpointVolume(回调)的差异,但显然我错过了一些东西。为什么即使Windows Volume Mixer面板显示更改,混音器也会为我的应用返回相同的音量级别?
答案 0 :(得分:0)
好的,我现在就明白了,这很有道理。
应用音频 - >应用音量控制 - >混合器 - >设备音量控制 - >设备
应用程序音量控制确实是与设备分开的控件。 Windows Volume Mixer对话框滑块表示相对于Device滑块级别的Application滑块级别(即level =(Device Level *(App Volume Control / max))/ max)。
因此,当两个滑块都启动@ 100%(控制值= 65536)时,随着设备级别升高/降低,应用级别跟踪它。但是,如果应用程序级别启动设备级别的@ 50%(32767),则当设备级别达到50%(32767)时,应用程序级别将达到25%。应用音量控制的标量保持不变,但滑块级别跟踪设备级别。