使用Linux PulseAudio时无法关闭Java音频剪辑 [英] Java audio Clip cannot be closed when using Linux PulseAudio

查看:252
本文介绍了使用Linux PulseAudio时无法关闭Java音频剪辑的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在Java应用程序中播放声音,但应用程序实际上从未实际终止,因为即使在尝试 close Clip 用于播放声音的实例:

I'm trying to play a sound in a Java application but the application never actually terminates because the PulseAudio Eventloop thread is left running even after trying to close the Clip instance used for playing the sound:

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();
        }
    }

}

我的Linux机器,上面的主要方法播放相关声音,打印

On my Linux machine, the above main method plays the relevant sound, prints


完成播放音频。

Finished playing audio.

然后挂起,而在Windows 机器上打印

and then hangs, while on a Windows machine it prints


完成播放音频。

Finished playing audio.

封闭音频数据线。

并正确退出。

Linux上使用的实际 Clip 实现机器是 org.classpath.icedtea.pulseaudio.PulseAudioClip 而在Windows上它是 com.sun.media.sound.DirectAudioDevice.DirectClip ; 这里发生了什么? —什么是 PulseAudioClip.close()做什么没有返回?

The actual Clip implementation used on the Linux machine is org.classpath.icedtea.pulseaudio.PulseAudioClip whereas on Windows it is com.sun.media.sound.DirectAudioDevice.DirectClip; What is going on here? — What is PulseAudioClip.close() doing which isn't returning?

分发: Linux Mint 18.1 ; 内核: 4.4.0-92-generic x86_64 ; OpenJDK: 8u131-b11-2ubuntu1.16.04.3 ; PulseAudio: 1:8.0-ubuntu3.3

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

分发: Windows 10 Pro ; 版本: 1703 ; 操作系统构建: 15063.540 x64 ; Oracle JDK: 1.8.0_144-b01 ; DirectX: 版本12

Distribution: Windows 10 Pro; Version: 1703; OS Build: 15063.540 x64; Oracle JDK: 1.8.0_144-b01; DirectX: version 12

推荐答案

解决此问题的一种可行方法问题是使用Alsa(用户空间)API使用Java播放音频。 alsa用户空间API将重定向到PulseAudio(或其他API /混音器),因此您仍应获得正确的音频。

One possible way to work around this issue is to use the Alsa (userspace) API for playing audio using Java. The alsa userspace API will redirect to PulseAudio (or another API/mixer) so you should still get correct audio.

编辑 $ JAVA_HOME / jre / lib / sound.properties 并注释掉与 org.classpath.icedtea.pulseaudio 相关的所有内容并添加:

Edit $JAVA_HOME/jre/lib/sound.properties and comment out everything related to org.classpath.icedtea.pulseaudio and add this:

javax.sound.sampled.Clip=com.sun.media.sound.DirectAudioDeviceProvider
javax.sound.sampled.Port=com.sun.media.sound.PortMixerProvider
javax.sound.sampled.SourceDataLine=com.sun.media.sound.DirectAudioDeviceProvider
javax.sound.sampled.TargetDataLine=com.sun.media.sound.DirectAudioDeviceProvider

另外,请提交针对您的发行版的openjdk软件包的错误。 PulseAudio / Java绑定多年来一直没有得到支持,应该被删除。

Also, please file a bug against your distribution's openjdk package. The PulseAudio/Java bindings have been unsupported for years now and should be removed.

这篇关于使用Linux PulseAudio时无法关闭Java音频剪辑的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆