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 <media/mediarecorder.h>
227562408b2261d38415453378b6188f74fda99d88Mathias Agopian#include <binder/IServiceManager.h>
23c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project#include <utils/String8.h>
2489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/IMediaPlayerService.h>
2589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/IMediaRecorder.h>
26dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dong#include <media/mediaplayer.h>  // for MEDIA_ERROR_SERVER_DIED
27b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi#include <gui/ISurfaceTexture.h>
2889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android {
3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
314ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Listatus_t MediaRecorder::setCamera(const sp<ICamera>& camera, const sp<ICameraRecordingProxy>& proxy)
3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
333856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setCamera(%p,%p)", camera.get(), proxy.get());
34e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    if (mMediaRecorder == NULL) {
3529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("media recorder is not initialized yet");
3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_IDLE)) {
3929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setCamera called in an invalid state(%d)", mCurrentState);
4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
4289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
434ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    status_t ret = mMediaRecorder->setCamera(camera, proxy);
4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
453856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("setCamera failed: %d", ret);
4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
478555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
5089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
5189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
5289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setPreviewSurface(const sp<Surface>& surface)
5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
543856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setPreviewSurface(%p)", surface.get());
55e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    if (mMediaRecorder == NULL) {
5629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("media recorder is not initialized yet");
5789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
5889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
5989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
6029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setPreviewSurface called in an invalid state(%d)", mCurrentState);
6189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
6289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
6389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!mIsVideoSourceSet) {
6429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("try to set preview surface without setting the video source first");
6589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
6689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
6789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
684b79168835965cf0fc41ebe2a367e22b4cb20d08Jamie Gennis    status_t ret = mMediaRecorder->setPreviewSurface(surface);
6989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
703856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("setPreviewSurface failed: %d", ret);
7189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
728555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
7389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
7589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
7689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::init()
7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
793856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("init");
80e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    if (mMediaRecorder == NULL) {
8129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("media recorder is not initialized yet");
8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_IDLE)) {
8529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("init called in an invalid state(%d)", mCurrentState);
8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
8889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->init();
9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
913856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("init failed: %d", ret);
9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
938555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    ret = mMediaRecorder->setListener(this);
9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
983856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("setListener failed: %d", ret);
9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
1008555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
10389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mCurrentState = MEDIA_RECORDER_INITIALIZED;
10489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
10589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
10789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setVideoSource(int vs)
10889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
1093856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setVideoSource(%d)", vs);
110e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    if (mMediaRecorder == NULL) {
11129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("media recorder is not initialized yet");
11289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
11489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mIsVideoSourceSet) {
11529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("video source has already been set");
11689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
11789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
11889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mCurrentState & MEDIA_RECORDER_IDLE) {
1193856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("Call init() since the media recorder is not initialized yet");
12089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t ret = init();
12189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (OK != ret) {
12289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return ret;
12389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
12489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
12589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_INITIALIZED)) {
12629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setVideoSource called in an invalid state(%d)", mCurrentState);
12789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
12889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
12989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
130b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    // following call is made over the Binder Interface
13189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setVideoSource(vs);
132b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi
13389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
1343856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("setVideoSource failed: %d", ret);
13589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
1368555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
13789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
13889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsVideoSourceSet = true;
13989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
14189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
14289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setAudioSource(int as)
14389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
1443856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setAudioSource(%d)", as);
145e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    if (mMediaRecorder == NULL) {
14629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("media recorder is not initialized yet");
14789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
14889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
14989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mCurrentState & MEDIA_RECORDER_IDLE) {
1503856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("Call init() since the media recorder is not initialized yet");
15189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t ret = init();
15289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (OK != ret) {
15389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return ret;
15489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
15589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
15689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mIsAudioSourceSet) {
15729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("audio source has already been set");
15889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
15989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
16089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_INITIALIZED)) {
16129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setAudioSource called in an invalid state(%d)", mCurrentState);
16289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
16389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
16489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
16589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setAudioSource(as);
16689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
1673856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("setAudioSource failed: %d", ret);
16889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
1698555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
17089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
17189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsAudioSourceSet = true;
17289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
17389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
17489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
17589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setOutputFormat(int of)
17689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
1773856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setOutputFormat(%d)", of);
178e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    if (mMediaRecorder == NULL) {
17929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("media recorder is not initialized yet");
18089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
18189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
18289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_INITIALIZED)) {
18329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setOutputFormat called in an invalid state: %d", mCurrentState);
18489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
18589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
18659b7dc39ea8332d3418a599e51447d7edb612ac4Andreas Huber    if (mIsVideoSourceSet && of >= OUTPUT_FORMAT_AUDIO_ONLY_START && of != OUTPUT_FORMAT_RTP_AVP && of != OUTPUT_FORMAT_MPEG2TS) { //first non-video output format
18729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("output format (%d) is meant for audio recording only and incompatible with video recording", of);
18889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
18989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
19089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
19189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setOutputFormat(of);
19289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
19329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setOutputFormat failed: %d", ret);
19489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
1958555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
19689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mCurrentState = MEDIA_RECORDER_DATASOURCE_CONFIGURED;
19889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
19989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
20089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
20189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setVideoEncoder(int ve)
20289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
2033856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setVideoEncoder(%d)", ve);
204e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    if (mMediaRecorder == NULL) {
20529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("media recorder is not initialized yet");
20689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
20789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
20889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!mIsVideoSourceSet) {
20929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("try to set the video encoder without setting the video source first");
21089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
21189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
21289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mIsVideoEncoderSet) {
21329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("video encoder has already been set");
21489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
21589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
21729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setVideoEncoder called in an invalid state(%d)", mCurrentState);
21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
22089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setVideoEncoder(ve);
22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
2233856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("setVideoEncoder failed: %d", ret);
22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
2258555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
22689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsVideoEncoderSet = true;
22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setAudioEncoder(int ae)
23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
2333856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setAudioEncoder(%d)", ae);
234e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    if (mMediaRecorder == NULL) {
23529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("media recorder is not initialized yet");
23689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
23789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
23889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!mIsAudioSourceSet) {
23929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("try to set the audio encoder without setting the audio source first");
24089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
24189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
24289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mIsAudioEncoderSet) {
24329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("audio encoder has already been set");
24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
24589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
24689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
24729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setAudioEncoder called in an invalid state(%d)", mCurrentState);
24889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
24989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
25089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
25189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setAudioEncoder(ae);
25289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
2533856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("setAudioEncoder failed: %d", ret);
25489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
2558555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
25689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
25789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsAudioEncoderSet = true;
25889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
25989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
26089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
26189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setOutputFile(const char* path)
26289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
2633856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setOutputFile(%s)", path);
264e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    if (mMediaRecorder == NULL) {
26529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("media recorder is not initialized yet");
26689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
26789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
26889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mIsOutputFileSet) {
26929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("output file has already been set");
27089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
27189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
27289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
27329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setOutputFile called in an invalid state(%d)", mCurrentState);
27489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
27589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
27789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setOutputFile(path);
27889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
2793856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("setOutputFile failed: %d", ret);
28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
2818555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
28389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsOutputFileSet = true;
28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
28589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
28689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
28789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setOutputFile(int fd, int64_t offset, int64_t length)
28889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
2893856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setOutputFile(%d, %lld, %lld)", fd, offset, length);
290e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    if (mMediaRecorder == NULL) {
29129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("media recorder is not initialized yet");
29289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mIsOutputFileSet) {
29529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("output file has already been set");
29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
29789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
29929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setOutputFile called in an invalid state(%d)", mCurrentState);
30089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
30189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
303f1d985081cff2a6aa2397c5341da8432db753211James Dong    // It appears that if an invalid file descriptor is passed through
304f1d985081cff2a6aa2397c5341da8432db753211James Dong    // binder calls, the server-side of the inter-process function call
305f1d985081cff2a6aa2397c5341da8432db753211James Dong    // is skipped. As a result, the check at the server-side to catch
306f1d985081cff2a6aa2397c5341da8432db753211James Dong    // the invalid file descritpor never gets invoked. This is to workaround
307f1d985081cff2a6aa2397c5341da8432db753211James Dong    // this issue by checking the file descriptor first before passing
308f1d985081cff2a6aa2397c5341da8432db753211James Dong    // it through binder call.
309f1d985081cff2a6aa2397c5341da8432db753211James Dong    if (fd < 0) {
31029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("Invalid file descriptor: %d", fd);
311f1d985081cff2a6aa2397c5341da8432db753211James Dong        return BAD_VALUE;
312f1d985081cff2a6aa2397c5341da8432db753211James Dong    }
313f1d985081cff2a6aa2397c5341da8432db753211James Dong
31489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setOutputFile(fd, offset, length);
31589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
3163856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("setOutputFile failed: %d", ret);
31789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
3188555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
31989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
32089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsOutputFileSet = true;
32189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
32289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
32389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
32489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setVideoSize(int width, int height)
32589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
3263856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setVideoSize(%d, %d)", width, height);
327e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    if (mMediaRecorder == NULL) {
32829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("media recorder is not initialized yet");
32989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
33089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
33189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
33229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setVideoSize called in an invalid state: %d", mCurrentState);
33389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
33489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
33589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!mIsVideoSourceSet) {
33629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("Cannot set video size without setting video source first");
33789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
33889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
33989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
34089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setVideoSize(width, height);
34189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
34229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setVideoSize failed: %d", ret);
34389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
3448555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
34589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
346b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi
34789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
34889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
34989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
350b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi// Query a SurfaceMediaSurface through the Mediaserver, over the
351b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi// binder interface. This is used by the Filter Framework (MeidaEncoder)
352b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi// to get an <ISurfaceTexture> object to hook up to ANativeWindow.
353b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketisp<ISurfaceTexture> MediaRecorder::
354b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi        querySurfaceMediaSourceFromMediaServer()
355b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi{
356b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    Mutex::Autolock _l(mLock);
357b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    mSurfaceMediaSource =
358b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi            mMediaRecorder->querySurfaceMediaSource();
359b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    if (mSurfaceMediaSource == NULL) {
36029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("SurfaceMediaSource could not be initialized!");
361b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    }
362b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    return mSurfaceMediaSource;
363b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi}
364b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi
365b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi
366b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi
36789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setVideoFrameRate(int frames_per_second)
36889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
3693856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setVideoFrameRate(%d)", frames_per_second);
370e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    if (mMediaRecorder == NULL) {
37129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("media recorder is not initialized yet");
37289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
37389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
37489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
37529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setVideoFrameRate called in an invalid state: %d", mCurrentState);
37689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
37789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
37889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!mIsVideoSourceSet) {
37929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("Cannot set video frame rate without setting video source first");
3809747c5a1f5e51fab72169767972bf55f73711000Jianhong Jiang        return INVALID_OPERATION;
38189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
38289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
38389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setVideoFrameRate(frames_per_second);
38489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
38529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setVideoFrameRate failed: %d", ret);
38689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
3878555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
38889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
38989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
39089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
39189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
392c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Projectstatus_t MediaRecorder::setParameters(const String8& params) {
3933856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setParameters(%s)", params.string());
394e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    if (mMediaRecorder == NULL) {
39529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("media recorder is not initialized yet");
396c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project        return INVALID_OPERATION;
397c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    }
398c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project
399e284bac7757ad732d0812eb6133125434ba66d5bJames Dong    bool isInvalidState = (mCurrentState &
400e284bac7757ad732d0812eb6133125434ba66d5bJames Dong                           (MEDIA_RECORDER_PREPARED |
401e284bac7757ad732d0812eb6133125434ba66d5bJames Dong                            MEDIA_RECORDER_RECORDING |
402e284bac7757ad732d0812eb6133125434ba66d5bJames Dong                            MEDIA_RECORDER_ERROR));
403e284bac7757ad732d0812eb6133125434ba66d5bJames Dong    if (isInvalidState) {
40429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setParameters is called in an invalid state: %d", mCurrentState);
405e284bac7757ad732d0812eb6133125434ba66d5bJames Dong        return INVALID_OPERATION;
406e284bac7757ad732d0812eb6133125434ba66d5bJames Dong    }
407e284bac7757ad732d0812eb6133125434ba66d5bJames Dong
408c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    status_t ret = mMediaRecorder->setParameters(params);
409c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    if (OK != ret) {
41029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setParameters(%s) failed: %d", params.string(), ret);
4111179bc9b0e3d17c984e8f4ad38561c049dd102faThe Android Open Source Project        // Do not change our current state to MEDIA_RECORDER_ERROR, failures
4121179bc9b0e3d17c984e8f4ad38561c049dd102faThe Android Open Source Project        // of the only currently supported parameters, "max-duration" and
4131179bc9b0e3d17c984e8f4ad38561c049dd102faThe Android Open Source Project        // "max-filesize" are _not_ fatal.
414c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    }
415c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project
416c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    return ret;
417c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project}
418c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project
41989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::prepare()
42089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
4213856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("prepare");
422e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    if (mMediaRecorder == NULL) {
42329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("media recorder is not initialized yet");
42489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
42589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
42689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
42729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("prepare called in an invalid state: %d", mCurrentState);
42889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
42989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
43089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mIsAudioSourceSet != mIsAudioEncoderSet) {
43189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (mIsAudioSourceSet) {
43229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("audio source is set, but audio encoder is not set");
43389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } else {  // must not happen, since setAudioEncoder checks this already
43429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("audio encoder is set, but audio source is not set");
43589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
43689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
43789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
43889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
43989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mIsVideoSourceSet != mIsVideoEncoderSet) {
44089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (mIsVideoSourceSet) {
44129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("video source is set, but video encoder is not set");
44289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } else {  // must not happen, since setVideoEncoder checks this already
44329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("video encoder is set, but video source is not set");
44489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
44589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
44689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
44789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
44889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->prepare();
44989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
45029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("prepare failed: %d", ret);
45189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
4528555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
45389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
45489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mCurrentState = MEDIA_RECORDER_PREPARED;
45589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
45689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
45789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
45889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::getMaxAmplitude(int* max)
45989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
4603856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("getMaxAmplitude");
461e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    if (mMediaRecorder == NULL) {
46229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("media recorder is not initialized yet");
46389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
46489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
46589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mCurrentState & MEDIA_RECORDER_ERROR) {
46629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("getMaxAmplitude called in an invalid state: %d", mCurrentState);
46789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
46889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
46989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
47089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->getMaxAmplitude(max);
47189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
47229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("getMaxAmplitude failed: %d", ret);
47389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
4748555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
47589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
47689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
47789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
47889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
47989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::start()
48089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
4813856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("start");
48289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mMediaRecorder == NULL) {
48329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("media recorder is not initialized yet");
48489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
48589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
48689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_PREPARED)) {
48729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("start called in an invalid state: %d", mCurrentState);
48889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
48989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
49089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
49189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->start();
49289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
49329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("start failed: %d", ret);
49489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
4958555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
49689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
49789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mCurrentState = MEDIA_RECORDER_RECORDING;
49889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
49989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
50089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
50189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::stop()
50289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
5033856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("stop");
50489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mMediaRecorder == NULL) {
50529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("media recorder is not initialized yet");
50689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
50789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
50889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_RECORDING)) {
50929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("stop called in an invalid state: %d", mCurrentState);
51089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
51189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
51289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
51389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->stop();
51489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
51529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("stop failed: %d", ret);
51689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
5178555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
51889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
5199747c5a1f5e51fab72169767972bf55f73711000Jianhong Jiang
52065e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project    // FIXME:
52165e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project    // stop and reset are semantically different.
52265e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project    // We treat them the same for now, and will change this in the future.
52365e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project    doCleanUp();
52489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mCurrentState = MEDIA_RECORDER_IDLE;
52589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
52689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
52789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
52889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Reset should be OK in any state
52989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::reset()
53089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
5313856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("reset");
53289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mMediaRecorder == NULL) {
53329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("media recorder is not initialized yet");
53489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
53589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
5369747c5a1f5e51fab72169767972bf55f73711000Jianhong Jiang
53789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    doCleanUp();
53889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = UNKNOWN_ERROR;
539e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    switch (mCurrentState) {
54089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MEDIA_RECORDER_IDLE:
54189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            ret = OK;
54289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            break;
54389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
54489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MEDIA_RECORDER_RECORDING:
54589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MEDIA_RECORDER_DATASOURCE_CONFIGURED:
54689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MEDIA_RECORDER_PREPARED:
54789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MEDIA_RECORDER_ERROR: {
54889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            ret = doReset();
54989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (OK != ret) {
550e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten                return ret;  // No need to continue
55189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
55289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }  // Intentional fall through
55389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MEDIA_RECORDER_INITIALIZED:
55489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            ret = close();
55589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            break;
55689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
55789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        default: {
55829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("Unexpected non-existing state: %d", mCurrentState);
55989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            break;
56089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
56189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
56289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
56389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
56489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
56589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::close()
56689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
5673856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("close");
56889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_INITIALIZED)) {
56929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("close called in an invalid state: %d", mCurrentState);
57089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
57189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
57289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->close();
57389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
57429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("close failed: %d", ret);
57589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
57689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return UNKNOWN_ERROR;
57789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    } else {
57889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_IDLE;
57989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
58089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
58189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
58289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
58389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::doReset()
58489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
5853856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("doReset");
58689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->reset();
58789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
58829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("doReset failed: %d", ret);
58989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
5908555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
59189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    } else {
59289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_INITIALIZED;
59389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
59489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
59589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
59689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
59789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid MediaRecorder::doCleanUp()
59889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
5993856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("doCleanUp");
60089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsAudioSourceSet  = false;
60189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsVideoSourceSet  = false;
60289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsAudioEncoderSet = false;
60389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsVideoEncoderSet = false;
60489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsOutputFileSet   = false;
60589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
60689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
60789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Release should be OK in any state
60889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::release()
60989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
6103856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("release");
61189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mMediaRecorder != NULL) {
61289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return mMediaRecorder->release();
61389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
61489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return INVALID_OPERATION;
61589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
61689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
617b33f3407bab0970a7f9241680723a1140b177c50Pannag SanketiMediaRecorder::MediaRecorder() : mSurfaceMediaSource(NULL)
61889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
6193856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("constructor");
62089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
621dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dong    const sp<IMediaPlayerService>& service(getMediaPlayerService());
62289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (service != NULL) {
62389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mMediaRecorder = service->createMediaRecorder(getpid());
62489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
62589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mMediaRecorder != NULL) {
62689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_IDLE;
62789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
628b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi
629b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi
63089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    doCleanUp();
63189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
63289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
63389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::initCheck()
63489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
63589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mMediaRecorder != 0 ? NO_ERROR : NO_INIT;
63689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
63789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
63889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectMediaRecorder::~MediaRecorder()
63989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
6403856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("destructor");
64189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mMediaRecorder != NULL) {
64289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mMediaRecorder.clear();
64389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
644b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi
645b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    if (mSurfaceMediaSource != NULL) {
646b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi        mSurfaceMediaSource.clear();
647b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    }
64889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
64989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
65089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setListener(const sp<MediaRecorderListener>& listener)
65189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
6523856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setListener");
65389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
65489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mListener = listener;
65589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
65689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return NO_ERROR;
65789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
65889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
65989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid MediaRecorder::notify(int msg, int ext1, int ext2)
66089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
6613856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("message received msg=%d, ext1=%d, ext2=%d", msg, ext1, ext2);
66289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
66389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    sp<MediaRecorderListener> listener;
66489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mLock.lock();
66589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    listener = mListener;
66689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mLock.unlock();
66789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
66889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (listener != NULL) {
66989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Mutex::Autolock _l(mNotifyLock);
6703856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("callback application");
67189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        listener->notify(msg, ext1, ext2);
6723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("back from callback");
67389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
67489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
67589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
676dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dongvoid MediaRecorder::died()
677dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dong{
6783856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("died");
679dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dong    notify(MEDIA_RECORDER_EVENT_ERROR, MEDIA_ERROR_SERVER_DIED, 0);
680dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dong}
681dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dong
68289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android
683