如何在Java程序执行时更改音频输入设备?
问题描述:
我已经可以得到操作系统标准输入设备的字节流。我现在想在程序已经运行时更改输入设备。如何在Java程序执行时更改音频输入设备?
也就是说代码即可获得标准输入设备的TargetDataLine的/输入流(它的工作原理):
dataLineInfo = new DataLine.Info(TargetDataLine.class , getAudioFormat()) ;
targetDataLine = (TargetDataLine)AudioSystem.getLine(dataLineInfo ) ;
targetDataLine.open(getAudioFormat());
targetDataLine.start();
我还可以得到所有可用的输入设备的列表,并给他们出的组合框选择其它输入设备(它的工作原理):
Mixer.Info[] mixerInfo;
mixerInfo = AudioSystem.getMixerInfo();
Line.Info targetDLInfo = new Line.Info(TargetDataLine.class);
for(int cnt = 0; cnt < mixerInfo.length; cnt++) {
Mixer currentMixer = AudioSystem.getMixer(mixerInfo[cnt]);
if(currentMixer.isLineSupported(targetDLInfo)) {
combo1.addItem(mixerInfo[cnt].getName());
}
}
这就是我如何改变输入设备(它不工作)的代码
if(e.getSource() == combo1){
System.out.println("Gewählter Input: " + combo1.getSelectedItem());
Mixer.Info[] mixerInfo;
mixerInfo = AudioSystem.getMixerInfo();
Line.Info targetDLInfo = new Line.Info(TargetDataLine.class);
for(int cnt = 0; cnt < mixerInfo.length; cnt++) {
Mixer currentMixer = AudioSystem.getMixer(mixerInfo[cnt]);
if(mixerInfo[cnt].getName() == combo1.getSelectedItem().toString()) {
System.out.println("Gewählter Input gefunden");
targetDataLine.close();
dataLineInfo = new DataLine.Info(TargetDataLine.class , getAudioFormat()) ;
try {
targetDataLine = (TargetDataLine) currentMixer.getLine(dataLineInfo) ;
targetDataLine.open(getAudioFormat());
targetDataLine.start();
} catch (LineUnavailableException e1) {
e1.printStackTrace();
}
}}
}
事实上,我认为我只是在最后一部分犯了一个小错误,但我不知道是什么错误。如果我切换到另一个音频输入设备,我只听到一声小小的嘟嘟声,然后什么都没有。如果我切换回主音频设备,我可以再次听到输入。我没有得到任何错误。
我做错了什么?
答
在用下面的代码行
if(mixerInfo[cnt].getName() == combo1.getSelectedItem().toString()) {
你没有正确比较字符串。当比较字符串使用String.equals(String)
方法,像这样:
if(mixerInfo[cnt].getName().equals(combo1.getSelectedItem().toString())) {
如果你使用任何两个非基本对象的==
运营商中,只有两个对象的指针进行比较。无论指向的位置是否包含相同的字节排列,字符串对象在绝大多数情况下都会有不同的指针值,就像任何其他动态分配的对象一样。