使用JLGui更改系统卷

时间:2013-02-02 20:59:13

标签: java audio volume javasound

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

我有一个创建BasicPlayer对象的类和一个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结合起来。

1 个答案:

答案 0 :(得分:0)

“自己动手”解决方案:

Java Sound Tutorial在“使用控件处理音频”页面末尾有一个名为“直接操作音频数据”的部分。 http://docs.oracle.com/javase/tutorial/sound/controls.html

我放弃了“控制”并且自己做了。如果某人有一个可以使用Java控件进行音量和平移的工作解决方案,我会很高兴听到它。

要自己控制音量,您需要进入从AudioInputLine读取的数据的“缓冲区”,将数据转换为PCM帧,将PCM值乘以1的一小部分(其中1.0是全音量,并且0是静音),转换回字节,然后最后写入SourceDataLine。

另外,(如果你还没有气馁),如果音量变量是一个松散耦合和易变的,它会有所帮助,如果你指定的音量是一个“目标”并且缓冲区循环中的变量逐渐接近,则会有更多帮助基于每帧的目标。这是为了避免可能产生点击的数量跳跃。

并且(如果这还不够)将0到1.0的范围映射到更好地匹配可听度水平的等式(例如,指数或对数)是有帮助的。