如何在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())) { 

如果你使用任何两个非基本对象的==运营商中,只有两个对象的指针进行比较。无论指向的位置是否包含相同的字节排列,字符串对象在绝大多数情况下都会有不同的指针值,就像任何其他动态分配的对象一样。