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