目前我正在尝试使用JSlider
中的Java
来控制我的电脑的主音量。到目前为止,我已经能够找到我的PC主扬声器的端口。但是,我不知道如何成功调用它并运行getValue()或setValue()等方法。
我使用以下代码在我的电脑上搜索所有音频设备:
Mixer.Info [] mixers = AudioSystem.getMixerInfo();
System.out.println("There are " + mixers.length + " mixer info objects");
for (Mixer.Info mixerInfo : mixers)
{
System.out.println("mixer name: " + mixerInfo.getName());
Mixer mixer = AudioSystem.getMixer(mixerInfo);
Line.Info [] lineInfos = mixer.getTargetLineInfo(); // target, not source
for (Line.Info lineInfo : lineInfos)
{
System.out.println(" Line.Info: " + lineInfo);
Line line = null;
boolean opened = true;
try
{
line = mixer.getLine(lineInfo);
opened = line.isOpen() || line instanceof Clip;
if (!opened)
{
line.open();
}
FloatControl volCtrl = (FloatControl)line.getControl(FloatControl.Type.VOLUME);
System.out.println(" volCtrl.getValue() = " + volCtrl.getValue());
}
catch (LineUnavailableException e)
{
e.printStackTrace();
}
catch (IllegalArgumentException iaEx)
{
System.out.println(" " + iaEx);
}
finally
{
if (line != null && !opened)
{
line.close();
}
}
}
}
如何控制扬声器线并更改值?
到目前为止,我已使用this网站寻求帮助。
更新
好的,所以我想我离得更近一点了。在我的测试GUI程序下,我正在尝试使用“获取所需控件的行”(您给我的链接)下的Java教程代码。我将它粘贴到我的JSlider的Change Listener下的程序中。
这就是它的样子:
Port SPEAKER;
FloatControl volCtrl;
try {
Mixer mixer = AudioSystem.getMixer(null);
SPEAKER = (Port)mixer.getLine(Port.Info.SPEAKER);
SPEAKER.open();
volCtrl = (FloatControl) SPEAKER.getControl(
FloatControl.Type.VOLUME);
} catch (Exception e) {
System.out.println("Failed trying to find LINE_IN"
+ " VOLUME control: exception = " + e);
}
每当我移动滑块时,它都会输出错误异常消息“尝试查找失败...”。为什么不让我在主输出扬声器上获得volCtrl?如何修复此代码以控制我的SPEAKER?
答案 0 :(得分:0)
JavaRanch的极好发现!我在那里得到了很多有价值的帮助。
找到行后,本教程将介绍如何制作控件:http://docs.oracle.com/javase/tutorial/sound/controls.html
但有时高低值是意料之外的。我发现一条线的范围从-80到+6(它被设置为模仿VU表的分贝范围)。因此,您可能必须从JSlider输出进行一些数值转换以获得合理的匹配Control值,尤其是当Control是指数时。