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().
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.