2014-11-05 48 views
1

我已經可以得到操作系統標準輸入設備的字節流。我現在想在程序已經運行時更改輸入設備。如何在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(); 
       } 
      }} 
    } 

事實上,我認爲我只是在最後一部分犯了一個小錯誤,但我不知道是什麼錯誤。如果我切換到另一個音頻輸入設備,我只聽到一聲小小的嘟嘟聲,然後什麼都沒有。如果我切換回主音頻設備,我可以再次聽到輸入。我沒有得到任何錯誤。

我做錯了什麼?

回答

1

在用下面的代碼行

if(mixerInfo[cnt].getName() == combo1.getSelectedItem().toString()) { 

你沒有正確比較字符串。當比較字符串使用String.equals(String)方法,像這樣:

if(mixerInfo[cnt].getName().equals(combo1.getSelectedItem().toString())) { 

如果你使用任何兩個非基本對象的==運營商中,只有兩個對象的指針進行比較。無論指向的位置是否包含相同的字節排列,字符串對象在絕大多數情況下都會有不同的指針值,就像任何其他動態分配的對象一樣。

相關問題