2

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

1 回答 1

2

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

于 2013-03-28T01:01:04.653 回答