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

Posted

技术标签:

【中文标题】Windows 音量控制 - 应用程序与设备【英文标题】:Windows volume control - application vs. device 【发布时间】:2014-07-15 21:17:32 【问题描述】:

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

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

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

这很好用。我可以转到 Windows 音量混合器面板并更改我的应用程序的音量滑块。我收到 MM_MIXM_CONTROL_CHANGE 消息,mixerGetControlDetail 返回的值具有更新的级别。

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

我以为我理解了混音器 API 和 IAudioEndpointVolume(Callback) 的区别,但显然我遗漏了一些东西。为什么混音器会为我的应用返回相同的音量级别,即使 Windows 音量混音器面板显示它正在发生变化?

【问题讨论】:

我想你要找的东西已经在这里了。 ***.com/questions/2232125/… 改写了我的问题。我了解如何获取应用级别与设备级别的更改事件。我不明白的是我是否应该期望设备级别的更改会改变应用程序的级别。我的代码表明答案是“否”,但 Windows 音量混合器对话框提示其他情况。 【参考方案1】:

好的,我现在明白了,这很有意义。

应用音频 -> 应用音量控制 -> 混音器 -> 设备音量控制 -> 设备。

应用程序音量控制确实是一个独立于设备的控制。 Windows 音量混合器对话框滑块表示相对于设备滑块级别的应用程序滑块级别(即 level = (Device Level * (App Volume Control / max)) / max)。

因此,当两个滑块都以 100% 开始(控制值 = 65536)时,随着设备级别的升高/降低,应用级别会跟踪它。但是,如果应用程序级别在设备级别的 50% (32767) 处开始,则当设备级别达到 50% (32767) 时,应用程序级别将达到 25%。 App Volume Control 的标量保持不变,但滑块级别跟踪设备级别。

【讨论】:

以上是关于Windows 音量控制 - 应用程序与设备的主要内容,如果未能解决你的问题,请参考以下文章

在锁定/替代外壳中控制窗口音量

当连接到不同的应用程序/设备时,我可以控制 chromecast 的音量吗?

根据设备音量ios控制滑块[关闭]

应用运行时将 iPhone 的音量控制转移到应用

iOS:访问设备硬件音量控制

控制 Windows 音量