gpt4 book ai didi

java - 如何正确地将 FloatControl 与 Java Sound API 结合使用?

转载 作者:行者123 更新时间:2023-12-01 15:21:33 26 4
gpt4 key购买 nike

我目前正在用 Java 编写一个测试程序,我希望能够在 GUI 应用程序上使用 JSlider 控制计算机的主扬声器。我已通读this AudioSystem 类的页面和 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) 如果音频资源正在被其他程序使用,则可能无法使用。我听说 Linux 上发生这种情况的次数比其他系统多。

关于java - 如何正确地将 FloatControl 与 Java Sound API 结合使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10840611/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com