Зацикливание 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);

}

0 ответов

Другие вопросы по тегам