繁体   English   中英

如何正确使用线程/运行循环并使用SoundPool播放声音?

[英]How to properly use a thread/run loop and play sounds with SoundPool?

我正在构建一个以选定速度(bpm)播放音乐序列的应用程序。 我目前正在使用一个线程在每个节拍上触发一个函数,然后使用SoundPool播放声音。 但是,一次播放的声音越多,速度越慢!

这是因为将播放声音所需的时间添加到了playingThread睡眠的时间上吗?

soundPool.play应该在后台线程而不是UI线程中吗?

我也遇到同步问题,它会随机加速和放慢速度,并且如果同时播放两个声音,它们并不总是同时播放。 对于Android 2.3.4来说还不错,但是由于某些原因,对于Android 4.2.2来说确实很糟糕。

实现一致的速度和同步的最佳方法是什么?

这是我的主题:

public void playingThread()
{
    //Time interval in ms for thread sleep
    final long intervalInMs = (long) ((1 / (float) theBpm) * 60 * 250);

    Thread thread = new Thread() {
        @Override
        public void run() {
            while(playing == true) {
                beat();
                try {
                    Thread.sleep((long)(intervalInMs));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    };
    thread.start();
}

然后调用此函数,该函数具有许多其他逻辑来计算播放和停止播放的声音等:

public void beat()
{
    currentBeat++;

    //Play click sound every four beats
    if(currentBeat % 4 == 0) {
        soundPool.play(clickSoundId, 0.5f, 0.5f, 1, 0, 1f);
    }

    //ADDITIONAL LOGIC TO DETERMINE WHICH SOUNDS TO PLAY...

    int streamId = soundPool.play(soundIds[i], 1f, 1f, 1, 0, 1f);
}

谢谢

不要使用线程,也不要休眠主应用程序线程。 使用处理程序。 处理程序使您可以安排将来发生的事情而无需休眠主线程。 在这里查看我的答案

音乐总是至关重要的。 SoundPool并非为音乐所要求的精确度而设计。 SoundPool被设计为对输入具有反应性,当触发发生时(有时在例如游戏中)会生成声音。 生成音乐时,您通常会知道什么时候会发出声音,以便更好地安排它们。

我建议使用AudioTrack并直接写入音频缓冲区。 这是完全控制何时播放声音彼此相关的唯一方法。 在延迟方面,您仍然受制于Android OS 硬件实现,但至少每个节拍都是稳定的!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM