在AudioTrack.write函数中延迟android

时间:2014-03-13 12:59:24

标签: android audio buffer ontouchlistener audiotrack

情境: 有一个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次。我需要做些什么来消除这种滞后。有没有更好的方法来做到这一点。

0 个答案:

没有答案