java - 并行播放相同的声音两次

标签 java multithreading audio

我有以下代码来在游戏中播放声音:

protected void playSound(final String sound, final int playTime){
        try {
            sounds.get(sound).open();
        } 
        catch(Exception e) {
            System.out.println(e);
        }
        new Thread(new Runnable() {
            public void run() {
                Clip actualClip = sounds.get(sound);
                actualClip.setFramePosition(0);
                if(playTime < 0){
                    actualClip.loop(Clip.LOOP_CONTINUOUSLY);
                }
                else{
                    actualClip.loop(playTime - 1);
                }
            }
        }).start();
    }

声音保存在 HashMap 中:

private HashMap<String, Clip> sounds;

当我“同时”播放两种不同的声音(相差 1 毫秒;))时,它们彼此并行播放;所以我可以同时听到两种声音。看起来像这样:

playSound("sound1", 1);
playSound("sound2", 1);

但是当我尝试播放相同的声音两次时,它不起作用:

playSound("sound1", 1);
//here its waiting in my programm
playSound("sound1", 1);

问题是,我想添加“死亡”声音 - 但两个小怪也可以同时死亡,或者只早一秒死亡。发生这种情况时,要么什么也没有发生,要么声音只播放一次。

为什么?我想我在自己的线程中创建同一文件的新音频剪辑?那么为什么它不起作用呢?

最佳答案

首先,您可以调试该方法来显示“声音”是否已播放,以确保它不会重叠,这样您就听不到是否实际上同时播放了相同的声音?

我认为这里可能发生的情况是,在播放同一剪辑时,其中一个线程将尝试访问另一个线程当前正在访问的相同数据,从而导致您所描述的错误。您可能想研究一下 Java 中的同步。

关于java - 并行播放相同的声音两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18163895/

相关文章:

java - 如何通过Java检测特定进程是否在Windows下运行?

java swing形式挂起

c++ - Windows系统中的最大可用线程数? C++

android - 如何在Android上以编程方式更改声音

python - 在哪里可以了解如何在 python3 中处理音频 IO 和编解码器?

java - JFreeChart:设置图表中的最小 X 刻度间隔

java - 在 Eclipse RCP 编辑器中,处理缺失必填字段的最佳方法是什么?

c# - 等待 QueueUserWorkItem 完成

c++ - 线程崩溃后离开临界区

macos - OpenAL 关闭软启动