用于访问Vista和Win 7中的系统/主音量控件的Java Sound API

历史与现状:

我目前正在更新几年前为客户开发的Java应用程序(在WinXP上运行),用于测试和培训具有某些听力障碍的人。 购买此应用程序的用户可获得特定的USB声音设备和耳机。

该软件最重要的要求之一是音频必须以特定的分贝声级播放给用户。 使用Java Sound API,该应用程序被开发用于动态调整Windows Volume到计算的级别(基于在开发期间校准USB声音设备和耳机时所做的测量)。

问题:

现在需要升级该应用程序以支持Windows Vista和Windows 7,但是由于Windows的新应用程序声音架构,我无法找到使用Java Sound API访问Master / System卷的任何方法。

应用程序的Windows音量控制本身并没有削减它,因为它相对于系统音量,并且无法保证用户将听到特定的已知级别的输出音频。

有人知道是否有可能在Java中这样做,如果是,那么如何? 如果不可能,那么你能否就可能最简单的方法提供指导? (JNI和C也许 – 虽然我之前从未使用过JNI ……任何需要注意的问题?)

如果您在Windows XP兼容模式下运行应用程序,它应该可以工作(这取决于Java Sound API如何与硬件卷交互)。

如果您想使用Vista(及以上)声音API,您需要查看IAudioEndpointVolume API。

我的猜测是因为您使用的是USB设备,因此您的Java声音API无法访问正确的频道。

您可以查看如何在Windows XP中调整主卷 。 我知道你不是在XP工作,而是看看如何访问该链接上的特定行和混音器。 您可能需要进行一些实验才能找到正确的线路和混音器组合,或者为用户提供一个GUI,使其能够选择正确的线路和混音器组合。

我在Windows 7中运行了使用此方法的应用程序,所以我怀疑它是O兼容性问题。