gpt4 book ai didi

java - SourceDataLine.drain() 在 OSX 上挂起

转载 作者:太空宇宙 更新时间:2023-11-04 08:29:32 24 4
gpt4 key购买 nike

我的游戏通过通常的方法播放声音:

sdl.open();
sdl.start();
sdl.write(data, 0, data.length);
sdl.drain();
sdl.stop();
sdl.close();

用户可以取消播放(异步):

sdl.stop();

这种取消在 Windows 下工作得很好,但对于运行带有 Java 6 的 OSX 10.5.8 的用户来说,程序会挂起。 Threaddump显示播放线程位于drain()内部:com.sun.media.sound.MixerSourceLine.nDrain。如果用户不中断声音,则它会很好地完成并且应用程序会继续。

我的问题是:

  • Is this an OSX Java bug?
  • 我应该使用 sdl.close() 而不是 stop 吗?
  • 对于解决方法有什么建议或经验吗?

Edit: I found this错误报告具有类似的效果,但页面说它已修复。

最佳答案

仅供引用,此使用 close() 的示例在 Java 5 或 6 下正常退出。

在 EDT 上调用 stop() 而不是 close() 会挂起 Java 5 和 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 .

关于java - SourceDataLine.drain() 在 OSX 上挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7803310/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com