Anbringen Ich habe eine einfache Capture/Wiedergabe-Swing-Anwendung, die zu erkennen ist, wenn es keine geeigneten Mikrofon an den Computer und den Benutzer zu warnen, angebracht ist. Nach vielen Hantieren habe ich die einzige Lösung gefunden, die mir das neu angebracht oder entfernt Mikrofon zu erkennen erlaubt:Java Sound-Refresh-Linien-Liste nach einem Mikrofon
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;
}
im Hintergrund-Thread wie folgt aufgerufen:
new Thread() {
public void run() {
while(!thisFrame.isClosed()){
if(isMicrophoneAvailable() == true){
//OK
}else{
//WARN
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
Das Problem ist, dass Obwohl das Gerät mit der beschriebenen Methode korrekt erkannt wird, wird die Liste der zugrunde liegenden Zeilen nicht aktualisiert. Das heißt, wenn das Programm gestartet wird, und das Gerät später angebracht, wird die folgende Ausnahme ausgelöst wird, wenn man versucht, den Ton zu notieren:
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.
Gibt es eine Möglichkeit, die Linien Liste von Audiosystem aufgefrischt zu bekommen? Vielleicht etwas ähnliches wie die JDK13Services
Workaround, die am Anfang verwendet wurde, um Caching zu vermeiden?
UPDATE: Code, der eine Ausnahme auslöst:
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;
}
und die Ausnahme selbst:
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.
Interessante Frage, +1. Aber um das zu überprüfen, erkennen Sie die Zerbrechlichkeit der Verwendung einer Klasse in den com.sun-Paketen, richtig? Sogar in den JREs, in denen es existiert, könnte es in der nächsten Version entfernt/verschoben/umbenannt werden. –
In der Tat, ich weiß, dass dies zumindest eine schlechte Praxis ist, aber es war wirklich mein letzter Ausweg. Ich nehme an, dass es sich um einen Java Sound Implementierungsfehler handelt. –
Einer von vielen. JavaSound ist gut für die begrenzte Anzahl von Dingen, die es unterstützen soll, aber Sun hat es nie wirklich weiterentwickelt. –