mediarecorder.cpp revision c048cae0367db6fbb4fe1127be5011910713d4ad
189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/*
289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project **
389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** Copyright (c) 2008 The Android Open Source Project
489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project **
589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** Licensed under the Apache License, Version 2.0 (the "License");
689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** you may not use this file except in compliance with the License.
789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** You may obtain a copy of the License at
889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project **
989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project **     http://www.apache.org/licenses/LICENSE-2.0
1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project **
1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** Unless required by applicable law or agreed to in writing, software
1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** distributed under the License is distributed on an "AS IS" BASIS,
1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** See the License for the specific language governing permissions and
1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** limitations under the License.
1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */
1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//#define LOG_NDEBUG 0
1989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define LOG_TAG "MediaRecorder"
2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/Log.h>
2189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <ui/Surface.h>
2289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/mediarecorder.h>
2389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/IServiceManager.h>
24c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project#include <utils/String8.h>
2589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/IMediaPlayerService.h>
2689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/IMediaRecorder.h>
2789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android {
2989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setCamera(const sp<ICamera>& camera)
3189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("setCamera(%p)", camera.get());
3389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("media recorder is not initialized yet");
3589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_IDLE)) {
3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("setCamera called in an invalid state(%d)", mCurrentState);
3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
4289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setCamera(camera);
4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGV("setCamera failed: %d", ret);
4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
468555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
5089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
5189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setPreviewSurface(const sp<Surface>& surface)
5289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("setPreviewSurface(%p)", surface.get());
5489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
5589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("media recorder is not initialized yet");
5689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
5789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
5889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
5989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("setPreviewSurface called in an invalid state(%d)", mCurrentState);
6089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
6189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
6289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!mIsVideoSourceSet) {
6389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("try to set preview surface without setting the video source first");
6489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
6589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
6689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
6789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setPreviewSurface(surface->getISurface());
6889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
6989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGV("setPreviewSurface failed: %d", ret);
7089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
718555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
7289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
7389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
7589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
7689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::init()
7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("init");
7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("media recorder is not initialized yet");
8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_IDLE)) {
8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("init called in an invalid state(%d)", mCurrentState);
8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
8889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->init();
8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGV("init failed: %d", ret);
9189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
928555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    ret = mMediaRecorder->setListener(this);
9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGV("setListener failed: %d", ret);
9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
998555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mCurrentState = MEDIA_RECORDER_INITIALIZED;
10389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
10489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
10589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setVideoSource(int vs)
10789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
10889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("setVideoSource(%d)", vs);
10989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
11089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("media recorder is not initialized yet");
11189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
11289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mIsVideoSourceSet) {
11489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("video source has already been set");
11589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
11689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
11789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mCurrentState & MEDIA_RECORDER_IDLE) {
11889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGV("Call init() since the media recorder is not initialized yet");
11989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t ret = init();
12089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (OK != ret) {
12189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return ret;
12289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
12389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
12489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_INITIALIZED)) {
12589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("setVideoSource called in an invalid state(%d)", mCurrentState);
12689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
12789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
12889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
12989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setVideoSource(vs);
13089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
13189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGV("setVideoSource failed: %d", ret);
13289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
1338555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
13489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
13589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsVideoSourceSet = true;
13689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
13789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
13889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
13989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setAudioSource(int as)
14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
14189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("setAudioSource(%d)", as);
14289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
14389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("media recorder is not initialized yet");
14489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
14589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
14689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mCurrentState & MEDIA_RECORDER_IDLE) {
14789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGV("Call init() since the media recorder is not initialized yet");
14889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t ret = init();
14989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (OK != ret) {
15089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return ret;
15189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
15289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
15389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mIsAudioSourceSet) {
15489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("audio source has already been set");
15589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
15689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
15789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_INITIALIZED)) {
15889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("setAudioSource called in an invalid state(%d)", mCurrentState);
15989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
16089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
16189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
16289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setAudioSource(as);
16389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
16489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGV("setAudioSource failed: %d", ret);
16589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
1668555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
16789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
16889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsAudioSourceSet = true;
16989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
17089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
17189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
17289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setOutputFormat(int of)
17389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
17489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("setOutputFormat(%d)", of);
17589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
17689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("media recorder is not initialized yet");
17789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
17889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
17989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_INITIALIZED)) {
18089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("setOutputFormat called in an invalid state: %d", mCurrentState);
18189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
18289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
18389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mIsVideoSourceSet && of >= OUTPUT_FORMAT_RAW_AMR) {
18489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("output format (%d) is meant for audio recording only and incompatible with video recording", of);
18589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
18689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
18789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
18889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setOutputFormat(of);
18989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
19089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("setOutputFormat failed: %d", ret);
19189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
1928555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
19389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
19489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mCurrentState = MEDIA_RECORDER_DATASOURCE_CONFIGURED;
19589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
19689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
19889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setVideoEncoder(int ve)
19989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
20089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("setVideoEncoder(%d)", ve);
20189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
20289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("media recorder is not initialized yet");
20389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
20489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
20589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!mIsVideoSourceSet) {
20689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("try to set the video encoder without setting the video source first");
20789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
20889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
20989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mIsVideoEncoderSet) {
21089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("video encoder has already been set");
21189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
21289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
21389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
21489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("setVideoEncoder called in an invalid state(%d)", mCurrentState);
21589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setVideoEncoder(ve);
21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
22089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGV("setVideoEncoder failed: %d", ret);
22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
2228555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsVideoEncoderSet = true;
22589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
22689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setAudioEncoder(int ae)
22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("setAudioEncoder(%d)", ae);
23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("media recorder is not initialized yet");
23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
23489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
23589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!mIsAudioSourceSet) {
23689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("try to set the audio encoder without setting the audio source first");
23789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
23889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
23989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mIsAudioEncoderSet) {
24089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("audio encoder has already been set");
24189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
24289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
24389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("setAudioEncoder called in an invalid state(%d)", mCurrentState);
24589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
24689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
24789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
24889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setAudioEncoder(ae);
24989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
25089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGV("setAudioEncoder failed: %d", ret);
25189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
2528555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
25389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
25489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsAudioEncoderSet = true;
25589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
25689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
25789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
25889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setOutputFile(const char* path)
25989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
26089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("setOutputFile(%s)", path);
26189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
26289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("media recorder is not initialized yet");
26389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
26489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
26589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mIsOutputFileSet) {
26689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("output file has already been set");
26789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
26889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
26989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
27089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("setOutputFile called in an invalid state(%d)", mCurrentState);
27189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
27289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
27389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
27489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setOutputFile(path);
27589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGV("setOutputFile failed: %d", ret);
27789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
2788555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
27989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsOutputFileSet = true;
28189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
28389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setOutputFile(int fd, int64_t offset, int64_t length)
28589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
28689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("setOutputFile(%d, %lld, %lld)", fd, offset, length);
28789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
28889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("media recorder is not initialized yet");
28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
29089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
29189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mIsOutputFileSet) {
29289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("output file has already been set");
29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
29589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("setOutputFile called in an invalid state(%d)", mCurrentState);
29789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
29989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
30089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setOutputFile(fd, offset, length);
30189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGV("setOutputFile failed: %d", ret);
30389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
3048555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
30589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
30689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsOutputFileSet = true;
30789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
30889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
30989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
31089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setVideoSize(int width, int height)
31189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
31289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("setVideoSize(%d, %d)", width, height);
31389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
31489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("media recorder is not initialized yet");
31589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
31689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
31789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
31889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("setVideoSize called in an invalid state: %d", mCurrentState);
31989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
32089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
32189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!mIsVideoSourceSet) {
32289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("try to set video size without setting video source first");
32389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
32489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
32589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
32689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setVideoSize(width, height);
32789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
32889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("setVideoSize failed: %d", ret);
32989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
3308555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
33189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
33289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
33389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
33489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
33589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setVideoFrameRate(int frames_per_second)
33689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
33789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("setVideoFrameRate(%d)", frames_per_second);
33889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
33989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("media recorder is not initialized yet");
34089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
34189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
34289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
34389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("setVideoFrameRate called in an invalid state: %d", mCurrentState);
34489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
34589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
34689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!mIsVideoSourceSet) {
34789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("try to set video frame rate without setting video source first");
34889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
34989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
35089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
35189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setVideoFrameRate(frames_per_second);
35289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
35389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("setVideoFrameRate failed: %d", ret);
35489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
3558555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
35689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
35789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
35889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
35989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
360c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Projectstatus_t MediaRecorder::setParameters(const String8& params) {
361c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    LOGV("setParameters(%s)", params.string());
362c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    if(mMediaRecorder == NULL) {
363c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project        LOGE("media recorder is not initialized yet");
364c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project        return INVALID_OPERATION;
365c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    }
366c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project
367c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    status_t ret = mMediaRecorder->setParameters(params);
368c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    if (OK != ret) {
369c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project        LOGE("setParameters(%s) failed: %d", params.string(), ret);
370c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
371c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project        return ret;
372c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    }
373c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project
374c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    return ret;
375c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project}
376c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project
37789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::prepare()
37889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
37989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("prepare");
38089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
38189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("media recorder is not initialized yet");
38289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
38389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
38489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
38589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("prepare called in an invalid state: %d", mCurrentState);
38689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
38789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
38889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mIsAudioSourceSet != mIsAudioEncoderSet) {
38989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (mIsAudioSourceSet) {
39089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            LOGE("audio source is set, but audio encoder is not set");
39189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } else {  // must not happen, since setAudioEncoder checks this already
39289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            LOGE("audio encoder is set, but audio source is not set");
39389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
39489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
39589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
39689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
39789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mIsVideoSourceSet != mIsVideoEncoderSet) {
39889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (mIsVideoSourceSet) {
39989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            LOGE("video source is set, but video encoder is not set");
40089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } else {  // must not happen, since setVideoEncoder checks this already
40189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            LOGE("video encoder is set, but video source is not set");
40289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
40389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
40489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
40589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
40689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->prepare();
40789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
40889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("prepare failed: %d", ret);
40989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
4108555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
41189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
41289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mCurrentState = MEDIA_RECORDER_PREPARED;
41389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
41489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
41589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
41689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::getMaxAmplitude(int* max)
41789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
41889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("getMaxAmplitude");
41989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
42089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("media recorder is not initialized yet");
42189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
42289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
42389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mCurrentState & MEDIA_RECORDER_ERROR) {
42489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("getMaxAmplitude called in an invalid state: %d", mCurrentState);
42589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
42689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
42789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
42889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->getMaxAmplitude(max);
42989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
43089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("getMaxAmplitude failed: %d", ret);
43189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
4328555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
43389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
43489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
43589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
43689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
43789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::start()
43889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
43989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("start");
44089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mMediaRecorder == NULL) {
44189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("media recorder is not initialized yet");
44289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
44389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
44489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_PREPARED)) {
44589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("start called in an invalid state: %d", mCurrentState);
44689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
44789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
44889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
44989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->start();
45089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
45189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("start failed: %d", ret);
45289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
4538555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
45489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
45589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mCurrentState = MEDIA_RECORDER_RECORDING;
45689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
45789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
45889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
45989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::stop()
46089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
46189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("stop");
46289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mMediaRecorder == NULL) {
46389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("media recorder is not initialized yet");
46489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
46589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
46689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_RECORDING)) {
46789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("stop called in an invalid state: %d", mCurrentState);
46889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
46989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
47089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
47189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->stop();
47289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
47389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("stop failed: %d", ret);
47489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
4758555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
47689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
47765e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project
47865e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project    // FIXME:
47965e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project    // stop and reset are semantically different.
48065e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project    // We treat them the same for now, and will change this in the future.
48165e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project    doCleanUp();
48289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mCurrentState = MEDIA_RECORDER_IDLE;
48389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
48489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
48589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
48689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Reset should be OK in any state
48789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::reset()
48889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
48989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("reset");
49089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mMediaRecorder == NULL) {
49189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("media recorder is not initialized yet");
49289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
49389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
49489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
49589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    doCleanUp();
49689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = UNKNOWN_ERROR;
49789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    switch(mCurrentState) {
49889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MEDIA_RECORDER_IDLE:
49989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            ret = OK;
50089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            break;
50189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
50289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MEDIA_RECORDER_RECORDING:
50389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MEDIA_RECORDER_DATASOURCE_CONFIGURED:
50489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MEDIA_RECORDER_PREPARED:
50589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MEDIA_RECORDER_ERROR: {
50689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            ret = doReset();
50789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (OK != ret) {
50889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project               return ret;  // No need to continue
50989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
51089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }  // Intentional fall through
51189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MEDIA_RECORDER_INITIALIZED:
51289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            ret = close();
51389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            break;
51489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
51589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        default: {
51689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            LOGE("Unexpected non-existing state: %d", mCurrentState);
51789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            break;
51889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
51989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
52089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
52189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
52289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
52389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::close()
52489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
52589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("close");
52689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_INITIALIZED)) {
52789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("close called in an invalid state: %d", mCurrentState);
52889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
52989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
53089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->close();
53189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
53289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("close failed: %d", ret);
53389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
53489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return UNKNOWN_ERROR;
53589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    } else {
53689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_IDLE;
53789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
53889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
53989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
54089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
54189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::doReset()
54289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
54389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("doReset");
54489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->reset();
54589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
54689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("doReset failed: %d", ret);
54789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
5488555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
54989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    } else {
55089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_INITIALIZED;
55189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
55289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
55389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
55489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
55589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid MediaRecorder::doCleanUp()
55689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
55789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("doCleanUp");
55889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsAudioSourceSet  = false;
55989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsVideoSourceSet  = false;
56089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsAudioEncoderSet = false;
56189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsVideoEncoderSet = false;
56289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsOutputFileSet   = false;
56389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
56489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
56589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Release should be OK in any state
56689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::release()
56789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
56889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("release");
56989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mMediaRecorder != NULL) {
57089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return mMediaRecorder->release();
57189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
57289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return INVALID_OPERATION;
57389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
57489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
57589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectMediaRecorder::MediaRecorder()
57689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
57789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("constructor");
57889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    sp<IServiceManager> sm = defaultServiceManager();
57989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    sp<IBinder> binder;
58089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
58189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    do {
58289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        binder = sm->getService(String16("media.player"));
58389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (binder != NULL) {
58489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            break;
58589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
58689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGW("MediaPlayerService not published, waiting...");
58789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        usleep(500000); // 0.5 s
58889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    } while(true);
58989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
59089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(binder);
59189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (service != NULL) {
59289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mMediaRecorder = service->createMediaRecorder(getpid());
59389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
59489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mMediaRecorder != NULL) {
59589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_IDLE;
59689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
59789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    doCleanUp();
59889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
59989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
60089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::initCheck()
60189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
60289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mMediaRecorder != 0 ? NO_ERROR : NO_INIT;
60389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
60489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
60589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectMediaRecorder::~MediaRecorder()
60689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
60789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("destructor");
60889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mMediaRecorder != NULL) {
60989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mMediaRecorder.clear();
61089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
61189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
61289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
61389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setListener(const sp<MediaRecorderListener>& listener)
61489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
61589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("setListener");
61689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
61789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mListener = listener;
61889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
61989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return NO_ERROR;
62089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
62189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
62289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid MediaRecorder::notify(int msg, int ext1, int ext2)
62389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
62489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("message received msg=%d, ext1=%d, ext2=%d", msg, ext1, ext2);
62589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
62689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    sp<MediaRecorderListener> listener;
62789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mLock.lock();
62889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    listener = mListener;
62989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mLock.unlock();
63089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
63189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (listener != NULL) {
63289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Mutex::Autolock _l(mNotifyLock);
63389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGV("callback application");
63489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        listener->notify(msg, ext1, ext2);
63589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGV("back from callback");
63689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
63789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
63889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
63989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android
64089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
641