Зацикливание AudioTrack при получении данных от сензора
Мне нужен совет о правильных настройках цикла при воспроизведении AudioTrack. AudioTrack генерирует синусоидальную волну, и ее
public void startAudio(){
audioTrack.reloadStaticData();
audioTrack.setLoopPoints(0, sampleCount, -1);
audioTrack.play();
}
Это ждет onTouchListener
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
setAudio(frequency);
startAudio();
return true;
case MotionEvent.ACTION_UP:
stop();
return true;
}
return false;
проблема в том, что я изменяю частоту на основе данных акселерометра, но как только цикл захватывает его, он все время воспроизводится на частоте, которая была отправлена ему в начале, независимо от изменения частоты после этого. Мне нужно как-то настроить петлю для петли только до тех пор, пока значение частоты не станет одинаковым. Когда частота меняется, мне нужно снова запустить цикл с новой частотой, конечно, без паузы. какой-нибудь целочисленный слушатель? или цикл весь метод startAudio? как? когда я повторяю цикл setAudio void, он добавляет новую частоту к уже существующей воспроизводимой частоте.
Синус генератор здесь
public void setAudio(int frequency) {
sampleCount = (int) ((float) SAMPLE_RATE / frequency);
short ssample[] = new short[sampleCount];
int amplitude = 32767;
double twoPi = 8. * Math.atan(1.);
double phase = 0.0;
for (int i = 0; i < sampleCount; i++) {
ssample[i] = (short) (amplitude * Math.sin(phase));
phase += twoPi * frequency / SAMPLE_RATE;
}
audioTrack.write(ssample, 0, sampleCount);
}