Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Need a simple example for audio recording

I am in need of simple audio recording and playing example using AudioRecorder in android. I tried with MediaRecorder, it works fine.

like image 998
Manikandan Avatar asked May 27 '11 09:05

Manikandan


2 Answers

You mean AudioRecord? Search e.g. "AudioRecord.OnRecordPositionUpdateListener" using Google Code Search. Btw, AudioRecord does recording, not playing.

See also:

  • Improve Android Audio Recording quality?
  • Android AudioRecord class - process live mic audio quickly, set up callback function
like image 194
Kaarel Avatar answered Nov 05 '22 06:11

Kaarel


here is the sample code for audio record.

    private Runnable recordRunnable = new Runnable() {

    @Override
    public void run() {

        byte[] audiodata = new byte[mBufferSizeInBytes];
        int readsize = 0;

        Log.d(TAG, "start to record");
        // start the audio recording
        try {
            mAudioRecord.startRecording();
        } catch (IllegalStateException ex) {
            ex.printStackTrace();
        }

        // in the loop to read data from audio and save it to file.
        while (mInRecording == true) {
            readsize = mAudioRecord.read(audiodata, 0, mBufferSizeInBytes);
            if (AudioRecord.ERROR_INVALID_OPERATION != readsize
                    && mFos != null) {
                try {
                    mFos.write(audiodata);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        // stop recording
        try {
            mAudioRecord.stop();
        } catch (IllegalStateException ex) {
            ex.printStackTrace();
        }

        getActivity().runOnUiThread(new Runnable() {

            @Override
            public void run() {
                mRecordLogTextView.append("\n Audio finishes recording");
            }
        });

        // close the file
        try {
            if (mFos != null)
                mFos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
};

then you need two buttons (or one acts as different function in the different time) to start and stop the record thread.

        mRecordStartButton = (Button) rootView
            .findViewById(R.id.audio_record_start);

    mRecordStartButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            // initialize the audio source
            int recordChannel = getChoosedSampleChannelForRecord();
            int recordFrequency = getChoosedSampleFrequencyForRecord();
            int recordBits = getChoosedSampleBitsForRecord();

            Log.d(TAG, "recordBits = " + recordBits);

            mRecordChannel = getChoosedSampleChannelForSave();
            mRecordBits = getChoosedSampleBitsForSave();
            mRecordFrequency = recordFrequency;

            // set up the audio source : get the buffer size for audio
            // record.
            int minBufferSizeInBytes = AudioRecord.getMinBufferSize(
                    recordFrequency, recordChannel, recordBits);

            if(AudioRecord.ERROR_BAD_VALUE == minBufferSizeInBytes){

                mRecordLogTextView.setText("Configuration Error");
                return;
            }

            int bufferSizeInBytes = minBufferSizeInBytes * 4;

            // create AudioRecord object
            mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
                    recordFrequency, recordChannel, recordBits,
                    bufferSizeInBytes);

            // calculate the buffer size used in the file operation.
            mBufferSizeInBytes = minBufferSizeInBytes * 2;

            // reset the save file setup
            String rawFilePath = WaveFileWrapper
                    .getRawFilePath(RAW_PCM_FILE_NAME);

            try {
                File file = new File(rawFilePath);
                if (file.exists()) {
                    file.delete();
                }

                mFos = new FileOutputStream(file);

            } catch (Exception e) {
                e.printStackTrace();
            }

            if (mInRecording == false) {

                mRecordThread = new Thread(recordRunnable);
                mRecordThread.setName("Demo.AudioRecord");
                mRecordThread.start();

                mRecordLogTextView.setText(" Audio starts recording");

                mInRecording = true;

                // enable the stop button
                mRecordStopButton.setEnabled(true);

                // disable the start button
                mRecordStartButton.setEnabled(false);
            }

            // show the log info
            String audioInfo = " Audio Information : \n"
                    + " sample rate = " + mRecordFrequency + "\n"
                    + " channel = " + mRecordChannel + "\n"
                    + " sample byte = " + mRecordBits;
            mRecordLogTextView.setText(audioInfo);

        }
    });

    mRecordStopButton = (Button) rootView
            .findViewById(R.id.audio_record_stop);
    mRecordStopButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            if (mInRecording == false) {

                Log.d(TAG, "current NOT in Record");

            } else {

                // stop recording
                if (mRecordThread != null) {

                    Log.d(TAG, "mRecordThread is not null");

                    mInRecording = false;

                    Log.d(TAG, "set mInRecording to false");

                    try {
                        mRecordThread.join(TIMEOUT_FOR_RECORD_THREAD_JOIN);
                        Log.d(TAG, "record thread joins here");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    mRecordThread = null;

                    // re-enable the start button
                    mRecordStartButton.setEnabled(true);

                    // disable the start button
                    mRecordStopButton.setEnabled(false);

                } else {
                    Log.d(TAG, "mRecordThread is null");
                }
            }
        }
    });

then you can save the pcm data into a WAV file.

like image 34
Zephyr Avatar answered Nov 05 '22 05:11

Zephyr