[英]high resolution timer in android for metronome
我正在尝试为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,并寻找有关其用法的示例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.