Clip Java.aperto si blocca a tempo indeterminato


Sto cercando di aprire un .file wav e riprodurlo utilizzando una clip. Ma quando chiamo myClip.aprire(...), il thread si blocca e non riprende mai. Non vengono generati errori. Ecco una semplice versione del mio codice:

try {
    AudioInputStream mySound = AudioSystem.getAudioInputStream(new File("sounds/myAudioFile.wav"));
    myClip = AudioSystem.getClip();
    myClip.open(mySound); //This is where it hangs
    myClip.start(); //This is never executed
} catch (Exception e) {e.printStackTrace();}

MODIFICA: Una versione alternativa del mio codice (inoltre non funziona):

Clip myClip = null;

new Thread(new Runnable() {
     public void run() {
          try {
              AudioInputStream mySound = AudioSystem.getAudioInputStream(new File("sounds/myAudioFile.wav"));
              myClip = AudioSystem.getClip();
              System.out.println("Before open");
              myClip.open(mySound); //This is where it hangs
              System.out.println("After open"); //never executed
              //This thread runs indefinitely, whether or not clip.start() is called
          } catch (Exception e) {e.printStackTrace();}
     }
}).start();

try{  Thread.sleep(1000);  }catch(Exception e){} //give it a second to open

myClip.start(); //Executed, but doesn't make a sound
System.out.println("Started clip");

Uscita:

Before open
Started clip

So cosa causa questo, ma non riesco a capire un modo in cui il filo si congeli eternamente. Si blocca perché i driver audio sul mio computer si fermano occasionalmente di lavoro, e prevenire qualsiasi suono da qualsiasi programma di giocare. Ho solo bisogno di un modo per forzare la clip.metodo aperto (o thread) al timeout dopo circa 2 o 3 secondi. Chiamata clip.start () in un altro thread funziona, ma non riproduce alcun suono perché la clip non è stata aperta. E il filo contenente clip.aprire(...) corre per sempre, anche dopo aver chiamato clip.iniziare().

Author: Daniel Williams, 2016-06-21

1 answers

public static synchronized void playSound(final String url) {
  new Thread(new Runnable() {
  // The wrapper thread is unnecessary, unless it blocks on the
  // Clip finishing; see comments.
    public void run() {
      try {
        Clip clip = AudioSystem.getAudioInputStream(new File("sounds/myAudioFile.wav"));       // you can pass it in url
        clip.open(inputStream);
      } catch (Exception e) {
        System.err.println(e.getMessage());
      }
    }
  }).start();
}

Ancora un punto: Non hai iniziato la tua clip. usa clip.Inizia() In questo caso, non dovrai usare thread diversi come clip.start() genera un nuovo thread stesso.

 0
Author: Boola, 2016-06-21 06:24:05