mediarecorder.cpp revision 29357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47
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>
213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <surfaceflinger/Surface.h>
2289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/mediarecorder.h>
237562408b2261d38415453378b6188f74fda99d88Mathias Agopian#include <binder/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>
27dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dong#include <media/mediaplayer.h>  // for MEDIA_ERROR_SERVER_DIED
28b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi#include <gui/ISurfaceTexture.h>
2989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android {
3189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
324ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Listatus_t MediaRecorder::setCamera(const sp<ICamera>& camera, const sp<ICameraRecordingProxy>& proxy)
3389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
343856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setCamera(%p,%p)", camera.get(), proxy.get());
3589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
3629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("media recorder is not initialized yet");
3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_IDLE)) {
4029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setCamera called in an invalid state(%d)", mCurrentState);
4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
4289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
444ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    status_t ret = mMediaRecorder->setCamera(camera, proxy);
4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("setCamera failed: %d", ret);
4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
488555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
5089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
5189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
5289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setPreviewSurface(const sp<Surface>& surface)
5489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
553856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setPreviewSurface(%p)", surface.get());
5689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
5729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("media recorder is not initialized yet");
5889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
5989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
6089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
6129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setPreviewSurface called in an invalid state(%d)", mCurrentState);
6289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
6389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
6489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!mIsVideoSourceSet) {
6529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("try to set preview surface without setting the video source first");
6689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
6789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
6889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
694b79168835965cf0fc41ebe2a367e22b4cb20d08Jamie Gennis    status_t ret = mMediaRecorder->setPreviewSurface(surface);
7089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
713856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("setPreviewSurface failed: %d", ret);
7289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
738555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
7589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
7689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::init()
7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
803856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("init");
8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
8229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("media recorder is not initialized yet");
8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_IDLE)) {
8629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("init called in an invalid state(%d)", mCurrentState);
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
8889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->init();
9189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
923856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("init failed: %d", ret);
9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
948555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    ret = mMediaRecorder->setListener(this);
9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
993856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("setListener failed: %d", ret);
10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
1018555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
10389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
10489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mCurrentState = MEDIA_RECORDER_INITIALIZED;
10589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
10789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
10889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setVideoSource(int vs)
10989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
1103856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setVideoSource(%d)", vs);
11189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
11229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("media recorder is not initialized yet");
11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
11489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
11589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mIsVideoSourceSet) {
11629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("video source has already been set");
11789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
11889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
11989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mCurrentState & MEDIA_RECORDER_IDLE) {
1203856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("Call init() since the media recorder is not initialized yet");
12189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t ret = init();
12289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (OK != ret) {
12389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return ret;
12489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
12589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
12689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_INITIALIZED)) {
12729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setVideoSource called in an invalid state(%d)", mCurrentState);
12889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
12989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
13089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
131b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    // following call is made over the Binder Interface
13289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setVideoSource(vs);
133b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi
13489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
1353856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("setVideoSource failed: %d", ret);
13689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
1378555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
13889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
13989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsVideoSourceSet = true;
14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
14189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
14289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
14389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setAudioSource(int as)
14489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
1453856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setAudioSource(%d)", as);
14689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
14729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("media recorder is not initialized yet");
14889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
14989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
15089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mCurrentState & MEDIA_RECORDER_IDLE) {
1513856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("Call init() since the media recorder is not initialized yet");
15289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t ret = init();
15389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (OK != ret) {
15489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return ret;
15589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
15689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
15789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mIsAudioSourceSet) {
15829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("audio source has already been set");
15989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
16089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
16189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_INITIALIZED)) {
16229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setAudioSource called in an invalid state(%d)", mCurrentState);
16389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
16489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
16589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
16689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setAudioSource(as);
16789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
1683856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("setAudioSource failed: %d", ret);
16989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
1708555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
17189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
17289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsAudioSourceSet = true;
17389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
17489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
17589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
17689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setOutputFormat(int of)
17789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
1783856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setOutputFormat(%d)", of);
17989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
18029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("media recorder is not initialized yet");
18189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
18289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
18389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_INITIALIZED)) {
18429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setOutputFormat called in an invalid state: %d", mCurrentState);
18589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
18689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
18759b7dc39ea8332d3418a599e51447d7edb612ac4Andreas Huber    if (mIsVideoSourceSet && of >= OUTPUT_FORMAT_AUDIO_ONLY_START && of != OUTPUT_FORMAT_RTP_AVP && of != OUTPUT_FORMAT_MPEG2TS) { //first non-video output format
18829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("output format (%d) is meant for audio recording only and incompatible with video recording", of);
18989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
19089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
19189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
19289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setOutputFormat(of);
19389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
19429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setOutputFormat failed: %d", ret);
19589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
1968555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
19889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mCurrentState = MEDIA_RECORDER_DATASOURCE_CONFIGURED;
19989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
20089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
20189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
20289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setVideoEncoder(int ve)
20389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
2043856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setVideoEncoder(%d)", ve);
20589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
20629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("media recorder is not initialized yet");
20789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
20889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
20989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!mIsVideoSourceSet) {
21029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("try to set the video encoder without setting the video source first");
21189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
21289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
21389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mIsVideoEncoderSet) {
21429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("video encoder has already been set");
21589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
21829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setVideoEncoder called in an invalid state(%d)", mCurrentState);
21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
22089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setVideoEncoder(ve);
22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
2243856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("setVideoEncoder failed: %d", ret);
22589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
2268555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsVideoEncoderSet = true;
22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setAudioEncoder(int ae)
23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
2343856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setAudioEncoder(%d)", ae);
23589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
23629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("media recorder is not initialized yet");
23789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
23889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
23989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!mIsAudioSourceSet) {
24029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("try to set the audio encoder without setting the audio source first");
24189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
24289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
24389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mIsAudioEncoderSet) {
24429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("audio encoder has already been set");
24589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
24689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
24789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
24829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setAudioEncoder called in an invalid state(%d)", mCurrentState);
24989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
25089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
25189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
25289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setAudioEncoder(ae);
25389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
2543856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("setAudioEncoder failed: %d", ret);
25589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
2568555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
25789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
25889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsAudioEncoderSet = true;
25989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
26089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
26189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
26289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setOutputFile(const char* path)
26389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
2643856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setOutputFile(%s)", path);
26589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
26629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("media recorder is not initialized yet");
26789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
26889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
26989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mIsOutputFileSet) {
27029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("output file has already been set");
27189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
27289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
27389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
27429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setOutputFile called in an invalid state(%d)", mCurrentState);
27589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
27789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
27889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setOutputFile(path);
27989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
2803856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("setOutputFile failed: %d", ret);
28189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
2828555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
28389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsOutputFileSet = true;
28589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
28689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
28789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
28889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setOutputFile(int fd, int64_t offset, int64_t length)
28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
2903856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setOutputFile(%d, %lld, %lld)", fd, offset, length);
29189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
29229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("media recorder is not initialized yet");
29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
29589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mIsOutputFileSet) {
29629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("output file has already been set");
29789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
29989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
30029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setOutputFile called in an invalid state(%d)", mCurrentState);
30189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
30389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
304f1d985081cff2a6aa2397c5341da8432db753211James Dong    // It appears that if an invalid file descriptor is passed through
305f1d985081cff2a6aa2397c5341da8432db753211James Dong    // binder calls, the server-side of the inter-process function call
306f1d985081cff2a6aa2397c5341da8432db753211James Dong    // is skipped. As a result, the check at the server-side to catch
307f1d985081cff2a6aa2397c5341da8432db753211James Dong    // the invalid file descritpor never gets invoked. This is to workaround
308f1d985081cff2a6aa2397c5341da8432db753211James Dong    // this issue by checking the file descriptor first before passing
309f1d985081cff2a6aa2397c5341da8432db753211James Dong    // it through binder call.
310f1d985081cff2a6aa2397c5341da8432db753211James Dong    if (fd < 0) {
31129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("Invalid file descriptor: %d", fd);
312f1d985081cff2a6aa2397c5341da8432db753211James Dong        return BAD_VALUE;
313f1d985081cff2a6aa2397c5341da8432db753211James Dong    }
314f1d985081cff2a6aa2397c5341da8432db753211James Dong
31589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setOutputFile(fd, offset, length);
31689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
3173856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("setOutputFile failed: %d", ret);
31889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
3198555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
32089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
32189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsOutputFileSet = true;
32289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
32389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
32489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
32589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setVideoSize(int width, int height)
32689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
3273856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setVideoSize(%d, %d)", width, height);
32889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
32929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("media recorder is not initialized yet");
33089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
33189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
33289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
33329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setVideoSize called in an invalid state: %d", mCurrentState);
33489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
33589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
33689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!mIsVideoSourceSet) {
33729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("Cannot set video size without setting video source first");
33889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
33989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
34089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
34189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setVideoSize(width, height);
34289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
34329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setVideoSize failed: %d", ret);
34489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
3458555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
34689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
347b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi
34889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
34989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
35089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
351b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi// Query a SurfaceMediaSurface through the Mediaserver, over the
352b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi// binder interface. This is used by the Filter Framework (MeidaEncoder)
353b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi// to get an <ISurfaceTexture> object to hook up to ANativeWindow.
354b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketisp<ISurfaceTexture> MediaRecorder::
355b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi        querySurfaceMediaSourceFromMediaServer()
356b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi{
357b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    Mutex::Autolock _l(mLock);
358b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    mSurfaceMediaSource =
359b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi            mMediaRecorder->querySurfaceMediaSource();
360b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    if (mSurfaceMediaSource == NULL) {
36129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("SurfaceMediaSource could not be initialized!");
362b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    }
363b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    return mSurfaceMediaSource;
364b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi}
365b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi
366b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi
367b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi
36889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setVideoFrameRate(int frames_per_second)
36989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
3703856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setVideoFrameRate(%d)", frames_per_second);
37189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
37229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("media recorder is not initialized yet");
37389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
37489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
37589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
37629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setVideoFrameRate called in an invalid state: %d", mCurrentState);
37789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
37889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
37989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!mIsVideoSourceSet) {
38029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("Cannot set video frame rate without setting video source first");
3819747c5a1f5e51fab72169767972bf55f73711000Jianhong Jiang        return INVALID_OPERATION;
38289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
38389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
38489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setVideoFrameRate(frames_per_second);
38589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
38629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setVideoFrameRate failed: %d", ret);
38789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
3888555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
38989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
39089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
39189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
39289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
393c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Projectstatus_t MediaRecorder::setParameters(const String8& params) {
3943856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setParameters(%s)", params.string());
395c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    if(mMediaRecorder == NULL) {
39629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("media recorder is not initialized yet");
397c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project        return INVALID_OPERATION;
398c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    }
399c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project
400e284bac7757ad732d0812eb6133125434ba66d5bJames Dong    bool isInvalidState = (mCurrentState &
401e284bac7757ad732d0812eb6133125434ba66d5bJames Dong                           (MEDIA_RECORDER_PREPARED |
402e284bac7757ad732d0812eb6133125434ba66d5bJames Dong                            MEDIA_RECORDER_RECORDING |
403e284bac7757ad732d0812eb6133125434ba66d5bJames Dong                            MEDIA_RECORDER_ERROR));
404e284bac7757ad732d0812eb6133125434ba66d5bJames Dong    if (isInvalidState) {
40529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setParameters is called in an invalid state: %d", mCurrentState);
406e284bac7757ad732d0812eb6133125434ba66d5bJames Dong        return INVALID_OPERATION;
407e284bac7757ad732d0812eb6133125434ba66d5bJames Dong    }
408e284bac7757ad732d0812eb6133125434ba66d5bJames Dong
409c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    status_t ret = mMediaRecorder->setParameters(params);
410c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    if (OK != ret) {
41129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("setParameters(%s) failed: %d", params.string(), ret);
4121179bc9b0e3d17c984e8f4ad38561c049dd102faThe Android Open Source Project        // Do not change our current state to MEDIA_RECORDER_ERROR, failures
4131179bc9b0e3d17c984e8f4ad38561c049dd102faThe Android Open Source Project        // of the only currently supported parameters, "max-duration" and
4141179bc9b0e3d17c984e8f4ad38561c049dd102faThe Android Open Source Project        // "max-filesize" are _not_ fatal.
415c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    }
416c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project
417c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    return ret;
418c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project}
419c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project
42089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::prepare()
42189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
4223856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("prepare");
42389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
42429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("media recorder is not initialized yet");
42589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
42689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
42789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
42829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("prepare called in an invalid state: %d", mCurrentState);
42989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
43089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
43189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mIsAudioSourceSet != mIsAudioEncoderSet) {
43289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (mIsAudioSourceSet) {
43329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("audio source is set, but audio encoder is not set");
43489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } else {  // must not happen, since setAudioEncoder checks this already
43529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("audio encoder is set, but audio source is not set");
43689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
43789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
43889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
43989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
44089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mIsVideoSourceSet != mIsVideoEncoderSet) {
44189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (mIsVideoSourceSet) {
44229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("video source is set, but video encoder is not set");
44389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } else {  // must not happen, since setVideoEncoder checks this already
44429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("video encoder is set, but video source is not set");
44589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
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->prepare();
45089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
45129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("prepare 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_PREPARED;
45689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
45789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
45889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
45989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::getMaxAmplitude(int* max)
46089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
4613856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("getMaxAmplitude");
46289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
46329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("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_ERROR) {
46729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("getMaxAmplitude 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->getMaxAmplitude(max);
47289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
47329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("getMaxAmplitude failed: %d", ret);
47489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
4758555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
47689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
47789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
47889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
47989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
48089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::start()
48189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
4823856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("start");
48389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mMediaRecorder == NULL) {
48429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("media recorder is not initialized yet");
48589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
48689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
48789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_PREPARED)) {
48829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("start called in an invalid state: %d", mCurrentState);
48989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
49089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
49189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
49289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->start();
49389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
49429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("start failed: %d", ret);
49589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
4968555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
49789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
49889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mCurrentState = MEDIA_RECORDER_RECORDING;
49989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
50089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
50189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
50289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::stop()
50389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
5043856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("stop");
50589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mMediaRecorder == NULL) {
50629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("media recorder is not initialized yet");
50789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
50889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
50989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_RECORDING)) {
51029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("stop called in an invalid state: %d", mCurrentState);
51189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
51289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
51389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
51489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->stop();
51589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
51629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("stop failed: %d", ret);
51789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
5188555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
51989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
5209747c5a1f5e51fab72169767972bf55f73711000Jianhong Jiang
52165e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project    // FIXME:
52265e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project    // stop and reset are semantically different.
52365e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project    // We treat them the same for now, and will change this in the future.
52465e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project    doCleanUp();
52589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mCurrentState = MEDIA_RECORDER_IDLE;
52689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
52789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
52889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
52989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Reset should be OK in any state
53089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::reset()
53189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
5323856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("reset");
53389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mMediaRecorder == NULL) {
53429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("media recorder is not initialized yet");
53589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
53689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
5379747c5a1f5e51fab72169767972bf55f73711000Jianhong Jiang
53889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    doCleanUp();
53989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = UNKNOWN_ERROR;
54089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    switch(mCurrentState) {
54189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MEDIA_RECORDER_IDLE:
54289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            ret = OK;
54389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            break;
54489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
54589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MEDIA_RECORDER_RECORDING:
54689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MEDIA_RECORDER_DATASOURCE_CONFIGURED:
54789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MEDIA_RECORDER_PREPARED:
54889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MEDIA_RECORDER_ERROR: {
54989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            ret = doReset();
55089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (OK != ret) {
55189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project               return ret;  // No need to continue
55289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
55389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }  // Intentional fall through
55489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MEDIA_RECORDER_INITIALIZED:
55589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            ret = close();
55689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            break;
55789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
55889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        default: {
55929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("Unexpected non-existing state: %d", mCurrentState);
56089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            break;
56189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
56289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
56389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
56489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
56589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
56689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::close()
56789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
5683856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("close");
56989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_INITIALIZED)) {
57029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("close called in an invalid state: %d", mCurrentState);
57189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
57289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
57389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->close();
57489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
57529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("close failed: %d", ret);
57689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
57789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return UNKNOWN_ERROR;
57889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    } else {
57989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_IDLE;
58089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
58189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
58289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
58389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
58489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::doReset()
58589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
5863856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("doReset");
58789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->reset();
58889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
58929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("doReset failed: %d", ret);
59089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
5918555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
59289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    } else {
59389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_INITIALIZED;
59489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
59589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
59689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
59789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
59889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid MediaRecorder::doCleanUp()
59989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
6003856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("doCleanUp");
60189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsAudioSourceSet  = false;
60289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsVideoSourceSet  = false;
60389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsAudioEncoderSet = false;
60489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsVideoEncoderSet = false;
60589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsOutputFileSet   = false;
60689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
60789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
60889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Release should be OK in any state
60989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::release()
61089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
6113856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("release");
61289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mMediaRecorder != NULL) {
61389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return mMediaRecorder->release();
61489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
61589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return INVALID_OPERATION;
61689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
61789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
618b33f3407bab0970a7f9241680723a1140b177c50Pannag SanketiMediaRecorder::MediaRecorder() : mSurfaceMediaSource(NULL)
61989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
6203856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("constructor");
62189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
622dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dong    const sp<IMediaPlayerService>& service(getMediaPlayerService());
62389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (service != NULL) {
62489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mMediaRecorder = service->createMediaRecorder(getpid());
62589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
62689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mMediaRecorder != NULL) {
62789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_IDLE;
62889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
629b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi
630b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi
63189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    doCleanUp();
63289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
63389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
63489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::initCheck()
63589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
63689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mMediaRecorder != 0 ? NO_ERROR : NO_INIT;
63789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
63889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
63989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectMediaRecorder::~MediaRecorder()
64089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
6413856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("destructor");
64289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mMediaRecorder != NULL) {
64389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mMediaRecorder.clear();
64489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
645b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi
646b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    if (mSurfaceMediaSource != NULL) {
647b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi        mSurfaceMediaSource.clear();
648b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    }
64989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
65089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
65189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setListener(const sp<MediaRecorderListener>& listener)
65289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
6533856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setListener");
65489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
65589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mListener = listener;
65689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
65789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return NO_ERROR;
65889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
65989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
66089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid MediaRecorder::notify(int msg, int ext1, int ext2)
66189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
6623856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("message received msg=%d, ext1=%d, ext2=%d", msg, ext1, ext2);
66389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
66489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    sp<MediaRecorderListener> listener;
66589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mLock.lock();
66689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    listener = mListener;
66789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mLock.unlock();
66889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
66989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (listener != NULL) {
67089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Mutex::Autolock _l(mNotifyLock);
6713856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("callback application");
67289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        listener->notify(msg, ext1, ext2);
6733856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("back from callback");
67489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
67589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
67689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
677dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dongvoid MediaRecorder::died()
678dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dong{
6793856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("died");
680dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dong    notify(MEDIA_RECORDER_EVENT_ERROR, MEDIA_ERROR_SERVER_DIED, 0);
681dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dong}
682dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dong
68389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android
684