我正在尝试为Android创建一个听起来很棒的节拍器应用程序。现在我有一个我创建的AudioTrack并按下播放进行初始化。然后我将PCM字节写入缓冲区并使用AudioTrack.writeSound()写入缓冲区。 首先我写入缓冲区
for(int i=0;i<this.tick;i++) {
soundTickArray[i] = tick[i];
}
for(int i=0;i<silence;i++)
silenceSoundArray[i] = 0;
}
然后,我按顺序将它转换为PCM后写入audioTrack。
do {
audioGenerator.writeSound(soundTickArray);
audioGenerator.writeSound(silenceSoundArray);
} while(running);
在while循环中,直到它在另一个线程中终止。
问题是我一直收到这个错误。
releaseBuffer()轨道0xb491b280由于先前的欠载而被禁用,重新启动
节拍器不会停止。
有没有人对于为什么会发生这种情况或如何解决它有任何建议。
或者任何其他建议来运行一致的节拍器节拍不会滞后且准确吗?我试图使用SoundPool,但遇到了延迟。
谢谢!
答案 0 :(得分:1)
这是指节拍器的准确性。
当你做这类事情时,你通常必须确保你的节拍受到与你的采样率匹配的一致脉冲的控制。也就是说,为了获得真正准确的节奏计时,您需要使用与您的采样率匹配的控制率来控制您的节拍器点击。
此问题的常见解决方案是创建一个以音频采样率运行的方波。然后,用户调整此方波的频率以匹配节拍器的BPM。然后,只要此方波产生1或-1,就可以使用它来触发音频样本。
尽管如此,最佳解决方案是访问计算机声卡上的音频时钟。看一下这个更详细解释它的网页;
http://www.javaperformancetuning.com/articles/soundtimer.shtml