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

最佳答案

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

关于java - 用于节拍器的android中的高分辨率计时器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14106786/

10-09 13:44