Отставание в 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 раза. Что мне нужно сделать, чтобы устранить это отставание. Есть ли лучший подход для этого?

0 ответов

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