5

目前我正在尝试使用JSliderin Java来控制我的 PC 的主音量。到目前为止,我已经能够找到我的 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();  
                }  
            }  
        }  
    }  

如何控制我的扬声器线路并更改值?

到目前为止, 我已经使用这个网站寻求帮助。


更新

好的,所以我想我已经接近了一点。在我的测试 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?

4

1 回答 1

1

在 JavaRanch 找到很棒的发现!我在那里得到了很多宝贵的帮助。

找到行后,本教程将展示如何制作控件:http ://docs.oracle.com/javase/tutorial/sound/controls.html

但有时高值和低值是出乎意料的。我发现了一条范围从 -80 到 +6 的线(它被设置为模仿 VU 计的分贝范围)。因此,您可能必须对 JSlider 输出进行一些数值转换,以获得合理匹配的 Control 值,尤其是在 Control 是指数的情况下。

于 2012-05-17T19:19:52.847 回答