节拍器Android应用程序AudioTrack releaseBuffer()错误

时间:2015-05-15 01:24:11

标签: java android audio soundpool audiotrack

我正在尝试为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,但遇到了延迟。

谢谢!

1 个答案:

答案 0 :(得分:1)

这是指节拍器的准确性。

当你做这类事情时,你通常必须确保你的节拍受到与你的采样率匹配的一致脉冲的控制。也就是说,为了获得真正准确的节奏计时,您需要使用与您的采样率匹配的控制率来控制您的节拍器点击。

此问题的常见解决方案是创建一个以音频采样率运行的方波。然后,用户调整此方波的频率以匹配节拍器的BPM。然后,只要此方波产生1或-1,就可以使用它来触发音频样本。

尽管如此,最佳解决方案是访问计算机声卡上的音频时钟。看一下这个更详细解释它的网页;

http://www.javaperformancetuning.com/articles/soundtimer.shtml