我正在尝试为Android创建一个节拍器,我编写了这段代码,使用SoundPool在300BPM发出哔哔声,但它有时会跳过节拍并造成延迟。我已经研究过了,我发现的所有答案都没有解决我的问题。当我尝试加速bpm计数或使用八分音而不是四分之一(双倍时间)时,尤其会发生这种情况。有人能引导我朝着正确的方向努力,使其尽可能准确吗?延迟/跳过不可接受。谢谢!
final SoundPool sndPool = new SoundPool(3, AudioManager.STREAM_MUSIC, 0);
final int sndHigh = sndPool.load(this, R.raw.high, 1);
setVolumeControlStream(AudioManager.STREAM_MUSIC);
Thread th = new Thread(new Runnable(){
public void run() {
while(true){
sndPool.play(sndHigh, 1f, 1f, 1, 0, 1f);
//Log.d("asd", "beep");
LockSupport.parkNanos(((240000/300)/4)*1000000); //300bpm
}
}
});
th.setPriority(Thread.MAX_PRIORITY);
th.start();
答案 0 :(得分:1)
解决方案根本不使用计时器或SoundPool。而是使用您持续管理的低级AudioTrack。您必须通过在缓冲区中的适当位置将适当的样本插入AudioTrack来合成蜂鸣声或单击或其他任何内容。只需Google AudioTrack并查找有关如何使用它的示例。