Note that there are some explanatory texts on larger screens.

plurals
  1. POHow do I make my animation smoother Android
    primarykey
    data
    text
    <p>I have an app that has a ball running across the screen. When the ball is halfway the application records some audio, computes the FFT and does some extra analysis.</p> <p>This is handled by Asynctask, however the animation still briefly stutters.</p> <p>Does anyone have any suggestions on how to make it run smoother?</p> <p>Thanks</p> <p>code below:</p> <pre><code>import com.ben.applicationLayer.GameView; import dataObjectLayer.Sprite; import dataObjectLayer.MusicalNote; import android.media.AudioRecord; import android.media.MediaRecorder.AudioSource; import android.media.AudioFormat; import android.os.AsyncTask; public class recorderThread extends AsyncTask&lt;Sprite, Void, Integer&gt; { short[] audioData; int bufferSize; Sprite ballComp; @Override protected Integer doInBackground(Sprite... ball) { MusicalNote note = ball[0].expectedNote; ballComp = ball[0]; boolean recorded = false; double frequency; int sampleRate = 8192; AudioRecord recorder = instatiateRecorder(sampleRate); double[] magnitude = new double[1024]; double[] audioDataDoubles = new double[2048]; while (!recorded) { //loop until recording is running if (recorder.getState()==android.media.AudioRecord.STATE_INITIALIZED) // check to see if the recorder has initialized yet. { if (recorder.getRecordingState()==android.media.AudioRecord.RECORDSTATE_STOPPED) recorder.startRecording(); //check to see if the Recorder has stopped or is not recording, and make it record. else { double max_index; recorder.read(audioData,0,bufferSize); //read the PCM audio data into the audioData array computeFFT(audioDataDoubles, magnitude); max_index = getLargestPeakIndex(magnitude); frequency = getFrequencyFromIndex(max_index, sampleRate); //checks if correct frequency, assigns number int correctNo = correctNumber(frequency, note); checkIfMultipleNotes(correctNo, max_index, frequency, sampleRate, magnitude, note); if (audioDataIsNotEmpty()) recorded = true; if (correctNo!=1) return correctNo; } } else { recorded = false; recorder = instatiateRecorder(sampleRate); } } if (recorder.getState()==android.media.AudioRecord.RECORDSTATE_RECORDING) { killRecorder(recorder); } return 1; } private void killRecorder(AudioRecord recorder) { recorder.stop(); //stop the recorder before ending the thread recorder.release(); //release the recorders resources recorder=null; //set the recorder to be garbage collected } @Override protected void onPostExecute(Integer result) { (result == 2) GameView.score++; } private AudioRecord instatiateRecorder(int sampleRate) { bufferSize= AudioRecord.getMinBufferSize(sampleRate,AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT)*2; //get the buffer size to use with this audio record AudioRecord recorder = new AudioRecord (AudioSource.MIC,sampleRate, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT,bufferSize); //instantiate the AudioRecorder audioData = new short [bufferSize]; //short array that pcm data is put into. return recorder; } } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload