Обновление списка строк Java Sound после подключения микрофона

У меня есть простое Swing-приложение захвата/воспроизведения, которое должно определять, не подключен ли к компьютеру подходящий микрофон, и предупреждать пользователя. После долгих возни я нашел единственное решение, которое позволило мне обнаружить только что подключенный или удаленный микрофон:

     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, использовавшийся в самом начале, чтобы избежать кэширования?

ОБНОВЛЕНИЕ: Код, вызывающий исключение:

        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.
6
задан Alex Fedulov 29 March 2012 в 14:26
поделиться