Как правильно использовать FloatControl с Java Sound API?
В настоящее время я пишу тестовую программу в Java
что я хочу, чтобы иметь возможность контролировать основной динамик моего компьютера с помощью JSlider
в приложении с графическим интерфейсом. Я прочитал эту страницу в классе AudioSystem и эту страницу в элементах управления. Насколько я понимаю, мне нужно получить порт или линию через микшер, а затем установить контроль на этой линии или порту. Так как я контролирую громкость, мне нужно реализовать 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 ответ
Я могу думать о двух вероятных проблемах для расследования:
(1) Если порт вашего целевого динамика отображается на конкретном микшере, вы должны явно открыть этот микшер, если он не является микшером по умолчанию. В настоящее время вы открываете микшер "по умолчанию".
(2) Если аудиоресурс используется другой программой, он может быть недоступен. Я слышал, что это происходит больше с Linux, чем с другими системами.