[英]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.