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