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    if (getpid() == IPCThreadState::self()->getCallingPid()) return true;
50d1d35e0359cc411b04615813ba4ebefbb33d1933Dave Sparks    bool ok = checkCallingPermission(String16(permissionString));
5129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block    if (!ok) ALOGE("Request requires %s", permissionString);
52d1d35e0359cc411b04615813ba4ebefbb33d1933Dave Sparks    return ok;
53d1d35e0359cc411b04615813ba4ebefbb33d1933Dave Sparks}
54d1d35e0359cc411b04615813ba4ebefbb33d1933Dave Sparks
558f469e18c307cb9dc0d16ed9225972aa8be4516fChong Zhangstatus_t MediaRecorderClient::setInputSurface(const sp<IGraphicBufferConsumer>& surface)
56e2a2dfcbf0c9d6bb7139263ecf0d8e53b4ca1049Chong Zhang{
578f469e18c307cb9dc0d16ed9225972aa8be4516fChong Zhang    ALOGV("setInputSurface");
58e2a2dfcbf0c9d6bb7139263ecf0d8e53b4ca1049Chong Zhang    Mutex::Autolock lock(mLock);
59e2a2dfcbf0c9d6bb7139263ecf0d8e53b4ca1049Chong Zhang    if (mRecorder == NULL) {
60e2a2dfcbf0c9d6bb7139263ecf0d8e53b4ca1049Chong Zhang        ALOGE("recorder is not initialized");
61e2a2dfcbf0c9d6bb7139263ecf0d8e53b4ca1049Chong Zhang        return NO_INIT;
62e2a2dfcbf0c9d6bb7139263ecf0d8e53b4ca1049Chong Zhang    }
638f469e18c307cb9dc0d16ed9225972aa8be4516fChong Zhang    return mRecorder->setInputSurface(surface);
64e2a2dfcbf0c9d6bb7139263ecf0d8e53b4ca1049Chong Zhang}
65b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi
668ba01021b573889802e67e029225a96f0dfa471aAndy McFaddensp<IGraphicBufferProducer> MediaRecorderClient::querySurfaceMediaSource()
67b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi{
683856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Query SurfaceMediaSource");
69b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    Mutex::Autolock lock(mLock);
70b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    if (mRecorder == NULL) {
7129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
72b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi        return NULL;
73b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    }
74b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    return mRecorder->querySurfaceMediaSource();
75b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi}
76b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi
77b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi
78b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi
79d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvalastatus_t MediaRecorderClient::setCamera(const sp<hardware::ICamera>& camera,
804ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li                                        const sp<ICameraRecordingProxy>& proxy)
8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
823856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setCamera");
8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mRecorder == NULL) {
8529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_INIT;
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
884ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    return mRecorder->setCamera(camera, proxy);
8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
9199617adda9bc46c43f511f0940bc735c73de61deMathias Agopianstatus_t MediaRecorderClient::setPreviewSurface(const sp<IGraphicBufferProducer>& surface)
9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
933856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setPreviewSurface");
9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mRecorder == NULL) {
9629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_INIT;
9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mRecorder->setPreviewSurface(surface);
10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::setVideoSource(int vs)
10389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
1043856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setVideoSource(%d)", vs);
1051cfe8ce28eafd5ff758adbb73bfb257503d7704bChong Zhang    // Check camera permission for sources other than SURFACE
1061cfe8ce28eafd5ff758adbb73bfb257503d7704bChong Zhang    if (vs != VIDEO_SOURCE_SURFACE && !checkPermission(cameraPermission)) {
107d1d35e0359cc411b04615813ba4ebefbb33d1933Dave Sparks        return PERMISSION_DENIED;
108d1d35e0359cc411b04615813ba4ebefbb33d1933Dave Sparks    }
10989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
110ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    if (mRecorder == NULL)     {
11129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
112dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang        return NO_INIT;
11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
11489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mRecorder->setVideoSource((video_source)vs);
11589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
11689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
11789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::setAudioSource(int as)
11889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
1193856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setAudioSource(%d)", as);
120510d6566bd2494991fac07aee46fcb2ddac99c13Dave Sparks    if (!checkPermission(recordAudioPermission)) {
121510d6566bd2494991fac07aee46fcb2ddac99c13Dave Sparks        return PERMISSION_DENIED;
122510d6566bd2494991fac07aee46fcb2ddac99c13Dave Sparks    }
12389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
12489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mRecorder == NULL)  {
12529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
126dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang        return NO_INIT;
12789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
128fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    return mRecorder->setAudioSource((audio_source_t)as);
12989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
13089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
13189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::setOutputFormat(int of)
13289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
1333856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setOutputFormat(%d)", of);
13489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
13589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mRecorder == NULL) {
13629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
13789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_INIT;
13889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
13989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mRecorder->setOutputFormat((output_format)of);
14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
14189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
14289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::setVideoEncoder(int ve)
14389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
1443856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setVideoEncoder(%d)", ve);
14589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
14689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mRecorder == NULL) {
14729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
14889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_INIT;
14989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
15089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mRecorder->setVideoEncoder((video_encoder)ve);
15189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
15289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
15389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::setAudioEncoder(int ae)
15489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
1553856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setAudioEncoder(%d)", ae);
15689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
15789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mRecorder == NULL) {
15829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
15989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_INIT;
16089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
16189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mRecorder->setAudioEncoder((audio_encoder)ae);
16289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
16389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
16489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::setOutputFile(int fd, int64_t offset, int64_t length)
16589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
166833b47505c513cb5c8f22aa922a7ea20d153b319Andy Hung    ALOGV("setOutputFile(%d, %lld, %lld)", fd, (long long)offset, (long long)length);
16789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
16889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mRecorder == NULL) {
16929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
17089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_INIT;
17189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
17289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mRecorder->setOutputFile(fd, offset, length);
17389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
17489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
17589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::setVideoSize(int width, int height)
17689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
1773856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setVideoSize(%dx%d)", width, height);
17889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
17989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mRecorder == NULL) {
18029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
18189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_INIT;
18289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
18389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mRecorder->setVideoSize(width, height);
18489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
18589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
18689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::setVideoFrameRate(int frames_per_second)
18789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
1883856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setVideoFrameRate(%d)", frames_per_second);
18989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
19089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mRecorder == NULL) {
19129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
19289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_INIT;
19389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
19489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mRecorder->setVideoFrameRate(frames_per_second);
19589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
19689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
197c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Projectstatus_t MediaRecorderClient::setParameters(const String8& params) {
1983856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setParameters(%s)", params.string());
199c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    Mutex::Autolock lock(mLock);
200c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    if (mRecorder == NULL) {
20129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
202c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project        return NO_INIT;
203c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    }
204c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    return mRecorder->setParameters(params);
205c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project}
206c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project
20789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::prepare()
20889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
2093856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("prepare");
21089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
21189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mRecorder == NULL) {
21229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
21389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_INIT;
21489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
21589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mRecorder->prepare();
21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::getMaxAmplitude(int* max)
22089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
2213856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("getMaxAmplitude");
22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mRecorder == NULL) {
22429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
22589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_INIT;
22689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mRecorder->getMaxAmplitude(max);
22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::start()
23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
2323856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("start");
23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
23489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mRecorder == NULL) {
23529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
23689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_INIT;
23789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
23889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mRecorder->start();
23989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
24089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
24189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
24289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::stop()
24389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
2443856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("stop");
24589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
24689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mRecorder == NULL) {
24729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
24889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_INIT;
24989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
25089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mRecorder->stop();
25189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
25289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
253d008275796ac4cccf85fefce53cef733a49bc1faWonsik Kimstatus_t MediaRecorderClient::pause()
254d008275796ac4cccf85fefce53cef733a49bc1faWonsik Kim{
255d008275796ac4cccf85fefce53cef733a49bc1faWonsik Kim    ALOGV("pause");
256d008275796ac4cccf85fefce53cef733a49bc1faWonsik Kim    Mutex::Autolock lock(mLock);
257d008275796ac4cccf85fefce53cef733a49bc1faWonsik Kim    if (mRecorder == NULL) {
258d008275796ac4cccf85fefce53cef733a49bc1faWonsik Kim        ALOGE("recorder is not initialized");
259d008275796ac4cccf85fefce53cef733a49bc1faWonsik Kim        return NO_INIT;
260d008275796ac4cccf85fefce53cef733a49bc1faWonsik Kim    }
261d008275796ac4cccf85fefce53cef733a49bc1faWonsik Kim    return mRecorder->pause();
262d008275796ac4cccf85fefce53cef733a49bc1faWonsik Kim
263d008275796ac4cccf85fefce53cef733a49bc1faWonsik Kim}
264d008275796ac4cccf85fefce53cef733a49bc1faWonsik Kim
265d008275796ac4cccf85fefce53cef733a49bc1faWonsik Kimstatus_t MediaRecorderClient::resume()
266d008275796ac4cccf85fefce53cef733a49bc1faWonsik Kim{
267d008275796ac4cccf85fefce53cef733a49bc1faWonsik Kim    ALOGV("resume");
268d008275796ac4cccf85fefce53cef733a49bc1faWonsik Kim    Mutex::Autolock lock(mLock);
269d008275796ac4cccf85fefce53cef733a49bc1faWonsik Kim    if (mRecorder == NULL) {
270d008275796ac4cccf85fefce53cef733a49bc1faWonsik Kim        ALOGE("recorder is not initialized");
271d008275796ac4cccf85fefce53cef733a49bc1faWonsik Kim        return NO_INIT;
272d008275796ac4cccf85fefce53cef733a49bc1faWonsik Kim    }
273d008275796ac4cccf85fefce53cef733a49bc1faWonsik Kim    return mRecorder->resume();
274d008275796ac4cccf85fefce53cef733a49bc1faWonsik Kim}
275d008275796ac4cccf85fefce53cef733a49bc1faWonsik Kim
27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::init()
27789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
2783856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("init");
27989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mRecorder == NULL) {
28129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_INIT;
28389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mRecorder->init();
28589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
28689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
28789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::close()
28889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
2893856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("close");
29089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
29189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mRecorder == NULL) {
29229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_INIT;
29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
29589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mRecorder->close();
29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
29789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
29989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::reset()
30089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
3013856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("reset");
30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
30389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mRecorder == NULL) {
30429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
30589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_INIT;
30689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
30789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mRecorder->reset();
30889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
30989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
31089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::release()
31189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
3123856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("release");
31389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
31489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mRecorder != NULL) {
31589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        delete mRecorder;
31689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mRecorder = NULL;
317dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang        wp<MediaRecorderClient> client(this);
318dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang        mMediaPlayerService->removeMediaRecorderClient(client);
31989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
32089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return NO_ERROR;
32189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
32289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
323be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet GanovMediaRecorderClient::MediaRecorderClient(const sp<MediaPlayerService>& service, pid_t pid,
324be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov        const String16& opPackageName)
32589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
3263856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Client constructor");
32789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mPid = pid;
328be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov    mRecorder = new StagefrightRecorder(opPackageName);
329dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang    mMediaPlayerService = service;
33089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
33189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
33289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectMediaRecorderClient::~MediaRecorderClient()
33389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
3343856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Client destructor");
33589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    release();
33689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
33789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3386dc3a3e2292454f94c015da45f1ebfc6a493e736Marco NelissenMediaRecorderClient::ServiceDeathNotifier::ServiceDeathNotifier(
3396dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen        const sp<IBinder>& service,
3406dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen        const sp<IMediaRecorderClient>& listener,
3416dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen        int which) {
3426dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen    mService = service;
3436dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen    mListener = listener;
3446dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen    mWhich = which;
3456dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen}
3466dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen
3476dc3a3e2292454f94c015da45f1ebfc6a493e736Marco NelissenMediaRecorderClient::ServiceDeathNotifier::~ServiceDeathNotifier() {
3486dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen    mService->unlinkToDeath(this);
3496dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen}
3506dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen
3516dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissenvoid  MediaRecorderClient::ServiceDeathNotifier::binderDied(const wp<IBinder>& /*who*/) {
3526dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen    sp<IMediaRecorderClient> listener = mListener.promote();
3536dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen    if (listener != NULL) {
3546dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen        listener->notify(MEDIA_ERROR, MEDIA_ERROR_SERVER_DIED, mWhich);
3556dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen    } else {
3566dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen        ALOGW("listener for process %d death is gone", mWhich);
3576dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen    }
3586dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen}
3596dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen
36037047fceba836f341d0108beed0991b0f8dfc543James Dongstatus_t MediaRecorderClient::setListener(const sp<IMediaRecorderClient>& listener)
36189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
3623856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setListener");
36389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock lock(mLock);
36489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mRecorder == NULL) {
36529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("recorder is not initialized");
36689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_INIT;
36789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
3686dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen    mRecorder->setListener(listener);
3696dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen
3706dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen    sp<IServiceManager> sm = defaultServiceManager();
3716dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen    sp<IBinder> binder = sm->getService(String16("media.camera"));
3726dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen    mCameraDeathListener = new ServiceDeathNotifier(binder, listener,
3736dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen            MediaPlayerService::CAMERA_PROCESS_DEATH);
3746dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen    binder->linkToDeath(mCameraDeathListener);
3756dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen
3766dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen    binder = sm->getService(String16("media.codec"));
3776dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen    mCodecDeathListener = new ServiceDeathNotifier(binder, listener,
3786dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen            MediaPlayerService::MEDIACODEC_PROCESS_DEATH);
3796dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen    binder->linkToDeath(mCodecDeathListener);
3806dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen
3816dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen    return OK;
38289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
38389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
384ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvalastatus_t MediaRecorderClient::setClientName(const String16& clientName) {
385ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    ALOGV("setClientName(%s)", String8(clientName).string());
386ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    Mutex::Autolock lock(mLock);
387ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    if (mRecorder == NULL) {
388ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala        ALOGE("recorder is not initialized");
389ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala        return NO_INIT;
390ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    }
391ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    return mRecorder->setClientName(clientName);
392ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala}
393ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala
3946d339f1f764bbd32e3381dae7bfa7c6c575bb493Lajos Molnarstatus_t MediaRecorderClient::dump(int fd, const Vector<String16>& args) {
395b914122eb9cb54bbeae4ec03bfebb194aecdccbdJames Dong    if (mRecorder != NULL) {
396b914122eb9cb54bbeae4ec03bfebb194aecdccbdJames Dong        return mRecorder->dump(fd, args);
397b914122eb9cb54bbeae4ec03bfebb194aecdccbdJames Dong    }
398b914122eb9cb54bbeae4ec03bfebb194aecdccbdJames Dong    return OK;
399b914122eb9cb54bbeae4ec03bfebb194aecdccbdJames Dong}
400b914122eb9cb54bbeae4ec03bfebb194aecdccbdJames Dong
40189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android
402