android中节拍器的高分辨率计时器

时间:2012-12-31 23:28:10

标签: java android timer high-resolution

我正在尝试为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();

1 个答案:

答案 0 :(得分:1)

解决方案根本不使用计时器或SoundPool。而是使用您持续管理的低级AudioTrack。您必须通过在缓冲区中的适当位置将适当的样本插入AudioTrack来合成蜂鸣声或单击或其他任何内容。只需Google AudioTrack并查找有关如何使用它的示例。