Java 使用JLGui更改系统卷

Java 使用JLGui更改系统卷,java,audio,volume,javasound,Java,Audio,Volume,Javasound,我目前正在学习如何使用jlgui构建一个简单的MP3播放器(使用swt来控制它)。当我相处得很好的时候,有一件事真的让我很困惑,那就是控制电脑发出的声音的音量和音量 我有一个类,它创建了一个BasicLayer对象和一个BasicController。我曾尝试使用BasicController.setGain方法,但如果我在其中输入任何值,它所做的一切都是将音量设置为静音,并且我似乎无法在歌曲播放期间更改此值。如果有人能在这方面给我一些帮助,我将不胜感激,因为这让我发疯:-( 还考虑尝试以下建议

我目前正在学习如何使用jlgui构建一个简单的MP3播放器(使用swt来控制它)。当我相处得很好的时候,有一件事真的让我很困惑,那就是控制电脑发出的声音的音量和音量

我有一个类,它创建了一个BasicLayer对象和一个BasicController。我曾尝试使用BasicController.setGain方法,但如果我在其中输入任何值,它所做的一切都是将音量设置为静音,并且我似乎无法在歌曲播放期间更改此值。如果有人能在这方面给我一些帮助,我将不胜感激,因为这让我发疯:-(

还考虑尝试以下建议

AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File("C:\\Kasabian.mp3"));
Clip clip = AudioSystem.getClip();
clip.open(audioInputStream);
FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
但不确定如何将其与jlgui相结合。

“滚动您自己的”解决方案:

Java声音教程在“使用控件处理音频”一页的末尾有一个非常少的部分,叫做“直接操作音频数据”。

我放弃了“控件”而自己做。如果有人有一个可以使用Java控件进行音量和平移的解决方案,我会很高兴听到这个消息

要自己控制音量,您需要进入从音频输入线读取的数据的“缓冲区”,将数据转换为PCM帧,将PCM值乘以1的分数(其中1.0为全音量,0为静音),转换回字节,然后最后写入源数据线

此外,(如果您还不感到气馁),如果卷变量是松散耦合和易失性的,那么它会有所帮助;如果您指定的卷是“目标”,并且缓冲区循环中的变量以每帧为单位递增地接近目标,那么它会更有帮助。这是为了避免卷中的跳跃,从而可能产生点击

(如果这还不够的话)将从0到1.0的范围映射到一个更好地匹配可听程度的方程(如指数或对数)是很有帮助的。

参见1),答案是“否”,我怀疑这也适用于“JLGui”(我以前从未听说过)。2) 用于将
剪辑
与音量控制一起使用。