2012-03-26 25 views
5

taktıktan sonra ben bilgisayara bağlı herhangi bir uygun mikrofon varsa algılamak ve kullanıcıyı uyarmak zorunda basit bir yakalama/oynatma Salıncak uygulaması vardır. Böyle arka plan iş parçacığı denilenJava Ses yenileme Hatları liste bir 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; 
    } 

:

new Thread() { 
     public void run() { 
      while(!thisFrame.isClosed()){ 
       if(isMicrophoneAvailable() == true){ 
        //OK 
       }else{ 
        //WARN 
       } 
       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    }).start(); 

sorun olduğunu uğraşırsanız, bir sürü sonra beni yeni eklenen veya kaldırılan mikrofonu algılamak için izin verilen tek çözüm buldum Cihaz açıklanan metodu kullanarak doğru bir şekilde tespit edilmesine rağmen, temel hatların listesi yenilenmez.

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. 

tazelenmiş AudioSystem satırları listesini almak için herhangi bir yolu var mı: ses kaydı için çalışırken O program başlatıldığında, ve cihaz daha sonra, aşağıdaki istisnası atılır takılır? Belki de önbelleklemeyi önlemek için JDK13Services geçici çözümüne benzer bir şey var mı?

GÜNCELLEME: bir istisna atar Kodu:

 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; 
     } 

ve İstisna kendisi:

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. 
+0

İlginç bir soru, 1. Sadece kontrol etmek için, 'com.sun' paketlerinde bir sınıf kullanmanın kırılganlığını fark ediyorsunuz, değil mi? Var olduğu JRE'lerde bile, sonraki sürümde kaldırılmış/taşınmış/yeniden adlandırılmış olabilir. –

+0

Nitekim, bu en azından kötü bir uygulamadır biliyorsunuzdur, ama gerçekten benim son çare oldu. Bir Java Ses uygulama kusuru olarak düşünülebilir. –

+0

Birçoğu. JavaSound, desteklemeyi amaçladığı sınırlı sayıda ürün için iyidir, ancak Sun hiçbir zaman daha fazla geliştirmedi. –

cevap

0

istisna yardımcı olabilecek atar kod yayınlamak. Mikrofonun ayırırken yine benzer bir istisna alabilirsiniz

TargetDataLine dataLine = (TargetDataLine) AudioSystem.getLine(new DataLine.Info(TargetDataLine.class, audioFormat));      
dataLine.open(); 
dataLine.start();    
dataLine.read(b, offset, len); 

Not:

Ben sadece kayıt daha sonra DATALINE alma bir mikrofon varlığını tespit etmek Port.Info kullanarak varsayarak yaşıyorum mikrofon Eğer varlığı için kontrol zamanı ve zaman arasında fiziksel olarak kopuk olup olmadığını Veri hattı kaydetmek için ancak microhpone bağlanırken bir sorun olmamalı elde etmeye çalışmak. ilham kaynağı olarak Orijinal yayını kullanarak

+0

Neredeyse aynı şeyi yapıyorum gibi görünüyor. Her neyse, kodu ve istisna ile sorunu güncelledim. –

+0

Hattın bu ses formatını desteklediğinden emin olun. Satır tarafından desteklenen tüm ses biçimlerini listelemek için: AudioFormat adfs [] = ((DataLine.Info) dataLine.getLineInfo()). GetFormats(); (AudioFormat adf: adfs) için ( System.out.println (adf.toString()); } – msam

+0

Oldukça senin fikrin alamadım. satır = (TargetDataLine) AudioSystem.getLine (bilgi); istisnanın atıldığı yer, bu yüzden ilk sırada hattı alamıyorum. Belki de yeterince açık değildim: Mikrofon, programın başlamasından önce bilgisayara bağlıysa iyi çalışıyor. Bağlantı kesilmesi doğru şekilde algılanır, "Kayıt" tuşu devre dışı bırakılır. Geri takıldığında tekrar çalışır. Sorun, mikrofonun jvm başlangıcından önce eklenmemesi durumunda ortaya çıkar. Bu durumda, Port.Info.MICROPHONE saptanmış olsa bile, satırları hala işlevsel değildir. –

0

, bir mikrofon kaybı veya kazancı konusunda algılamak için bir araç olarak bu geldi. Bir USB mikrofonu takıldığında veya takılıyken (sistemimde) algılar. Ben arka plan iş parçacığı döngüsünden arıyorum. Orijinal yöntem, dizüstü bilgisayarda yerleşik bir mikrofon olduğu için benim için çalışmadı, bu yüzden ikinci mikrofonun eklenmesini tespit etmem gerekiyordu.

... 
//call this once somewhere to turn the caching period down for faster detection 
    try 
    { 
     //try to set the caching period, defaults to something like 55 seconds 
     com.sun.media.sound.JDK13Services.setCachingPeriod(5); 
    } 
    catch(Exception e) 
    { 
     System.err.println("exception attempting to call com.sun.media.sound.JDK13Services.setCachingPeriod->" + e); 
    } 
... 

private int lastNumMics = -1; 
private synchronized void micCheck() 
{ 
    Line.Info[] lineInfoArray = AudioSystem.getSourceLineInfo(Port.Info.MICROPHONE); 
    int numMics = lineInfoArray == null ? 0 : lineInfoArray.length; 
    if(lastNumMics > -1) 
    { 
     if(numMics < lastNumMics) 
     { 
      //MICROPHONE_LOST 
     } 
     else if(numMics > lastNumMics) 
     { 
      //MICROPHONE_GAINED 
     } 
    } 
    lastNumMics = numMics; 
} 
İlgili konular