Recorder.java revision c4deebf0a7650448a95986d675fccb7d8a3ceadb
145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Projectpackage com.android.soundrecorder;
245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Projectimport java.io.File;
445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Projectimport java.io.IOException;
545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
6615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Triviimport android.content.Context;
7615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Triviimport android.media.AudioManager;
845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Projectimport android.media.MediaPlayer;
945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Projectimport android.media.MediaRecorder;
1045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Projectimport android.media.MediaPlayer.OnCompletionListener;
1145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Projectimport android.media.MediaPlayer.OnErrorListener;
1245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Projectimport android.os.Bundle;
1345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Projectimport android.os.Environment;
1445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Projectimport android.util.Log;
1545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
1645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Projectpublic class Recorder implements OnCompletionListener, OnErrorListener {
1745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    static final String SAMPLE_PREFIX = "recording";
1845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    static final String SAMPLE_PATH_KEY = "sample_path";
1945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    static final String SAMPLE_LENGTH_KEY = "sample_length";
2045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
2145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    public static final int IDLE_STATE = 0;
2245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    public static final int RECORDING_STATE = 1;
2345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    public static final int PLAYING_STATE = 2;
2445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
2545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    int mState = IDLE_STATE;
2645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
2745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    public static final int NO_ERROR = 0;
2845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    public static final int SDCARD_ACCESS_ERROR = 1;
2945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    public static final int INTERNAL_ERROR = 2;
30615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Trivi    public static final int IN_CALL_RECORD_ERROR = 3;
3145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
3245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    public interface OnStateChangedListener {
3345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        public void onStateChanged(int state);
3445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        public void onError(int error);
3545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    }
3645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    OnStateChangedListener mOnStateChangedListener = null;
3745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
3845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    long mSampleStart = 0;       // time at which latest record or play operation started
3945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    int mSampleLength = 0;      // length of current sample
4045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    File mSampleFile = null;
4145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
4245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    MediaRecorder mRecorder = null;
4345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    MediaPlayer mPlayer = null;
4445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
4545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    public Recorder() {
4645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    }
4745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
4845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    public void saveState(Bundle recorderState) {
4945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        recorderState.putString(SAMPLE_PATH_KEY, mSampleFile.getAbsolutePath());
5045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        recorderState.putInt(SAMPLE_LENGTH_KEY, mSampleLength);
5145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    }
5245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
5345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    public int getMaxAmplitude() {
5445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        if (mState != RECORDING_STATE)
5545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project            return 0;
5645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        return mRecorder.getMaxAmplitude();
5745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    }
5845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
5945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    public void restoreState(Bundle recorderState) {
6045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        String samplePath = recorderState.getString(SAMPLE_PATH_KEY);
6145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        if (samplePath == null)
6245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project            return;
6345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        int sampleLength = recorderState.getInt(SAMPLE_LENGTH_KEY, -1);
6445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        if (sampleLength == -1)
6545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project            return;
6645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
6745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        File file = new File(samplePath);
6845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        if (!file.exists())
6945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project            return;
7045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        if (mSampleFile != null
7145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project                && mSampleFile.getAbsolutePath().compareTo(file.getAbsolutePath()) == 0)
7245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project            return;
7345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
7445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        delete();
7545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        mSampleFile = file;
7645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        mSampleLength = sampleLength;
7745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
7845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        signalStateChanged(IDLE_STATE);
7945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    }
8045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
8145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    public void setOnStateChangedListener(OnStateChangedListener listener) {
8245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        mOnStateChangedListener = listener;
8345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    }
8445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
8545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    public int state() {
8645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        return mState;
8745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    }
8845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
8945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    public int progress() {
9045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        if (mState == RECORDING_STATE || mState == PLAYING_STATE)
9145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project            return (int) ((System.currentTimeMillis() - mSampleStart)/1000);
9245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        return 0;
9345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    }
9445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
9545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    public int sampleLength() {
9645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        return mSampleLength;
9745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    }
9845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
9945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    public File sampleFile() {
10045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        return mSampleFile;
10145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    }
10245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
10345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    /**
10445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project     * Resets the recorder state. If a sample was recorded, the file is deleted.
10545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project     */
10645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    public void delete() {
10745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        stop();
10845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
10945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        if (mSampleFile != null)
11045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project            mSampleFile.delete();
11145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
11245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        mSampleFile = null;
11345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        mSampleLength = 0;
11445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
11545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        signalStateChanged(IDLE_STATE);
11645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    }
11745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
11845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    /**
11945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project     * Resets the recorder state. If a sample was recorded, the file is left on disk and will
12045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project     * be reused for a new recording.
12145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project     */
12245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    public void clear() {
12345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        stop();
12445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
12545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        mSampleLength = 0;
12645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
12745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        signalStateChanged(IDLE_STATE);
12845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    }
12945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
130615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Trivi    public void startRecording(int outputfileformat, String extension, Context context) {
13145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        stop();
13245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
13345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        if (mSampleFile == null) {
13445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project            File sampleDir = Environment.getExternalStorageDirectory();
13545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project            if (!sampleDir.canWrite()) // Workaround for broken sdcard support on the device.
13645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project                sampleDir = new File("/sdcard/sdcard");
13745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
13845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project            try {
13945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project                mSampleFile = File.createTempFile(SAMPLE_PREFIX, extension, sampleDir);
14045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project            } catch (IOException e) {
14145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project                setError(SDCARD_ACCESS_ERROR);
14245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project                return;
14345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project            }
14445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        }
14545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
14645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        mRecorder = new MediaRecorder();
14745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
14845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        mRecorder.setOutputFormat(outputfileformat);
14945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
15045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        mRecorder.setOutputFile(mSampleFile.getAbsolutePath());
15145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
15245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        // Handle IOException
15345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        try {
15445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project            mRecorder.prepare();
15545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        } catch(IOException exception) {
15645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project            setError(INTERNAL_ERROR);
15745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project            mRecorder.reset();
15845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project            mRecorder.release();
15945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project            mRecorder = null;
16045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project            return;
16145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        }
162615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Trivi        // Handle RuntimeException if the recording couldn't start
163615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Trivi        try {
164615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Trivi            mRecorder.start();
165615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Trivi        } catch (RuntimeException exception) {
166615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Trivi            AudioManager audioMngr = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
167c4deebf0a7650448a95986d675fccb7d8a3ceadbJean-Michel Trivi            boolean isInCall = ((audioMngr.getMode() == AudioManager.MODE_IN_CALL) ||
168c4deebf0a7650448a95986d675fccb7d8a3ceadbJean-Michel Trivi                    (audioMngr.getMode() == AudioManager.MODE_IN_COMMUNICATION));
169615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Trivi            if (isInCall) {
170615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Trivi                setError(IN_CALL_RECORD_ERROR);
171615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Trivi            } else {
172615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Trivi                setError(INTERNAL_ERROR);
173615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Trivi            }
174615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Trivi            mRecorder.reset();
175615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Trivi            mRecorder.release();
176615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Trivi            mRecorder = null;
177615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Trivi            return;
178615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Trivi        }
17945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        mSampleStart = System.currentTimeMillis();
18045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        setState(RECORDING_STATE);
18145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    }
18245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
18345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    public void stopRecording() {
18445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        if (mRecorder == null)
18545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project            return;
18645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
18745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        mRecorder.stop();
18845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        mRecorder.release();
18945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        mRecorder = null;
19045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
19145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        mSampleLength = (int)( (System.currentTimeMillis() - mSampleStart)/1000 );
19245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        setState(IDLE_STATE);
19345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    }
19445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
19545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    public void startPlayback() {
19645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        stop();
19745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
19845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        mPlayer = new MediaPlayer();
19945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        try {
20045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project            mPlayer.setDataSource(mSampleFile.getAbsolutePath());
20145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project            mPlayer.setOnCompletionListener(this);
20245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project            mPlayer.setOnErrorListener(this);
20345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project            mPlayer.prepare();
20445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project            mPlayer.start();
20545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        } catch (IllegalArgumentException e) {
20645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project            setError(INTERNAL_ERROR);
20745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project            mPlayer = null;
20845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project            return;
20945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        } catch (IOException e) {
21045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project            setError(SDCARD_ACCESS_ERROR);
21145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project            mPlayer = null;
21245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project            return;
21345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        }
21445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
21545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        mSampleStart = System.currentTimeMillis();
21645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        setState(PLAYING_STATE);
21745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    }
21845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
21945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    public void stopPlayback() {
22045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        if (mPlayer == null) // we were not in playback
22145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project            return;
22245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
22345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        mPlayer.stop();
22445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        mPlayer.release();
22545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        mPlayer = null;
22645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        setState(IDLE_STATE);
22745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    }
22845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
22945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    public void stop() {
23045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        stopRecording();
23145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        stopPlayback();
23245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    }
23345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
23445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    public boolean onError(MediaPlayer mp, int what, int extra) {
23545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        stop();
23645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        setError(SDCARD_ACCESS_ERROR);
23745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        return true;
23845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    }
23945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
24045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    public void onCompletion(MediaPlayer mp) {
24145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        stop();
24245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    }
24345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
24445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    private void setState(int state) {
24545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        if (state == mState)
24645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project            return;
24745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
24845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        mState = state;
24945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        signalStateChanged(mState);
25045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    }
25145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
25245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    private void signalStateChanged(int state) {
25345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        if (mOnStateChangedListener != null)
25445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project            mOnStateChangedListener.onStateChanged(state);
25545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    }
25645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project
25745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    private void setError(int error) {
25845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project        if (mOnStateChangedListener != null)
25945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project            mOnStateChangedListener.onError(error);
26045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project    }
26145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project}
262