我正在尝试在 Java 应用程序中播放声音,但该应用程序实际上从未终止,因为即使在尝试执行以下操作后,PulseAudio Eventloop 线程仍保持运行状态close https://docs.oracle.com/javase/8/docs/api/javax/sound/sampled/Line.html#close-- the Clip https://docs.oracle.com/javase/8/docs/api/javax/sound/sampled/Clip.html用于播放声音的实例:
import java.io.File;
import java.io.IOException;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineEvent;
import javax.sound.sampled.LineListener;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
final class AudioClipTest {
public static void main(String[] args) throws UnsupportedAudioFileException, IOException, LineUnavailableException {
try (AudioInputStream instream = AudioSystem.getAudioInputStream(new File("resources/test-sound.wav"))){
final AudioFormat format = instream.getFormat();
final Clip clip = (Clip) AudioSystem.getLine(new DataLine.Info(Clip.class, format));
clip.addLineListener(new LineListener() {
@Override
public void update(final LineEvent event) {
if (event.getType() == LineEvent.Type.STOP) {
System.out.println("Finished playing audio.");
event.getLine().close();
// FIXME: This line is never reached on Linux with
// PulseAudio
System.out.println("Closed audio data line.");
}
}
});
clip.open(instream);
clip.start();
}
}
}
On my Linux machine†, the above main method plays the relevant sound, prints
音频播放完毕。
and then hangs, while on a Windows‡ machine it prints
音频播放完毕。
关闭音频数据线。
并正确退出。
实际上Clip
Linux机器上使用的实现是org.classpath.icedtea.pulseaudio.PulseAudioClip
而在 Windows 上则是com.sun.media.sound.DirectAudioDevice.DirectClip
; 这里发生了什么? - 什么是PulseAudioClip.close()
做什么没有回报?
†Distribution: Linux Mint 18.1; Kernel: 4.4.0-92-generic x86_64; OpenJDK: 8u131-b11-2ubuntu1.16.04.3; PulseAudio: 1:8.0-ubuntu3.3
‡Distribution: Windows 10 Pro; Version: 1703; OS Build: 15063.540 x64; Oracle JDK: 1.8.0_144-b01; DirectX: version 12