2017-08-23 20 views
1

Javaアプリケーションでサウンドを再生しようとしていますが、closeClipインスタンスが再生に使用された後でもPulseAudio Eventloopスレッドが実行されたままなので、音:私のLinuxマシン&短剣でLinux PulseAudioを使用しているときにJavaオーディオクリップを閉じることができません

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

} 

。、上記の主な方法は、関連するサウンドを再生し、印刷する

再生済みのオーディオ。

Windowsでは、‡機械印刷

完成したオーディオを再生しました。

クローズドオーディオデータライン。

正しく終了します。

Linuxマシンで実際に使用されているClipの実装はorg.classpath.icedtea.pulseaudio.PulseAudioClipですが、Windowsではcom.sun.media.sound.DirectAudioDevice.DirectClipです。 ここでは何が起こっていますか? — PulseAudioClip.close()何が返ってこないのですか?


&短剣。配信:Linux Mint 18.1; カーネル:4.4.0-92-一般x86_64; OpenJDK:8u131-b11-2ubuntu1.16.04.3; PulseAudioは:1:8.0-ubuntu3.3

&ddagger。配信:Windows 10 Pro; バージョン: ; OSビルド:15063.540 x64; Oracle JDK:1.8.0_144-b01; のDirectX:バージョン12

答えて

0

1つの可能な方法この問題を回避するには、Javaを使用してオーディオを再生するためのAlsa(ユーザ空間)APIを使用することです。 alsa userspace APIは、PulseAudio(または別のAPI /ミキサー)にリダイレクトされるので、正しいオーディオが得られるはずです。

編集$JAVA_HOME/jre/lib/sound.propertiesorg.classpath.icedtea.pulseaudioに関連するすべてをコメントアウトし、これを追加します。

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バインディングは現在何年もサポートされておらず、削除する必要があります。

関連する問題