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