如何正确使用FloatControl与Java Sound API?

时间:2012-05-31 20:13:06

标签: java swing user-interface javasound jslider

我目前正在Java编写测试程序,希望能够在GUI应用程序上使用JSlider控制计算机的主要发言人。我已阅读有关AudioSystem类的this页面和有关控件的this页面。我的理解是,我需要通过混音器获得端口或线路,然后在该线路或端口上建立控制。由于我控制音量,我需要实现FloatControl。我的程序编译没有问题,但是当我运行它并调整JSlider时,我会在catch子句下发送错误消息。

这是我的测试程序:

import java.awt.BorderLayout;
import java.io.IOException;

import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.FloatControl;
import javax.sound.sampled.Mixer;
import javax.sound.sampled.Port;
import javax.swing.JFrame;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class speakerWork2
{
    public static void main(String [] args)throws IOException
    {
        Frame speaker = new Frame();
    }
}

class Frame extends JFrame
{
    JSlider mainVolume = new JSlider(JSlider.VERTICAL,0,100,50);

    public Frame()
    {
        super();
        setVisible(true);
        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new BorderLayout());
        setSize(100, 450);
        setLocation(300,200);

        add(mainVolume);

        mainVolume.addChangeListener(new mainVolumeHandler());
    }

    public class mainVolumeHandler implements ChangeListener
    {
        int sliderVal = mainVolume.getValue();

        public void setValue(FloatControl sliderVal) 
        {
        }

        public void stateChanged(ChangeEvent f)
        {
            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 SPEAKER"  
                        + " VOLUME control: exception = " + e);  
            }
        }
    }
}

当我运行上述程序时,异常e打印:

java.lang.IllegalArgumentException: Line unsupported: SPEAKER target port

当我在计算机上查询混音器,线路和端口时,我的扬声器得到以下结果......

mixer name: Port Speakers / Headphones (IDT High Definition Audio CODEC)
Line.Info: SPEAKER target port
volCtrl.getValue() = 1.0

我做错了什么,我需要做些什么来纠正自己?

1 个答案:

答案 0 :(得分:1)

我可以想到要研究的两个看似合理的问题:

(1)如果目标扬声器端口出现在特定调音台上,则必须明确打开该调音台(如果它不是默认调音台)。您目前正在打开“默认”调音台。

(2)如果其他程序正在使用音频资源,则可能无法使用。我听说过Linux发生的事情比其他系统更多。