Ich verwende den folgenden Code, um eine Sounddatei mit der Java-Sound-API abzuspielen.Wie kann ich auf die Wiedergabe eines Java-Soundclips warten?
Clip clip = AudioSystem.getClip();
AudioInputStream inputStream = AudioSystem.getAudioInputStream(stream);
clip.open(inputStream);
clip.start();
Der Methodenaufruf an das Clip.start() Methode gibt sofort, und das System Playbacks die Tondatei in einem Hintergrund-Thread. Ich möchte, dass meine Methode anhält, bis die Wiedergabe abgeschlossen ist.
Gibt es einen schönen Weg, es zu tun?
EDIT: Für alle, die sich in meine endgültige Lösung, auf die Antwort von Uri basiert, habe ich den folgenden Code:
private final BlockingQueue<URL> queue = new ArrayBlockingQueue<URL>(1);
public void playSoundStream(InputStream stream) {
Clip clip = AudioSystem.getClip();
AudioInputStream inputStream = AudioSystem.getAudioInputStream(stream);
clip.open(inputStream);
clip.start();
LineListener listener = new LineListener() {
public void update(LineEvent event) {
if (event.getType() != Type.STOP) {
return;
}
try {
queue.take();
} catch (InterruptedException e) {
//ignore this
}
}
};
clip.addLineListener(listener);
}
Das funktionierte wie ein Zauber für eine einfache Text-to-Speech-Anwendung, die ich gerade arbeite. – progyammer
Ich bezweifle, dass dies eine Prozessor-Ressource-hungrige Technik ist. – sancho21