【问题标题】:How do I correctly use FloatControl with the Java Sound API?如何正确使用 FloatControl 和 Java Sound API?
【发布时间】:2012-05-31 20:13:05
【问题描述】:

我目前正在Java 中编写一个测试程序,我希望能够在 GUI 应用程序上使用JSlider 来控制我的计算机的主 SPEAKER。我已经阅读了 AudioSystem 类上的 this 页面和 Controls 上的 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) 粘贴代码。 2) 选择代码块。 3) 点击代码按钮。 *** 所选块应在每行缩进 4 个空格以产生“代码”效果。在代码块之前必须有一个完整的空白行。有时它们在列表末尾的格式不正确,但可以通过插入--- 来修复水平线。我没有太多经验先单击放置enter code here 的按钮,可能是因为我的第一次尝试和你的一样不成功,我找到了更可靠的方法来做到这一点。 ;)
  • 好的,非常感谢 =)。下次我发布代码时,我会参考这条评论!

标签: java swing user-interface javasound jslider


【解决方案1】:

我能想到两个看似合理的问题需要调查:

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

(2) 如果音频资源正被另一个程序使用,它可能不可用。我听说 Linux 比其他系统更容易发生这种情况。

【讨论】:

  • 那么你的意思是如果 iTunes 已经在使用 Speaker,那么我的 Java 应用程序就无法控制它了吗?
  • 没有。我只是说这是一种调查的可能性。如果不使用 iTunes,您的代码是否有效?我听说不同的操作系统和应用程序会发生不同的事情。我记得 JGO (java-gaming.org) 上的一个案例,其中一个人遇到问题并且有一个 Linux 系统,结果是由于另一个应用程序没有释放声卡或其他什么。如果您认为它可能有帮助,我会花时间追踪该线程,只需在此处留言。
  • 即使 iTunes 未启动,我的代码仍会收到相同的错误。如何编辑我的代码以允许它打开相应的混音器?
  • 这里有一个解释:docs.oracle.com/javase/tutorial/sound/accessing.html 主要是你在 AudioSystem.getMixer(mixer) 中指定你想要的混音器,而不是像你在代码中那样使用 null。祈祷,我希望这对你有用!
  • 所以我可以通过输入 Port Speakers / Headphones (IDT High Definition Audio CODEC) 而不是 null 来指定我的混音器?
猜你喜欢
  • 2011-08-05
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 2023-04-05
  • 2015-06-13
  • 2011-05-13
  • 1970-01-01
相关资源
最近更新 更多