MediaRecorderClient.cpp revision 99617adda9bc46c43f511f0940bc735c73de61de
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); 98d1d35e0359cc411b04615813ba4ebefbb33d1933Dave Sparks if (!checkPermission(cameraPermission)) { 99d1d35e0359cc411b04615813ba4ebefbb33d1933Dave Sparks return PERMISSION_DENIED; 100d1d35e0359cc411b04615813ba4ebefbb33d1933Dave Sparks } 10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock lock(mLock); 102ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala if (mRecorder == NULL) { 10329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("recorder is not initialized"); 104dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang return NO_INIT; 10589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mRecorder->setVideoSource((video_source)vs); 10789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 10889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 10989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::setAudioSource(int as) 11089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 1113856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setAudioSource(%d)", as); 112510d6566bd2494991fac07aee46fcb2ddac99c13Dave Sparks if (!checkPermission(recordAudioPermission)) { 113510d6566bd2494991fac07aee46fcb2ddac99c13Dave Sparks return PERMISSION_DENIED; 114510d6566bd2494991fac07aee46fcb2ddac99c13Dave Sparks } 11589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock lock(mLock); 11689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mRecorder == NULL) { 11729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("recorder is not initialized"); 118dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang return NO_INIT; 11989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 120fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin return mRecorder->setAudioSource((audio_source_t)as); 12189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 12289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 12389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::setOutputFormat(int of) 12489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 1253856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setOutputFormat(%d)", of); 12689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock lock(mLock); 12789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mRecorder == NULL) { 12829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("recorder is not initialized"); 12989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_INIT; 13089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 13189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mRecorder->setOutputFormat((output_format)of); 13289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 13389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 13489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::setVideoEncoder(int ve) 13589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 1363856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setVideoEncoder(%d)", ve); 13789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock lock(mLock); 13889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mRecorder == NULL) { 13929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("recorder is not initialized"); 14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_INIT; 14189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 14289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mRecorder->setVideoEncoder((video_encoder)ve); 14389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 14489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 14589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::setAudioEncoder(int ae) 14689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 1473856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setAudioEncoder(%d)", ae); 14889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock lock(mLock); 14989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mRecorder == NULL) { 15029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("recorder is not initialized"); 15189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_INIT; 15289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 15389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mRecorder->setAudioEncoder((audio_encoder)ae); 15489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 15589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 15689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::setOutputFile(const char* path) 15789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 1583856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setOutputFile(%s)", path); 15989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock lock(mLock); 16089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mRecorder == NULL) { 16129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("recorder is not initialized"); 16289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_INIT; 16389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 16489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mRecorder->setOutputFile(path); 16589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 16689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 16789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::setOutputFile(int fd, int64_t offset, int64_t length) 16889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 1693856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setOutputFile(%d, %lld, %lld)", fd, offset, length); 17089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock lock(mLock); 17189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mRecorder == NULL) { 17229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("recorder is not initialized"); 17389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_INIT; 17489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 17589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mRecorder->setOutputFile(fd, offset, length); 17689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 17789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 17889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::setVideoSize(int width, int height) 17989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 1803856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setVideoSize(%dx%d)", width, height); 18189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock lock(mLock); 18289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mRecorder == NULL) { 18329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("recorder is not initialized"); 18489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_INIT; 18589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 18689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mRecorder->setVideoSize(width, height); 18789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 18889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 18989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::setVideoFrameRate(int frames_per_second) 19089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 1913856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setVideoFrameRate(%d)", frames_per_second); 19289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock lock(mLock); 19389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mRecorder == NULL) { 19429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("recorder is not initialized"); 19589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_INIT; 19689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mRecorder->setVideoFrameRate(frames_per_second); 19889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 19989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 200c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Projectstatus_t MediaRecorderClient::setParameters(const String8& params) { 2013856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setParameters(%s)", params.string()); 202c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project Mutex::Autolock lock(mLock); 203c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project if (mRecorder == NULL) { 20429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("recorder is not initialized"); 205c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project return NO_INIT; 206c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project } 207c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project return mRecorder->setParameters(params); 208c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project} 209c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project 21089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::prepare() 21189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 2123856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("prepare"); 21389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock lock(mLock); 21489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mRecorder == NULL) { 21529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("recorder is not initialized"); 21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_INIT; 21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mRecorder->prepare(); 21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 22089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::getMaxAmplitude(int* max) 22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 2243856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("getMaxAmplitude"); 22589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock lock(mLock); 22689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mRecorder == NULL) { 22729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("recorder is not initialized"); 22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_INIT; 22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mRecorder->getMaxAmplitude(max); 23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::start() 23489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 2353856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("start"); 23689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock lock(mLock); 23789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mRecorder == NULL) { 23829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("recorder is not initialized"); 23989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_INIT; 24089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 24189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mRecorder->start(); 24289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 24389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 24589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::stop() 24689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 2473856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("stop"); 24889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock lock(mLock); 24989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mRecorder == NULL) { 25029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("recorder is not initialized"); 25189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_INIT; 25289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 25389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mRecorder->stop(); 25489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 25589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 25689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::init() 25789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 2583856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("init"); 25989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock lock(mLock); 26089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mRecorder == NULL) { 26129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("recorder is not initialized"); 26289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_INIT; 26389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 26489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mRecorder->init(); 26589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 26689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 26789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::close() 26889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 2693856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("close"); 27089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock lock(mLock); 27189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mRecorder == NULL) { 27229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("recorder is not initialized"); 27389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_INIT; 27489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 27589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mRecorder->close(); 27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 27789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 27889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 27989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::reset() 28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 2813856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("reset"); 28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock lock(mLock); 28389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mRecorder == NULL) { 28429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("recorder is not initialized"); 28589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_INIT; 28689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 28789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mRecorder->reset(); 28889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 29089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorderClient::release() 29189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 2923856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("release"); 29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock lock(mLock); 29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mRecorder != NULL) { 29589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project delete mRecorder; 29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mRecorder = NULL; 297dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang wp<MediaRecorderClient> client(this); 298dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang mMediaPlayerService->removeMediaRecorderClient(client); 29989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 30089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 30189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 303dac6a31a33ba53fb93850670cdddd1e6515dadceGloria WangMediaRecorderClient::MediaRecorderClient(const sp<MediaPlayerService>& service, pid_t pid) 30489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 3053856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Client constructor"); 30689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mPid = pid; 30730d713a1c18a5ff892a7f13b2524ba624b70890aJames Dong mRecorder = new StagefrightRecorder; 308dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wang mMediaPlayerService = service; 30989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 31089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 31189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectMediaRecorderClient::~MediaRecorderClient() 31289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 3133856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Client destructor"); 31489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project release(); 31589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 31689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 31737047fceba836f341d0108beed0991b0f8dfc543James Dongstatus_t MediaRecorderClient::setListener(const sp<IMediaRecorderClient>& listener) 31889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 3193856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setListener"); 32089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock lock(mLock); 32189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mRecorder == NULL) { 32229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("recorder is not initialized"); 32389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_INIT; 32489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 32589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mRecorder->setListener(listener); 32689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 32789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 328ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvalastatus_t MediaRecorderClient::setClientName(const String16& clientName) { 329ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala ALOGV("setClientName(%s)", String8(clientName).string()); 330ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala Mutex::Autolock lock(mLock); 331ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala if (mRecorder == NULL) { 332ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala ALOGE("recorder is not initialized"); 333ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala return NO_INIT; 334ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala } 335ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala return mRecorder->setClientName(clientName); 336ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala} 337ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala 338b914122eb9cb54bbeae4ec03bfebb194aecdccbdJames Dongstatus_t MediaRecorderClient::dump(int fd, const Vector<String16>& args) const { 339b914122eb9cb54bbeae4ec03bfebb194aecdccbdJames Dong if (mRecorder != NULL) { 340b914122eb9cb54bbeae4ec03bfebb194aecdccbdJames Dong return mRecorder->dump(fd, args); 341b914122eb9cb54bbeae4ec03bfebb194aecdccbdJames Dong } 342b914122eb9cb54bbeae4ec03bfebb194aecdccbdJames Dong return OK; 343b914122eb9cb54bbeae4ec03bfebb194aecdccbdJames Dong} 344b914122eb9cb54bbeae4ec03bfebb194aecdccbdJames Dong 34589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android 346