コンピュータに適切なマイクが接続されていないかどうかを検出し、ユーザーに警告するシンプルなキャプチャ/再生スイングアプリがあります。このように、バックグラウンドスレッドで呼び出さ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であっても、次のバージョンで削除/移動/名前変更される可能性があります。 –
確かに、これは少なくとも悪い習慣であることを認識していますが、実際は私の最後の手段でした。 Java Soundの実装上の欠陥であると考えられます。 –
多くのうちの1つです。 JavaSoundは、サポートすることを目的とする限られた範囲のものには適していますが、Sunはこれをさらに発展させることはありません。 –