当前位置: 首页 > 面试题库 >

SourceDataLine.drain()挂在OSX上

贺俊杰
2023-03-14
问题内容

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

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显示播放线程在rain()内部com.sun.media.sound.MixerSourceLine.nDrain。如果用户没有中断声音,则声音会很好地完成,并且应用程序将继续。

我的问题是:

  • 这是OSX Java错误吗?
  • 我应该使用sdl.close()而不是停止吗?
  • 有任何解决方法的建议或经验吗?

编辑
:我发现此错误报告具有类似的效果,但页面说它是固定的。


问题答案:

作为参考,该示例close()通常在Java 5或6下使用退出。

除非已在初始线程上正常关闭Java 5和6,否则在EDT上调用stop()而不是close()Java会同时挂起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



 类似资料:
  • 问题内容: 在Mac上,如何将卷装载到Docker容器? 在我的Linux机器上,这很容易。我需要做的只是运行容器时的操作。但是Mac是不同的,因为我必须运行boot2docker才能在VirtualBox中运行VM。我试过跑步 但我明白了 如果我忽略了它,仍然尝试像这样挂载在虚拟机上 我懂了 我感觉好像缺少了一些非常简单的东西,但是我无法弄清楚。任何帮助将不胜感激。 问题答案: 好的,在研究了G

  • 问题内容: 我为此付出了一切,所以希望你们能帮助我。在带有docker-machine的OSX 10.11.2中,我有一个docker- compose文件,该文件应构建一个本地Dockerfile并将MySQL容器附加到该文件。MySQL容器应该在我存储数据库数据的地方安装一个本地文件夹,因此,如果容器或VM关闭,我可以重新启动它而不会丢失数据。问题是,当我运行它时,它将引发权限错误: 我已经尝

  • 问题内容: 我运行了以下命令: 我该如何反转这两个命令以使我的python返回OSX的原始状态?(删除点子作为其中的一部分) 问题答案: 您应该尝试的第一件事是: 在许多无法正常工作的环境中。因此,鉴于缺乏有关该问题的信息,我最终从/ usr / local / bin中手动删除了pip。

  • 我运行了以下命令: 如何反转这两个命令以使python恢复到OSX中的原始状态?(将pip作为其一部分移除)

  • 我是相当新的和。我使用的是Mac OS Sierra预装的Apache和PHP副本。我已经下载并配置了(工作完全正常,能够使用等等)。但是,我一直在努力从连接到数据库。我有这个代码: 我已将其保存为文件,但当我尝试从浏览器打开文件时,不断出现此错误: 警告:mysqli_connect():(HY000/2002):第6行 /Users/Mahfouz/Sites/connect_prac.php

  • [maventest]$/system/library/java/javavirtualmachines/1.6.0.jdk/contents/home/bin/java-xmx512m-xx:maxpermsize=128m-dfile.encoding=utf-8-cp/users/shared/jenkins/home/plugins/maven-plugin/web-inf/lib/mav