Отставание в AudioTrack.write функции Android
Сценарий: есть изображение, которое реализует ontouchlistener. Когда пользователь прикасается к экрану, я запускаю отдельный поток, который будет генерировать синусоидальную волну, и я записываю его в аудиотрек, вот код генерации синусоидальной волны.
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 call back, я меняю частоту. Частота в основном зависит от расстояния, пройденного пользователем от начальной точки. isRunnig станет истинным при обратном вызове ACTION_UP.
Проблема: мне не хватает некоторых частот. Я имею в виду, что если пользователь очень быстро перемещает свою руку, некоторые значения частоты пропускаются. Это происходит главным образом из-за audioTrack.write(samples, 0, buffsize). Эта функция занимает некоторое время, т. Е. Если я получу 4-кратный обратный вызов ACTION_MOVE, 4 балла получу, 4-кратное изменение частоты. Но звуковая дорожка обновляется 2 раза. Что мне нужно сделать, чтобы устранить это отставание. Есть ли лучший подход для этого?