我已经可以获得操作系统标准输入设备的字节流。我现在想在程序运行时更改输入设备。
这是获取标准输入设备的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();
}
}}
}
事实上,我认为我在最后一部分只犯了一个小错误,但我不知道是什么错误。如果我切换到另一个音频输入设备,我只听到一声小哔声,然后什么都没有。如果我切换回主音频设备,我可以再次听到输入。我没有任何错误。
我做错了什么?
答案 0 :(得分:1)
带有以下代码的行
if( mixerInfo[cnt].getName() == combo1.getSelectedItem().toString()) {
您尚未正确比较字符串。比较字符串时,请使用String.equals(String)
方法,如下所示:
if( mixerInfo[cnt].getName().equals(combo1.getSelectedItem().toString())) {
如果在任何两个非基本对象上使用==
运算符,则只比较两个对象的指针。在绝大多数情况下,String对象将具有不同的指针值,就像任何其他动态分配的对象一样,无论它们指向的位置是否包含相同的字节排列。