【发布时间】:2017-03-15 09:20:45
【问题描述】:
问题;执行时只听到一个声音片段。一种声音播放后,另一种声音不播放,也不能同时播放。
结果;能够同时播放 2 个声音。
代码:
import java.io.*;
import javax.sound.sampled.*;
public class ThreadPlay extends Thread {
private String filename; // The name of the file to play
private boolean finished; // A flag showing that the thread has finished
private ThreadPlay(String fname) {
filename = fname;
finished = false;
}
public static void main(String[] args) {
ThreadPlay s1 = new ThreadPlay("soundClip1.wav");
ThreadPlay s2 = new ThreadPlay("soundClip2.wav");
s1.start();
s2.start();
while (!s1.finished || !s2.finished);
System.exit(0); // Java Sound bug fix...
}
public void run() {
try {
File file = new File(filename);
AudioInputStream stream = AudioSystem.getAudioInputStream(file);
AudioFormat format = stream.getFormat();
DataLine.Info info = new DataLine.Info(Clip.class, format);
Clip clip = (Clip)AudioSystem.getLine(info);
clip.open(stream);
clip.start();
Thread.sleep(100);
while (clip.isRunning()) { Thread.sleep(100); }
clip.close();
}
catch (Exception e) { }
finished = true;
}
}
音频线:
AudioSystem.getMixerInfo() results in:
[Ljavax.sound.sampled.Mixer$Info;@52cc8049
Array length: 7
Contents:
PulseAudio Mixer, version 0.02
default [default], version 4.4.0-66-generic
PCH [plughw:0,0], version 4.4.0-66-generic
PCH [plughw:0,1], version 4.4.0-66-generic
PCH [plughw:0,3], version 4.4.0-66-generic
PCH [plughw:0,7], version 4.4.0-66-generic
Port PCH [hw:0], version 4.4.0-66-generic
For each mixer, AudioSystem.getMixer(AudioSystem.getMixerInfo()[x])
Results:
org.classpath.icedtea.pulseaudio.PulseAudioMixer@685f4c2e
com.sun.media.sound.DirectAudioDevice@7a07c5b4
com.sun.media.sound.DirectAudioDevice@5ce65a89
com.sun.media.sound.DirectAudioDevice@1de0aca6
com.sun.media.sound.DirectAudioDevice@443b7951
com.sun.media.sound.DirectAudioDevice@45283ce2
com.sun.media.sound.PortMixer@4d76f3f8
【问题讨论】:
-
您的描述有点混乱。您是否同时听到它们?你要哪个?
-
我以为 Java Sound 已经是多线程的了
-
嗨!我刚刚更新了描述,使其更加清晰。我不确定是不是这样,所以我只是创建了新线程。我一次只听一个,我想同时听两个。
-
根据我有限的测试,
finish应该声明为volatile,但是,CountDownLatch实际上是一个更好的机制来监控两个线程何时完成 -
声明完成为 volatile 但仍然只运行一个。我相信这也可能是
while( !s1.finished || !s2.finished)的问题
标签: java multithreading audio