MediaRecorderClient.cpp revision 1cfe8ce28eafd5ff758adbb73bfb257503d7704b
189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/*
201cff464978aa0f749f42650180b45ea56cb17deJean-Baptiste Queru ** Copyright 2008, The Android Open Source Project
389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project **
489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** Licensed under the Apache License, Version 2.0 (the "License");
589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** you may not use this file except in compliance with the License.
689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** You may obtain a copy of the License at
789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project **
889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project **     http://www.apache.org/licenses/LICENSE-2.0
989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project **
1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** Unless required by applicable law or agreed to in writing, software
1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** distributed under the License is distributed on an "AS IS" BASIS,
1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** See the License for the specific language governing permissions and
1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** limitations under the License.
1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */
1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//#define LOG_NDEBUG 0
1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define LOG_TAG "MediaRecorderService"
1989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/Log.h>
2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <sys/types.h>
2289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <sys/stat.h>
2389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <dirent.h>
2489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <unistd.h>
2589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <string.h>
2689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <cutils/atomic.h>
2730ab66297501757d745b9ae10da61adcd891f497Andreas Huber#include <cutils/properties.h> // for property_get
287562408b2261d38415453378b6188f74fda99d88Mathias Agopian#include <binder/IPCThreadState.h>
297562408b2261d38415453378b6188f74fda99d88Mathias Agopian#include <binder/IServiceManager.h>
307562408b2261d38415453378b6188f74fda99d88Mathias Agopian#include <binder/MemoryHeapBase.h>
317562408b2261d38415453378b6188f74fda99d88Mathias Agopian#include <binder/MemoryBase.h>
32413f523afe96aff02d2b0a7459127b8f67b2b43cAndreas Huber
33d1d35e0359cc411b04615813ba4ebefbb33d1933Dave Sparks#include <utils/String16.h>
3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3564760240f931714858a59c1579f07264d7182ba2Dima Zavin#include <system/audio.h>
36fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin
3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include "MediaRecorderClient.h"
38dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang#include "MediaPlayerService.h"
3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
4030ab66297501757d745b9ae10da61adcd891f497Andreas Huber#include "StagefrightRecorder.h"
418ba01021b573889802e67e029225a96f0dfa471aAndy McFadden#include <gui/IGraphicBufferProducer.h>
4230ab66297501757d745b9ae10da61adcd891f497Andreas Huber
4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android {
4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
45d1d35e0359cc411b04615813ba4ebefbb33d1933Dave Sparksconst char* cameraPermission = "android.permission.CAMERA";
46510d6566bd2494991fac07aee46fcb2ddac99c13Dave Sparksconst char* recordAudioPermission = "android.permission.RECORD_AUDIO";
47d1d35e0359cc411b04615813ba4ebefbb33d1933Dave Sparks
48d1d35e0359cc411b04615813ba4ebefbb33d1933Dave Sparksstatic bool checkPermission(const char* permissionString) {
49d1d35e0359cc411b04615813ba4ebefbb33d1933Dave Sparks#ifndef HAVE_ANDROID_OS
50d1d35e0359cc411b04615813ba4ebefbb33d1933Dave Sparks    return true;
51d1d35e0359cc411b04615813ba4ebefbb33d1933Dave Sparks#endif
52d1d35e0359cc411b04615813ba4ebefbb33d1933Dave Sparks    if (getpid() == IPCThreadState::self()->getCallingPid()) return true;
53d1d35e0359cc411b04615813ba4ebefbb33d1933Dave Sparks    bool ok = checkCallingPermission(String16(permissionString));
5429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block    if (!ok) ALOGE("Request requires %s", permissionString);
55d1d35e0359cc411b04615813ba4ebefbb33d1933Dave Sparks    return ok;
56d1d35e0359cc411b04615813ba4ebefbb33d1933Dave Sparks}
57d1d35e0359cc411b04615813ba4ebefbb33d1933Dave Sparks
58b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi
598ba01021b573889802e67e029225a96f0dfa471aAndy McFaddensp<IGraphicBufferProducer> MediaRecorderClient::querySurfaceMediaSource()
60b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi{
613856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Query SurfaceMediaSource");
62b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    Mutex::Autolock lock(mLock);
63b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    if (mRecorder == NULL) {
6429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
65b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi        return NULL;
66b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    }
67b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    return mRecorder->querySurfaceMediaSource();
68b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi}
69b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi
70b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi
71b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi
724ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Listatus_t MediaRecorderClient::setCamera(const sp<ICamera>& camera,
734ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li                                        const sp<ICameraRecordingProxy>& proxy)
7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
753856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setCamera");
7689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mRecorder == NULL) {
7829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_INIT;
8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
814ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    return mRecorder->setCamera(camera, proxy);
8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
8499617adda9bc46c43f511f0940bc735c73de61deMathias Agopianstatus_t MediaRecorderClient::setPreviewSurface(const sp<IGraphicBufferProducer>& surface)
8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
863856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setPreviewSurface");
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
8889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mRecorder == NULL) {
8929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_INIT;
9189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mRecorder->setPreviewSurface(surface);
9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::setVideoSource(int vs)
9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
973856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setVideoSource(%d)", vs);
981cfe8ce28eafd5ff758adbb73bfb257503d7704bChong Zhang    // Check camera permission for sources other than SURFACE
991cfe8ce28eafd5ff758adbb73bfb257503d7704bChong Zhang    if (vs != VIDEO_SOURCE_SURFACE && !checkPermission(cameraPermission)) {
100d1d35e0359cc411b04615813ba4ebefbb33d1933Dave Sparks        return PERMISSION_DENIED;
101d1d35e0359cc411b04615813ba4ebefbb33d1933Dave Sparks    }
10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
103ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    if (mRecorder == NULL)     {
10429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
105dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang        return NO_INIT;
10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
10789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mRecorder->setVideoSource((video_source)vs);
10889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
10989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
11089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::setAudioSource(int as)
11189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
1123856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setAudioSource(%d)", as);
113510d6566bd2494991fac07aee46fcb2ddac99c13Dave Sparks    if (!checkPermission(recordAudioPermission)) {
114510d6566bd2494991fac07aee46fcb2ddac99c13Dave Sparks        return PERMISSION_DENIED;
115510d6566bd2494991fac07aee46fcb2ddac99c13Dave Sparks    }
11689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
11789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mRecorder == NULL)  {
11829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
119dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang        return NO_INIT;
12089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
121fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    return mRecorder->setAudioSource((audio_source_t)as);
12289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
12389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
12489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::setOutputFormat(int of)
12589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
1263856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setOutputFormat(%d)", of);
12789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
12889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mRecorder == NULL) {
12929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
13089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_INIT;
13189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
13289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mRecorder->setOutputFormat((output_format)of);
13389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
13489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
13589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::setVideoEncoder(int ve)
13689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
1373856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setVideoEncoder(%d)", ve);
13889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
13989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mRecorder == NULL) {
14029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
14189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_INIT;
14289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
14389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mRecorder->setVideoEncoder((video_encoder)ve);
14489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
14589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
14689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::setAudioEncoder(int ae)
14789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
1483856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setAudioEncoder(%d)", ae);
14989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
15089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mRecorder == NULL) {
15129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
15289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_INIT;
15389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
15489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mRecorder->setAudioEncoder((audio_encoder)ae);
15589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
15689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
15789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::setOutputFile(const char* path)
15889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
1593856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setOutputFile(%s)", path);
16089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
16189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mRecorder == NULL) {
16229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
16389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_INIT;
16489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
16589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mRecorder->setOutputFile(path);
16689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
16789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
16889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::setOutputFile(int fd, int64_t offset, int64_t length)
16989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
1703856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setOutputFile(%d, %lld, %lld)", fd, offset, length);
17189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
17289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mRecorder == NULL) {
17329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
17489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_INIT;
17589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
17689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mRecorder->setOutputFile(fd, offset, length);
17789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
17889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
17989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::setVideoSize(int width, int height)
18089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
1813856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setVideoSize(%dx%d)", width, height);
18289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
18389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mRecorder == NULL) {
18429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
18589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_INIT;
18689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
18789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mRecorder->setVideoSize(width, height);
18889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
18989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
19089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::setVideoFrameRate(int frames_per_second)
19189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
1923856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setVideoFrameRate(%d)", frames_per_second);
19389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
19489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mRecorder == NULL) {
19529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
19689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_INIT;
19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
19889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mRecorder->setVideoFrameRate(frames_per_second);
19989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
20089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
201c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Projectstatus_t MediaRecorderClient::setParameters(const String8& params) {
2023856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setParameters(%s)", params.string());
203c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    Mutex::Autolock lock(mLock);
204c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    if (mRecorder == NULL) {
20529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
206c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project        return NO_INIT;
207c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    }
208c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    return mRecorder->setParameters(params);
209c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project}
210c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project
21189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::prepare()
21289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
2133856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("prepare");
21489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
21589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mRecorder == NULL) {
21629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_INIT;
21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mRecorder->prepare();
22089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::getMaxAmplitude(int* max)
22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
2253856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("getMaxAmplitude");
22689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mRecorder == NULL) {
22829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_INIT;
23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mRecorder->getMaxAmplitude(max);
23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
23489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::start()
23589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
2363856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("start");
23789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
23889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mRecorder == NULL) {
23929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
24089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_INIT;
24189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
24289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mRecorder->start();
24389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
24589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
24689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::stop()
24789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
2483856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("stop");
24989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
25089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mRecorder == NULL) {
25129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
25289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_INIT;
25389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
25489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mRecorder->stop();
25589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
25689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
25789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::init()
25889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
2593856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("init");
26089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
26189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mRecorder == NULL) {
26229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
26389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_INIT;
26489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
26589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mRecorder->init();
26689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
26789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
26889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::close()
26989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
2703856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("close");
27189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
27289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mRecorder == NULL) {
27329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
27489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_INIT;
27589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mRecorder->close();
27789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
27889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
27989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::reset()
28189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
2823856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("reset");
28389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mRecorder == NULL) {
28529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
28689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_INIT;
28789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
28889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mRecorder->reset();
28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
29089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
29189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::release()
29289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
2933856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("release");
29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
29589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mRecorder != NULL) {
29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        delete mRecorder;
29789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mRecorder = NULL;
298dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang        wp<MediaRecorderClient> client(this);
299dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang        mMediaPlayerService->removeMediaRecorderClient(client);
30089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
30189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return NO_ERROR;
30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
30389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
304dac6a31a33ba53fb93850670cdddd1e6515dadceGloria WangMediaRecorderClient::MediaRecorderClient(const sp<MediaPlayerService>& service, pid_t pid)
30589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
3063856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Client constructor");
30789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mPid = pid;
30830d713a1c18a5ff892a7f13b2524ba624b70890aJames Dong    mRecorder = new StagefrightRecorder;
309dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang    mMediaPlayerService = service;
31089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
31189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
31289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectMediaRecorderClient::~MediaRecorderClient()
31389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
3143856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Client destructor");
31589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    release();
31689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
31789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
31837047fceba836f341d0108beed0991b0f8dfc543James Dongstatus_t MediaRecorderClient::setListener(const sp<IMediaRecorderClient>& listener)
31989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
3203856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setListener");
32189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
32289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mRecorder == NULL) {
32329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
32489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_INIT;
32589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
32689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mRecorder->setListener(listener);
32789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
32889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
329ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvalastatus_t MediaRecorderClient::setClientName(const String16& clientName) {
330ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    ALOGV("setClientName(%s)", String8(clientName).string());
331ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    Mutex::Autolock lock(mLock);
332ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    if (mRecorder == NULL) {
333ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala        ALOGE("recorder is not initialized");
334ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala        return NO_INIT;
335ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    }
336ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    return mRecorder->setClientName(clientName);
337ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala}
338ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala
339b914122eb9cb54bbeae4ec03bfebb194aecdccbdJames Dongstatus_t MediaRecorderClient::dump(int fd, const Vector<String16>& args) const {
340b914122eb9cb54bbeae4ec03bfebb194aecdccbdJames Dong    if (mRecorder != NULL) {
341b914122eb9cb54bbeae4ec03bfebb194aecdccbdJames Dong        return mRecorder->dump(fd, args);
342b914122eb9cb54bbeae4ec03bfebb194aecdccbdJames Dong    }
343b914122eb9cb54bbeae4ec03bfebb194aecdccbdJames Dong    return OK;
344b914122eb9cb54bbeae4ec03bfebb194aecdccbdJames Dong}
345b914122eb9cb54bbeae4ec03bfebb194aecdccbdJames Dong
34689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android
347