0

I'm developing an android (compileSdkVersion 23) app to record audio by using AudioRecord and the reason of using it is to get frequency after FFT in real time.

Not only this work, I need to save the recorded sound to check the sound(In this process, tracking the frequency is unnecessary.)

How to save recorded sound to file by using the AudioRecord in android?

Thus, am I using the AudioRecord correctly?

Here is code:

public class MainActivity extends Activity {

    int frequency = 8000;
    int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;
    int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;

    AudioRecord audioRecord;
    RecordAudio recordTask;

    int blockSize;// = 256;
    boolean started = false;
    boolean CANCELLED_FLAG = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        blockSize = 256;

        final Button btRec = (Button) findViewById(R.id.btRec);

        btRec.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (started == true) {
                //started = false;
                    CANCELLED_FLAG = true;
                //recordTask.cancel(true);
                    try{
                        audioRecord.stop();
                    }
                    catch(IllegalStateException e){
                        Log.e("Stop failed", e.toString());

                    }
                    btRec.setText("Start");

      //          canvasDisplaySpectrum.drawColor(Color.BLACK);

                }

                else {
                    started = true;
                    CANCELLED_FLAG = false;
                    btRec.setText("Stop");
                    recordTask = new RecordAudio();
                    recordTask.execute();
                }
            }
        });
    }


    private class RecordAudio extends AsyncTask<Void, double[], Boolean> {

        @Override
        protected Boolean doInBackground(Void... params) {

            int bufferSize = AudioRecord.getMinBufferSize(frequency,
                    channelConfiguration, audioEncoding);
            audioRecord = new AudioRecord(
                MediaRecorder.AudioSource.DEFAULT, frequency,
                channelConfiguration, audioEncoding, bufferSize);
            int bufferReadResult;
            short[] buffer = new short[blockSize];
            double[] toTransform = new double[blockSize];
            try {
                audioRecord.startRecording();
            } catch (IllegalStateException e) {
                Log.e("Recording failed", e.toString());

            }
            while (started) {
                if (isCancelled() || (CANCELLED_FLAG == true)) {
                    started = false;
                    //publishProgress(cancelledResult);
                    Log.d("doInBackground", "Cancelling the RecordTask");
                    break;
                } else {
                    bufferReadResult = audioRecord.read(buffer, 0, blockSize);

                    for (int i = 0; i < blockSize && i < bufferReadResult; i++) {
                        toTransform[i] = (double) buffer[i] / 32768.0; // signed 16 bit
                }

                 //transformer.ft(toTransform);

                 //publishProgress(toTransform);

                }

            }
            return true;
        }
    }

}
W. SONG
  • 33
  • 12

1 Answers1

0

You have to download your file and save in cache, than for any request you have to check for cahce file if it is available use otherwise request new file

For complete help look into one of my answer Download and cache media files

Community
  • 1
  • 1
Haris Qurashi
  • 2,104
  • 1
  • 13
  • 28