情境: 有一个imageview实现ontouchlistener。当用户触摸屏幕时,我正在启动一个单独的线程,它将产生正弦波,我正在将它写入音频轨道,这里是sin波的生成代码。
t = new Thread() {
public void run() {
setPriority(Thread.MAX_PRIORITY);
// set the buffer size
int buffsize = AudioTrack.getMinBufferSize(sampleRate,
AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);
// create an audiotrack object
AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
samplerate, AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT, buffsize,
AudioTrack.MODE_STREAM);
float amp = (float)10000;
double twopi = 2*Math.PI;
// start audio
audioTrack.play();
short samples[] = new short[buffsize];
// synthesis loop
while(isRunning){
for(int i=0; i < buffsize; i++){
samples[i] = (short) (amp*Math.sin(ph));
ph += (twopi*fr)/sr;
if (ph > twopi)
{
ph -= twopi;
}
if(isRunning==false)
break;
}
if(isRunning==false)
break;
audioTrack.write(samples, 0, buffsize);
}
audioTrack.stop();
audioTrack.release();
}
};
当用户在ACTION_MOVE上移动他的手时,我正在改变频率。频率主要取决于用户从初始点移动的距离。 isRunnig将在ACTION_UP回调中成为现实。
问题: 我错过了一些频率。我的意思是如果用户非常快速地移动他的手,一些频率值会被错过。 这主要是因为audioTrack.write(samples,0,buffsize)这个函数需要一些时间.. 即如果我得到4次ACTION_MOVE回调,我将获得4分,频率变化4次。但是音轨会更新2次。我需要做些什么来消除这种滞后。有没有更好的方法来做到这一点。