我有一個簡單的捕捉/回放Swing應用程序,它必須檢測是否沒有連接到計算機的適當麥克風並警告用戶。很多擺弄周圍後,我發現,讓我以檢測新連接或刪除話筒唯一的解決辦法:Java聲音刷新連接麥克風後的線路列表
com.sun.media.sound.JDK13Services.setCachingPeriod(0);
private static boolean isMicrophoneAvailable() {
try {
if (!AudioSystem.isLineSupported(Port.Info.MICROPHONE)) {
log.debug("NO MICROPHONE FOUND");
return false;
} else {
log.debug("MICROPHONE FOUND");
return true;
}
} catch (IllegalArgumentException e) {
log.debug("INCONSISTENT");
}
return false;
}
在後臺調用線程這樣的:
new Thread() {
public void run() {
while(!thisFrame.isClosed()){
if(isMicrophoneAvailable() == true){
//OK
}else{
//WARN
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
的問題是,儘管使用所描述的方法正在檢測設備,但不會刷新基礎行的列表。也就是說,當程序被啓動,並且該設備連接後,下面的異常被拋出試圖錄音時:
java.lang.IllegalArgumentException: No line matching interface TargetDataLine supporting format PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, big-endian is supported.
有沒有什麼辦法讓刷新AudioSystem的線路名單?可能類似於在開始時使用的避免緩存的類似JDK13Services
解決方法?
UPDATE:拋出異常代碼:
AudioFormat format = formatControls.getDefaultFormat();
DataLine.Info info = new DataLine.Info(TargetDataLine.class,format);
try {
line = (TargetDataLine) AudioSystem.getLine(info);
line.open(format, line.getBufferSize());
} catch (LineUnavailableException ex) {
shutDown("No audio input device available. Please make sure that a microphone is attached to your computer");
return;
} catch (Exception ex) {
log.error(ex.toString());
shutDown(ex.toString());
return;
}
和例外本身:
java.lang.IllegalArgumentException: No line matching interface TargetDataLine supporting format PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, big-endian is supported.
有趣的問題,+1。只是爲了檢查,你確實意識到在'com.sun'包中使用類的脆弱性,對吧?即使在它存在的JRE中,它也可能在下一個版本中被刪除/移動/重命名。 – 2012-03-26 15:21:47
的確,我確實意識到這至少是一種不好的做法,但它確實是我最後的手段。我認爲它可以被認爲是Java Sound的一個實現缺陷。 – 2012-03-26 15:25:24
其中之一。 JavaSound對於它旨在支持的有限範圍內的事物很有好處,但Sun從未真正開發過它。 – 2012-03-26 15:29:52