我的游戏通过通常的方法回放声音:
sdl.open();
sdl.start();
sdl.write(data, 0, data.length);
sdl.drain();
sdl.stop();
sdl.close();
并且用户可以取消回放(异步):
sdl.stop();
这种取消在Windows下运行良好,但是对于一个使用Java 6运行OSX10.5.8的用户来说,程序挂起。Threaddump显示回放线程在drain():com.sun.media.sound.MixerSourceLine.nDrain
中。如果用户不中断声音,它很好地完成,应用程序继续。
我的问题是:
sdl.close()
而不是stop吗?编辑:我发现了具有类似效果的这错误报告,但是页面上说它是固定的。
发布于 2011-10-18 15:07:31
作为参考,这个使用close()
的示例通常在Java5或6下退出。
在EDT上调用stop()
而不是close()
会同时挂起Java5和6,除非line
已经在初始线程上正常关闭。这似乎是drain()
阻塞的预期结果,因为停止行不能耗尽。
import java.awt.EventQueue;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javax.swing.JOptionPane;
/**
* @see https://stackoverflow.com/questions/7803310
* @see https://stackoverflow.com/questions/2065693
*/
public class Tone {
public static void main(String[] args) throws LineUnavailableException {
final AudioFormat af =
new AudioFormat(Note.SAMPLE_RATE, 8, 1, true, true);
final SourceDataLine line = AudioSystem.getSourceDataLine(af);
EventQueue.invokeLater(new Runnable() {
public void run() {
JOptionPane.showMessageDialog(null, "Halt");
//line.stop(); // stops and hangs on drain
line.close();
}
});
line.open(af, Note.SAMPLE_RATE);
line.start();
for (Note n : Note.values()) {
play(line, n, 500);
play(line, Note.REST, 10);
}
line.drain();
line.close();
}
private static void play(SourceDataLine line, Note note, int ms) {
ms = Math.min(ms, Note.SECONDS * 1000);
int length = Note.SAMPLE_RATE * ms / 1000;
int count = line.write(note.data(), 0, length);
}
}
需要Note
。
https://stackoverflow.com/questions/7803310
复制相似问题