mediarecorder.cpp revision 7b5eb023f8d87cca6d830ae6c11c6aadbe02aca8
172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen/* 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ** 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ** Copyright (c) 2008 The Android Open Source Project 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ** 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ** Licensed under the Apache License, Version 2.0 (the "License"); 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ** you may not use this file except in compliance with the License. 7dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ** You may obtain a copy of the License at 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ** 9dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ** http://www.apache.org/licenses/LICENSE-2.0 10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ** 11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ** Unless required by applicable law or agreed to in writing, software 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ** distributed under the License is distributed on an "AS IS" BASIS, 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ** See the License for the specific language governing permissions and 15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ** limitations under the License. 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch */ 17513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//#define LOG_NDEBUG 0 19dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#define LOG_TAG "MediaRecorder" 203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include <utils/Log.h> 21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <ui/Surface.h> 22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <media/mediarecorder.h> 23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <utils/IServiceManager.h> 24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <media/IMediaPlayerService.h> 25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include <media/IMediaRecorder.h> 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace android { 28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstatus_t MediaRecorder::setCamera(const sp<ICamera>& camera) 30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen{ 31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGV("setCamera(%p)", camera.get()); 32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if(mMediaRecorder == NULL) { 33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGE("media recorder is not initialized yet"); 34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return INVALID_OPERATION; 35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!(mCurrentState & MEDIA_RECORDER_IDLE)) { 37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGE("setCamera called in an invalid state(%d)", mCurrentState); 38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return INVALID_OPERATION; 39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen status_t ret = mMediaRecorder->setCamera(camera); 42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (OK != ret) { 43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGV("setCamera failed: %d", ret); 44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mCurrentState = MEDIA_RECORDER_ERROR; 45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return UNKNOWN_ERROR; 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return ret; 48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstatus_t MediaRecorder::setPreviewSurface(const sp<Surface>& surface) 51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen{ 52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGV("setPreviewSurface(%p)", surface.get()); 53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if(mMediaRecorder == NULL) { 54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGE("media recorder is not initialized yet"); 55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return INVALID_OPERATION; 56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) { 58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGE("setPreviewSurface called in an invalid state(%d)", mCurrentState); 59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return INVALID_OPERATION; 60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen status_t ret = mMediaRecorder->setPreviewSurface(surface->getISurface()); 63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (OK != ret) { 64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGV("setPreviewSurface failed: %d", ret); 65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mCurrentState = MEDIA_RECORDER_ERROR; 66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return UNKNOWN_ERROR; 67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return ret; 69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstatus_t MediaRecorder::init() 72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen{ 73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGV("init"); 74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if(mMediaRecorder == NULL) { 75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGE("media recorder is not initialized yet"); 76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return INVALID_OPERATION; 77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!(mCurrentState & MEDIA_RECORDER_IDLE)) { 79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGE("init called in an invalid state(%d)", mCurrentState); 80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return INVALID_OPERATION; 81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen status_t ret = mMediaRecorder->init(); 84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (OK != ret) { 85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGV("init failed: %d", ret); 86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mCurrentState = MEDIA_RECORDER_ERROR; 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return UNKNOWN_ERROR; 88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 89dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen mCurrentState = MEDIA_RECORDER_INITIALIZED; 90dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return ret; 91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatus_t MediaRecorder::setVideoSource(int vs) 94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen{ 95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGV("setVideoSource(%d)", vs); 96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if(mMediaRecorder == NULL) { 97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGE("media recorder is not initialized yet"); 98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return INVALID_OPERATION; 99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (mIsVideoSourceSet) { 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOGE("video source has already been set"); 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return INVALID_OPERATION; 103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (mCurrentState & MEDIA_RECORDER_IDLE) { 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOGV("Call init() since the media recorder is not initialized yet"); 106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen status_t ret = init(); 107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (OK != ret) { 108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return ret; 109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!(mCurrentState & MEDIA_RECORDER_INITIALIZED)) { 112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGE("setVideoSource called in an invalid state(%d)", mCurrentState); 113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return INVALID_OPERATION; 114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen status_t ret = mMediaRecorder->setVideoSource(vs); 117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (OK != ret) { 118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGV("setVideoSource failed: %d", ret); 119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mCurrentState = MEDIA_RECORDER_ERROR; 120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return UNKNOWN_ERROR; 121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch mIsVideoSourceSet = true; 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return ret; 124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstatus_t MediaRecorder::setAudioSource(int as) 127dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen{ 128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGV("setAudioSource(%d)", as); 129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if(mMediaRecorder == NULL) { 130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGE("media recorder is not initialized yet"); 131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return INVALID_OPERATION; 132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (mCurrentState & MEDIA_RECORDER_IDLE) { 134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGV("Call init() since the media recorder is not initialized yet"); 135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen status_t ret = init(); 136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (OK != ret) { 137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return ret; 138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (mIsAudioSourceSet) { 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOGE("audio source has already been set"); 142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return INVALID_OPERATION; 143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!(mCurrentState & MEDIA_RECORDER_INITIALIZED)) { 145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGE("setAudioSource called in an invalid state(%d)", mCurrentState); 146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return INVALID_OPERATION; 147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen status_t ret = mMediaRecorder->setAudioSource(as); 150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (OK != ret) { 151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGV("setAudioSource failed: %d", ret); 152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mCurrentState = MEDIA_RECORDER_ERROR; 153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return UNKNOWN_ERROR; 154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mIsAudioSourceSet = true; 156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return ret; 157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstatus_t MediaRecorder::setOutputFormat(int of) 160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen{ 161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGV("setOutputFormat(%d)", of); 162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if(mMediaRecorder == NULL) { 163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGE("media recorder is not initialized yet"); 164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return INVALID_OPERATION; 165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!(mCurrentState & MEDIA_RECORDER_INITIALIZED)) { 167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGE("setOutputFormat called in an invalid state: %d", mCurrentState); 168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return INVALID_OPERATION; 169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen status_t ret = mMediaRecorder->setOutputFormat(of); 172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (OK != ret) { 173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGE("setOutputFormat failed: %d", ret); 174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mCurrentState = MEDIA_RECORDER_ERROR; 175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return UNKNOWN_ERROR; 176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mCurrentState = MEDIA_RECORDER_DATASOURCE_CONFIGURED; 178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return ret; 179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstatus_t MediaRecorder::setVideoEncoder(int ve) 182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen{ 183ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGV("setVideoEncoder(%d)", ve); 184ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if(mMediaRecorder == NULL) { 185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGE("media recorder is not initialized yet"); 186ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return INVALID_OPERATION; 187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (mIsVideoEncoderSet) { 189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGE("video encoder has already been set"); 190ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return INVALID_OPERATION; 191ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) { 193ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGE("setVideoEncoder called in an invalid state(%d)", mCurrentState); 194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return INVALID_OPERATION; 195ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch status_t ret = mMediaRecorder->setVideoEncoder(ve); 198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (OK != ret) { 199dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen LOGV("setVideoEncoder failed: %d", ret); 200dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen mCurrentState = MEDIA_RECORDER_ERROR; 201dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return UNKNOWN_ERROR; 202dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 203dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen mIsVideoEncoderSet = true; 204dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return ret; 205dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 206dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 207dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstatus_t MediaRecorder::setAudioEncoder(int ae) 208dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen{ 209dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen LOGV("setAudioEncoder(%d)", ae); 210dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if(mMediaRecorder == NULL) { 211dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen LOGE("media recorder is not initialized yet"); 212dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return INVALID_OPERATION; 213dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 214dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (mIsAudioEncoderSet) { 215dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen LOGE("audio encoder has already been set"); 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return INVALID_OPERATION; 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) { 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOGE("setAudioEncoder called in an invalid state(%d)", mCurrentState); 220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return INVALID_OPERATION; 221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen status_t ret = mMediaRecorder->setAudioEncoder(ae); 224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (OK != ret) { 225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGV("setAudioEncoder failed: %d", ret); 226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mCurrentState = MEDIA_RECORDER_ERROR; 227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return UNKNOWN_ERROR; 228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mIsAudioEncoderSet = true; 230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return ret; 231ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 232ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 233ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstatus_t MediaRecorder::setOutputFile(const char* path) 234ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen{ 235ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGV("setOutputFile(%s)", path); 236ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if(mMediaRecorder == NULL) { 237ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGE("media recorder is not initialized yet"); 238ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return INVALID_OPERATION; 239ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 240ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (mIsOutputFileSet) { 241ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGE("output file has already been set"); 242ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return INVALID_OPERATION; 243ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 244ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) { 245ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGE("setOutputFile called in an invalid state(%d)", mCurrentState); 246ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return INVALID_OPERATION; 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 249dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen status_t ret = mMediaRecorder->setOutputFile(path); 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (OK != ret) { 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOGV("setAudioEncoder failed: %d", ret); 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch mCurrentState = MEDIA_RECORDER_ERROR; 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return UNKNOWN_ERROR; 254ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 255ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mIsOutputFileSet = true; 256dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return ret; 257dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 258ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 259ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstatus_t MediaRecorder::setVideoSize(int width, int height) 260ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen{ 261dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen LOGV("setVideoSize(%d, %d)", width, height); 262dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if(mMediaRecorder == NULL) { 263ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGE("media recorder is not initialized yet"); 264ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return INVALID_OPERATION; 265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 266ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) { 267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGE("setVideoSize called in an invalid state: %d", mCurrentState); 268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return INVALID_OPERATION; 269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 270dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen status_t ret = mMediaRecorder->setVideoSize(width, height); 272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (OK != ret) { 273dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen LOGE("setVideoSize failed: %d", ret); 274dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen mCurrentState = MEDIA_RECORDER_ERROR; 275dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return UNKNOWN_ERROR; 276dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 277dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return ret; 278dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 279dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 280dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstatus_t MediaRecorder::setVideoFrameRate(int frames_per_second) 281dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen{ 282dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen LOGV("setVideoFrameRate(%d)", frames_per_second); 283dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if(mMediaRecorder == NULL) { 284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOGE("media recorder is not initialized yet"); 285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return INVALID_OPERATION; 286ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 287dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) { 288dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen LOGE("setVideoFrameRate called in an invalid state: %d", mCurrentState); 289dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return INVALID_OPERATION; 290dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 291ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch status_t ret = mMediaRecorder->setVideoFrameRate(frames_per_second); 293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (OK != ret) { 294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOGE("setVideoFrameRate failed: %d", ret); 295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch mCurrentState = MEDIA_RECORDER_ERROR; 296dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return UNKNOWN_ERROR; 297ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 298dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return ret; 299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatus_t MediaRecorder::prepare() 302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch{ 303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOGV("prepare"); 304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if(mMediaRecorder == NULL) { 305dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen LOGE("media recorder is not initialized yet"); 306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return INVALID_OPERATION; 307ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 308dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) { 309dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen LOGE("setVideoFrameRate called in an invalid state: %d", mCurrentState); 310dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return INVALID_OPERATION; 311dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 312dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 313dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen status_t ret = mMediaRecorder->prepare(); 314dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (OK != ret) { 315dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen LOGE("prepare failed: %d", ret); 316dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen mCurrentState = MEDIA_RECORDER_ERROR; 317ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return UNKNOWN_ERROR; 318ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 319ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mCurrentState = MEDIA_RECORDER_PREPARED; 320ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return ret; 321dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 322dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 323dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstatus_t MediaRecorder::getMaxAmplitude(int* max) 324dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen{ 325dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen LOGV("getMaxAmplitude"); 326dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if(mMediaRecorder == NULL) { 327ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGE("media recorder is not initialized yet"); 328dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return INVALID_OPERATION; 329dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 330dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (mCurrentState & MEDIA_RECORDER_ERROR) { 331dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen LOGE("setVideoFrameRate called in an invalid state: %d", mCurrentState); 332dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return INVALID_OPERATION; 333dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 334dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 335dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen status_t ret = mMediaRecorder->getMaxAmplitude(max); 336dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (OK != ret) { 337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOGE("getMaxAmplitude failed: %d", ret); 338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch mCurrentState = MEDIA_RECORDER_ERROR; 339dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return UNKNOWN_ERROR; 340dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 341ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return ret; 342ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 343ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 344ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstatus_t MediaRecorder::start() 345ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen{ 346ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGV("start"); 347ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (mMediaRecorder == NULL) { 348ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGE("media recorder is not initialized yet"); 349ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return INVALID_OPERATION; 350dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 351dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (!(mCurrentState & MEDIA_RECORDER_PREPARED)) { 352dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen LOGE("start called in an invalid state: %d", mCurrentState); 353dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return INVALID_OPERATION; 354dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 355dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 356dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen status_t ret = mMediaRecorder->start(); 357dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (OK != ret) { 358dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen LOGE("start failed: %d", ret); 359dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen mCurrentState = MEDIA_RECORDER_ERROR; 3603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return UNKNOWN_ERROR; 3613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 3623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick mCurrentState = MEDIA_RECORDER_RECORDING; 363dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return ret; 3643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 3653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 366dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstatus_t MediaRecorder::stop() 367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch{ 368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOGV("stop"); 369dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (mMediaRecorder == NULL) { 370dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen LOGE("media recorder is not initialized yet"); 371513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return INVALID_OPERATION; 372513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 373513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch if (!(mCurrentState & MEDIA_RECORDER_RECORDING)) { 374513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch LOGE("stop called in an invalid state: %d", mCurrentState); 375513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return INVALID_OPERATION; 376ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 377dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 378dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen status_t ret = mMediaRecorder->stop(); 379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (OK != ret) { 380ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOGE("stop failed: %d", ret); 381ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mCurrentState = MEDIA_RECORDER_ERROR; 382ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return UNKNOWN_ERROR; 383ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 384ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mCurrentState = MEDIA_RECORDER_IDLE; 385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return ret; 386} 387 388// Reset should be OK in any state 389status_t MediaRecorder::reset() 390{ 391 LOGV("reset"); 392 if (mMediaRecorder == NULL) { 393 LOGE("media recorder is not initialized yet"); 394 return INVALID_OPERATION; 395 } 396 397 doCleanUp(); 398 status_t ret = UNKNOWN_ERROR; 399 switch(mCurrentState) { 400 case MEDIA_RECORDER_IDLE: 401 ret = OK; 402 break; 403 404 case MEDIA_RECORDER_RECORDING: 405 case MEDIA_RECORDER_DATASOURCE_CONFIGURED: 406 case MEDIA_RECORDER_PREPARED: 407 case MEDIA_RECORDER_ERROR: { 408 ret = doReset(); 409 if (OK != ret) { 410 return ret; // No need to continue 411 } 412 } // Intentional fall through 413 case MEDIA_RECORDER_INITIALIZED: 414 ret = close(); 415 break; 416 417 default: { 418 LOGE("Unexpected non-existing state: %d", mCurrentState); 419 break; 420 } 421 } 422 return ret; 423} 424 425status_t MediaRecorder::close() 426{ 427 LOGV("close"); 428 if (!(mCurrentState & MEDIA_RECORDER_INITIALIZED)) { 429 LOGE("close called in an invalid state: %d", mCurrentState); 430 return INVALID_OPERATION; 431 } 432 status_t ret = mMediaRecorder->close(); 433 if (OK != ret) { 434 LOGE("close failed: %d", ret); 435 mCurrentState = MEDIA_RECORDER_ERROR; 436 return UNKNOWN_ERROR; 437 } else { 438 mCurrentState = MEDIA_RECORDER_IDLE; 439 } 440 return ret; 441} 442 443status_t MediaRecorder::doReset() 444{ 445 LOGV("doReset"); 446 status_t ret = mMediaRecorder->reset(); 447 if (OK != ret) { 448 LOGE("doReset failed: %d", ret); 449 mCurrentState = MEDIA_RECORDER_ERROR; 450 return UNKNOWN_ERROR; 451 } else { 452 mCurrentState = MEDIA_RECORDER_INITIALIZED; 453 } 454 return ret; 455} 456 457void MediaRecorder::doCleanUp() 458{ 459 LOGV("doCleanUp"); 460 mIsAudioSourceSet = false; 461 mIsVideoSourceSet = false; 462 mIsAudioEncoderSet = false; 463 mIsVideoEncoderSet = false; 464 mIsOutputFileSet = false; 465} 466 467// Release should be OK in any state 468status_t MediaRecorder::release() 469{ 470 LOGV("release"); 471 if (mMediaRecorder != NULL) { 472 return mMediaRecorder->release(); 473 } 474 return INVALID_OPERATION; 475} 476 477MediaRecorder::MediaRecorder() 478{ 479 LOGV("constructor"); 480 sp<IServiceManager> sm = defaultServiceManager(); 481 sp<IBinder> binder; 482 483 do { 484 binder = sm->getService(String16("media.player")); 485 if (binder != NULL) { 486 break; 487 } 488 LOGW("MediaPlayerService not published, waiting..."); 489 usleep(500000); // 0.5 s 490 } while(true); 491 492 sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(binder); 493 if (service != NULL) { 494 mMediaRecorder = service->createMediaRecorder(getpid()); 495 } 496 497 mMediaRecorder = service->createMediaRecorder(getpid()); 498 if (mMediaRecorder != NULL) { 499 mCurrentState = MEDIA_RECORDER_IDLE; 500 } 501 doCleanUp(); 502} 503 504status_t MediaRecorder::initCheck() 505{ 506 return mMediaRecorder != 0 ? NO_ERROR : NO_INIT; 507} 508 509MediaRecorder::~MediaRecorder() 510{ 511 LOGV("destructor"); 512 if (mMediaRecorder != NULL) { 513 mMediaRecorder.clear(); 514 } 515} 516 517}; // namespace android 518 519