Я пытаюсь воспроизвести звук на Java.Пока все идет хорошо, спасибо, но у меня проблемы с пониманием, как это работает.
Я написал функцию, которая выполняет воспроизведение:
private static void PlaySound(String path) {
try {
final File SoundFile = new File(path);
AudioInputStream Sound = AudioSystem.getAudioInputStream(SoundFile);
DataLine.Info info = new DataLine.Info(Clip.class, Sound.getFormat());
Clip clip = (Clip) AudioSystem.getLine(info);
clip.open(Sound);
clip.addLineListener(new LineListener() {
public void update (LineEvent event) {
if (event.getType() == LineEvent.Type.STOP) {
event.getLine().close();
System.out.printf("Playback ended!");
System.exit(0);
}
}
});
System.out.printf("This sound is %f seconds long.", (clip.getMicrosecondLength() / 1000.0d));
clip.start();
} catch (Exception e) {
ErrorHandler(e);
}
}
Теперь эта функция работает почтихорошо: когда звук заканчивается, он вызывает event.getLine (). close ();функции, но он застрял в "бесконечном цикле" (не уверен, если это так), и ничего после того, как этот оператор выполняется, и программа работает, пока я не убью его вручную.
Если я поменяю строку
if (event.getType() == LineEvent.Type.STOP) {
на
if (event.getType() == LineEvent.Type.CLOSE) {
, то звук воспроизводится, и программа завершается правильно, но все равно ни один из операторов после события.getLine () близко ().
Вопрос в следующем: является ли это предполагаемым поведением event.getLine (). close (), или я делаю что-то не так?
Решение:
LineListener фактически основан на устаревшем факте, что в Java Sound есть ошибка, и нам нужно явно выйти из vm.Без слушателя код работает нормально.