2009-12-01 39 views
1

Linux中的這個代碼不工作:我添加了兩行的Java:主增益不支持例外

// Added two lines. 
DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat); 
SourceDataLine dataLine = (SourceDataLine) AudioSystem.getLine(info); 
// Adjust the volume on the output line. 
if(dataLine.isControlSupported(FloatControl.Type.MASTER_GAIN)) { 
    // If inside this if, the Master_Gain must be supported. Yes? 
    FloatControl volume = (FloatControl) dataLine.getControl(FloatControl.Type.MASTER_GAIN); 
    // This line throws an exception. "Master_Gain not supported" 
    volume.setValue(100.0F); 
} 

這是正常的嗎?我需要做些什麼來解決這個問題?
在Windows中它工作。

謝謝Martijn。

+0

這似乎是與「數據線」的你使用的是執行的問題。什麼是數據線的類型? 我預計getControl ()僅在isControlSupported返回false時引發此異常... – Fortega

+0

您的dataLine在windows和linux中可能不是同一類型的dataline,您可以在兩者中調查dataLine的類型(它是SourceDataLine的子類型) Linux和Windows通過調試此代碼 – Fortega

+0

是的,它是相同類型的行。 –

回答

3

在嘗試使用控件之前,可以嘗試使用open()行嗎?類似這樣的:

// Added two lines. 
DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat); 
SourceDataLine dataLine = (SourceDataLine) AudioSystem.getLine(info); 
dataLine.open(); 
// Adjust the volume on the output line. 
if(dataLine.isControlSupported(FloatControl.Type.MASTER_GAIN)) { 
    // If inside this if, the Master_Gain must be supported. Yes? 
    FloatControl volume = (FloatControl) dataLine.getControl(FloatControl.Type.MASTER_GAIN); 
    // This line throws an exception. "Master_Gain not supported" 
    volume.setValue(100.0F); 
} 
1

看起來它取決於JRE版本。

我遇到了類似的問題,當我檢查dataLine.getControls()時,我在Oracle JDK 1.7上獲得了「MASTER_GAIN」控件,在OpenJDK 1.6上獲得了「卷」控件。更糟糕的是,「音量」具有從0 ... 65536的線性值,而MASTER_GAIN似乎具有分貝設置。

這麼多的代碼一次,到處運行:-(