• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  **
3  ** Copyright (c) 2008 The Android Open Source Project
4  **
5  ** Licensed under the Apache License, Version 2.0 (the "License");
6  ** you may not use this file except in compliance with the License.
7  ** You may obtain a copy of the License at
8  **
9  **     http://www.apache.org/licenses/LICENSE-2.0
10  **
11  ** Unless required by applicable law or agreed to in writing, software
12  ** distributed under the License is distributed on an "AS IS" BASIS,
13  ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  ** See the License for the specific language governing permissions and
15  ** limitations under the License.
16  */
17 
18 //#define LOG_NDEBUG 0
19 #define LOG_TAG "MediaRecorder"
20 
21 #include <inttypes.h>
22 
23 #include <utils/Log.h>
24 #include <media/mediarecorder.h>
25 #include <binder/IServiceManager.h>
26 #include <utils/String8.h>
27 #include <media/IMediaPlayerService.h>
28 #include <media/IMediaRecorder.h>
29 #include <media/mediaplayer.h>  // for MEDIA_ERROR_SERVER_DIED
30 #include <media/stagefright/PersistentSurface.h>
31 #include <gui/IGraphicBufferProducer.h>
32 
33 namespace android {
34 
setCamera(const sp<ICamera> & camera,const sp<ICameraRecordingProxy> & proxy)35 status_t MediaRecorder::setCamera(const sp<ICamera>& camera, const sp<ICameraRecordingProxy>& proxy)
36 {
37     ALOGV("setCamera(%p,%p)", camera.get(), proxy.get());
38     if (mMediaRecorder == NULL) {
39         ALOGE("media recorder is not initialized yet");
40         return INVALID_OPERATION;
41     }
42     if (!(mCurrentState & MEDIA_RECORDER_IDLE)) {
43         ALOGE("setCamera called in an invalid state(%d)", mCurrentState);
44         return INVALID_OPERATION;
45     }
46 
47     status_t ret = mMediaRecorder->setCamera(camera, proxy);
48     if (OK != ret) {
49         ALOGV("setCamera failed: %d", ret);
50         mCurrentState = MEDIA_RECORDER_ERROR;
51         return ret;
52     }
53     return ret;
54 }
55 
setPreviewSurface(const sp<IGraphicBufferProducer> & surface)56 status_t MediaRecorder::setPreviewSurface(const sp<IGraphicBufferProducer>& surface)
57 {
58     ALOGV("setPreviewSurface(%p)", surface.get());
59     if (mMediaRecorder == NULL) {
60         ALOGE("media recorder is not initialized yet");
61         return INVALID_OPERATION;
62     }
63     if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
64         ALOGE("setPreviewSurface called in an invalid state(%d)", mCurrentState);
65         return INVALID_OPERATION;
66     }
67     if (!mIsVideoSourceSet) {
68         ALOGE("try to set preview surface without setting the video source first");
69         return INVALID_OPERATION;
70     }
71 
72     status_t ret = mMediaRecorder->setPreviewSurface(surface);
73     if (OK != ret) {
74         ALOGV("setPreviewSurface failed: %d", ret);
75         mCurrentState = MEDIA_RECORDER_ERROR;
76         return ret;
77     }
78     return ret;
79 }
80 
init()81 status_t MediaRecorder::init()
82 {
83     ALOGV("init");
84     if (mMediaRecorder == NULL) {
85         ALOGE("media recorder is not initialized yet");
86         return INVALID_OPERATION;
87     }
88     if (!(mCurrentState & MEDIA_RECORDER_IDLE)) {
89         ALOGE("init called in an invalid state(%d)", mCurrentState);
90         return INVALID_OPERATION;
91     }
92 
93     status_t ret = mMediaRecorder->init();
94     if (OK != ret) {
95         ALOGV("init failed: %d", ret);
96         mCurrentState = MEDIA_RECORDER_ERROR;
97         return ret;
98     }
99 
100     ret = mMediaRecorder->setListener(this);
101     if (OK != ret) {
102         ALOGV("setListener failed: %d", ret);
103         mCurrentState = MEDIA_RECORDER_ERROR;
104         return ret;
105     }
106 
107     mCurrentState = MEDIA_RECORDER_INITIALIZED;
108     return ret;
109 }
110 
setVideoSource(int vs)111 status_t MediaRecorder::setVideoSource(int vs)
112 {
113     ALOGV("setVideoSource(%d)", vs);
114     if (mMediaRecorder == NULL) {
115         ALOGE("media recorder is not initialized yet");
116         return INVALID_OPERATION;
117     }
118     if (mIsVideoSourceSet) {
119         ALOGE("video source has already been set");
120         return INVALID_OPERATION;
121     }
122     if (mCurrentState & MEDIA_RECORDER_IDLE) {
123         ALOGV("Call init() since the media recorder is not initialized yet");
124         status_t ret = init();
125         if (OK != ret) {
126             return ret;
127         }
128     }
129     if (!(mCurrentState & MEDIA_RECORDER_INITIALIZED)) {
130         ALOGE("setVideoSource called in an invalid state(%d)", mCurrentState);
131         return INVALID_OPERATION;
132     }
133 
134     // following call is made over the Binder Interface
135     status_t ret = mMediaRecorder->setVideoSource(vs);
136 
137     if (OK != ret) {
138         ALOGV("setVideoSource failed: %d", ret);
139         mCurrentState = MEDIA_RECORDER_ERROR;
140         return ret;
141     }
142     mIsVideoSourceSet = true;
143     return ret;
144 }
145 
setAudioSource(int as)146 status_t MediaRecorder::setAudioSource(int as)
147 {
148     ALOGV("setAudioSource(%d)", as);
149     if (mMediaRecorder == NULL) {
150         ALOGE("media recorder is not initialized yet");
151         return INVALID_OPERATION;
152     }
153     if (mCurrentState & MEDIA_RECORDER_IDLE) {
154         ALOGV("Call init() since the media recorder is not initialized yet");
155         status_t ret = init();
156         if (OK != ret) {
157             return ret;
158         }
159     }
160     if (mIsAudioSourceSet) {
161         ALOGE("audio source has already been set");
162         return INVALID_OPERATION;
163     }
164     if (!(mCurrentState & MEDIA_RECORDER_INITIALIZED)) {
165         ALOGE("setAudioSource called in an invalid state(%d)", mCurrentState);
166         return INVALID_OPERATION;
167     }
168 
169     status_t ret = mMediaRecorder->setAudioSource(as);
170     if (OK != ret) {
171         ALOGV("setAudioSource failed: %d", ret);
172         mCurrentState = MEDIA_RECORDER_ERROR;
173         return ret;
174     }
175     mIsAudioSourceSet = true;
176     return ret;
177 }
178 
setOutputFormat(int of)179 status_t MediaRecorder::setOutputFormat(int of)
180 {
181     ALOGV("setOutputFormat(%d)", of);
182     if (mMediaRecorder == NULL) {
183         ALOGE("media recorder is not initialized yet");
184         return INVALID_OPERATION;
185     }
186     if (!(mCurrentState & MEDIA_RECORDER_INITIALIZED)) {
187         ALOGE("setOutputFormat called in an invalid state: %d", mCurrentState);
188         return INVALID_OPERATION;
189     }
190     if (mIsVideoSourceSet
191             && of >= OUTPUT_FORMAT_AUDIO_ONLY_START //first non-video output format
192             && of < OUTPUT_FORMAT_AUDIO_ONLY_END) {
193         ALOGE("output format (%d) is meant for audio recording only"
194               " and incompatible with video recording", of);
195         return INVALID_OPERATION;
196     }
197 
198     status_t ret = mMediaRecorder->setOutputFormat(of);
199     if (OK != ret) {
200         ALOGE("setOutputFormat failed: %d", ret);
201         mCurrentState = MEDIA_RECORDER_ERROR;
202         return ret;
203     }
204     mCurrentState = MEDIA_RECORDER_DATASOURCE_CONFIGURED;
205     return ret;
206 }
207 
setVideoEncoder(int ve)208 status_t MediaRecorder::setVideoEncoder(int ve)
209 {
210     ALOGV("setVideoEncoder(%d)", ve);
211     if (mMediaRecorder == NULL) {
212         ALOGE("media recorder is not initialized yet");
213         return INVALID_OPERATION;
214     }
215     if (!mIsVideoSourceSet) {
216         ALOGE("try to set the video encoder without setting the video source first");
217         return INVALID_OPERATION;
218     }
219     if (mIsVideoEncoderSet) {
220         ALOGE("video encoder has already been set");
221         return INVALID_OPERATION;
222     }
223     if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
224         ALOGE("setVideoEncoder called in an invalid state(%d)", mCurrentState);
225         return INVALID_OPERATION;
226     }
227 
228     status_t ret = mMediaRecorder->setVideoEncoder(ve);
229     if (OK != ret) {
230         ALOGV("setVideoEncoder failed: %d", ret);
231         mCurrentState = MEDIA_RECORDER_ERROR;
232         return ret;
233     }
234     mIsVideoEncoderSet = true;
235     return ret;
236 }
237 
setAudioEncoder(int ae)238 status_t MediaRecorder::setAudioEncoder(int ae)
239 {
240     ALOGV("setAudioEncoder(%d)", ae);
241     if (mMediaRecorder == NULL) {
242         ALOGE("media recorder is not initialized yet");
243         return INVALID_OPERATION;
244     }
245     if (!mIsAudioSourceSet) {
246         ALOGE("try to set the audio encoder without setting the audio source first");
247         return INVALID_OPERATION;
248     }
249     if (mIsAudioEncoderSet) {
250         ALOGE("audio encoder has already been set");
251         return INVALID_OPERATION;
252     }
253     if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
254         ALOGE("setAudioEncoder called in an invalid state(%d)", mCurrentState);
255         return INVALID_OPERATION;
256     }
257 
258     status_t ret = mMediaRecorder->setAudioEncoder(ae);
259     if (OK != ret) {
260         ALOGV("setAudioEncoder failed: %d", ret);
261         mCurrentState = MEDIA_RECORDER_ERROR;
262         return ret;
263     }
264     mIsAudioEncoderSet = true;
265     return ret;
266 }
267 
setOutputFile(int fd,int64_t offset,int64_t length)268 status_t MediaRecorder::setOutputFile(int fd, int64_t offset, int64_t length)
269 {
270     ALOGV("setOutputFile(%d, %" PRId64 ", %" PRId64 ")", fd, offset, length);
271     if (mMediaRecorder == NULL) {
272         ALOGE("media recorder is not initialized yet");
273         return INVALID_OPERATION;
274     }
275     if (mIsOutputFileSet) {
276         ALOGE("output file has already been set");
277         return INVALID_OPERATION;
278     }
279     if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
280         ALOGE("setOutputFile called in an invalid state(%d)", mCurrentState);
281         return INVALID_OPERATION;
282     }
283 
284     // It appears that if an invalid file descriptor is passed through
285     // binder calls, the server-side of the inter-process function call
286     // is skipped. As a result, the check at the server-side to catch
287     // the invalid file descritpor never gets invoked. This is to workaround
288     // this issue by checking the file descriptor first before passing
289     // it through binder call.
290     if (fd < 0) {
291         ALOGE("Invalid file descriptor: %d", fd);
292         return BAD_VALUE;
293     }
294 
295     status_t ret = mMediaRecorder->setOutputFile(fd, offset, length);
296     if (OK != ret) {
297         ALOGV("setOutputFile failed: %d", ret);
298         mCurrentState = MEDIA_RECORDER_ERROR;
299         return ret;
300     }
301     mIsOutputFileSet = true;
302     return ret;
303 }
304 
setVideoSize(int width,int height)305 status_t MediaRecorder::setVideoSize(int width, int height)
306 {
307     ALOGV("setVideoSize(%d, %d)", width, height);
308     if (mMediaRecorder == NULL) {
309         ALOGE("media recorder is not initialized yet");
310         return INVALID_OPERATION;
311     }
312     if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
313         ALOGE("setVideoSize called in an invalid state: %d", mCurrentState);
314         return INVALID_OPERATION;
315     }
316     if (!mIsVideoSourceSet) {
317         ALOGE("Cannot set video size without setting video source first");
318         return INVALID_OPERATION;
319     }
320 
321     status_t ret = mMediaRecorder->setVideoSize(width, height);
322     if (OK != ret) {
323         ALOGE("setVideoSize failed: %d", ret);
324         mCurrentState = MEDIA_RECORDER_ERROR;
325         return ret;
326     }
327 
328     return ret;
329 }
330 
331 // Query a SurfaceMediaSurface through the Mediaserver, over the
332 // binder interface. This is used by the Filter Framework (MediaEncoder)
333 // to get an <IGraphicBufferProducer> object to hook up to ANativeWindow.
334 sp<IGraphicBufferProducer> MediaRecorder::
querySurfaceMediaSourceFromMediaServer()335         querySurfaceMediaSourceFromMediaServer()
336 {
337     Mutex::Autolock _l(mLock);
338     mSurfaceMediaSource =
339             mMediaRecorder->querySurfaceMediaSource();
340     if (mSurfaceMediaSource == NULL) {
341         ALOGE("SurfaceMediaSource could not be initialized!");
342     }
343     return mSurfaceMediaSource;
344 }
345 
346 
347 
setInputSurface(const sp<PersistentSurface> & surface)348 status_t MediaRecorder::setInputSurface(const sp<PersistentSurface>& surface)
349 {
350     ALOGV("setInputSurface");
351     if (mMediaRecorder == NULL) {
352         ALOGE("media recorder is not initialized yet");
353         return INVALID_OPERATION;
354     }
355     bool isInvalidState = (mCurrentState &
356                            (MEDIA_RECORDER_PREPARED |
357                             MEDIA_RECORDER_RECORDING));
358     if (isInvalidState) {
359         ALOGE("setInputSurface is called in an invalid state: %d", mCurrentState);
360         return INVALID_OPERATION;
361     }
362 
363     return mMediaRecorder->setInputSurface(surface->getBufferConsumer());
364 }
365 
setVideoFrameRate(int frames_per_second)366 status_t MediaRecorder::setVideoFrameRate(int frames_per_second)
367 {
368     ALOGV("setVideoFrameRate(%d)", frames_per_second);
369     if (mMediaRecorder == NULL) {
370         ALOGE("media recorder is not initialized yet");
371         return INVALID_OPERATION;
372     }
373     if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
374         ALOGE("setVideoFrameRate called in an invalid state: %d", mCurrentState);
375         return INVALID_OPERATION;
376     }
377     if (!mIsVideoSourceSet) {
378         ALOGE("Cannot set video frame rate without setting video source first");
379         return INVALID_OPERATION;
380     }
381 
382     status_t ret = mMediaRecorder->setVideoFrameRate(frames_per_second);
383     if (OK != ret) {
384         ALOGE("setVideoFrameRate failed: %d", ret);
385         mCurrentState = MEDIA_RECORDER_ERROR;
386         return ret;
387     }
388     return ret;
389 }
390 
setParameters(const String8 & params)391 status_t MediaRecorder::setParameters(const String8& params) {
392     ALOGV("setParameters(%s)", params.string());
393     if (mMediaRecorder == NULL) {
394         ALOGE("media recorder is not initialized yet");
395         return INVALID_OPERATION;
396     }
397 
398     bool isInvalidState = (mCurrentState &
399                            (MEDIA_RECORDER_PREPARED |
400                             MEDIA_RECORDER_RECORDING |
401                             MEDIA_RECORDER_ERROR));
402     if (isInvalidState) {
403         ALOGE("setParameters is called in an invalid state: %d", mCurrentState);
404         return INVALID_OPERATION;
405     }
406 
407     status_t ret = mMediaRecorder->setParameters(params);
408     if (OK != ret) {
409         ALOGE("setParameters(%s) failed: %d", params.string(), ret);
410         // Do not change our current state to MEDIA_RECORDER_ERROR, failures
411         // of the only currently supported parameters, "max-duration" and
412         // "max-filesize" are _not_ fatal.
413     }
414 
415     return ret;
416 }
417 
prepare()418 status_t MediaRecorder::prepare()
419 {
420     ALOGV("prepare");
421     if (mMediaRecorder == NULL) {
422         ALOGE("media recorder is not initialized yet");
423         return INVALID_OPERATION;
424     }
425     if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
426         ALOGE("prepare called in an invalid state: %d", mCurrentState);
427         return INVALID_OPERATION;
428     }
429     if (mIsAudioSourceSet != mIsAudioEncoderSet) {
430         if (mIsAudioSourceSet) {
431             ALOGE("audio source is set, but audio encoder is not set");
432         } else {  // must not happen, since setAudioEncoder checks this already
433             ALOGE("audio encoder is set, but audio source is not set");
434         }
435         return INVALID_OPERATION;
436     }
437 
438     if (mIsVideoSourceSet != mIsVideoEncoderSet) {
439         if (mIsVideoSourceSet) {
440             ALOGE("video source is set, but video encoder is not set");
441         } else {  // must not happen, since setVideoEncoder checks this already
442             ALOGE("video encoder is set, but video source is not set");
443         }
444         return INVALID_OPERATION;
445     }
446 
447     status_t ret = mMediaRecorder->prepare();
448     if (OK != ret) {
449         ALOGE("prepare failed: %d", ret);
450         mCurrentState = MEDIA_RECORDER_ERROR;
451         return ret;
452     }
453     mCurrentState = MEDIA_RECORDER_PREPARED;
454     return ret;
455 }
456 
getMaxAmplitude(int * max)457 status_t MediaRecorder::getMaxAmplitude(int* max)
458 {
459     ALOGV("getMaxAmplitude");
460     if (mMediaRecorder == NULL) {
461         ALOGE("media recorder is not initialized yet");
462         return INVALID_OPERATION;
463     }
464     if (mCurrentState & MEDIA_RECORDER_ERROR) {
465         ALOGE("getMaxAmplitude called in an invalid state: %d", mCurrentState);
466         return INVALID_OPERATION;
467     }
468 
469     status_t ret = mMediaRecorder->getMaxAmplitude(max);
470     if (OK != ret) {
471         ALOGE("getMaxAmplitude failed: %d", ret);
472         mCurrentState = MEDIA_RECORDER_ERROR;
473         return ret;
474     }
475     return ret;
476 }
477 
start()478 status_t MediaRecorder::start()
479 {
480     ALOGV("start");
481     if (mMediaRecorder == NULL) {
482         ALOGE("media recorder is not initialized yet");
483         return INVALID_OPERATION;
484     }
485     if (!(mCurrentState & MEDIA_RECORDER_PREPARED)) {
486         ALOGE("start called in an invalid state: %d", mCurrentState);
487         return INVALID_OPERATION;
488     }
489 
490     status_t ret = mMediaRecorder->start();
491     if (OK != ret) {
492         ALOGE("start failed: %d", ret);
493         mCurrentState = MEDIA_RECORDER_ERROR;
494         return ret;
495     }
496     mCurrentState = MEDIA_RECORDER_RECORDING;
497     return ret;
498 }
499 
stop()500 status_t MediaRecorder::stop()
501 {
502     ALOGV("stop");
503     if (mMediaRecorder == NULL) {
504         ALOGE("media recorder is not initialized yet");
505         return INVALID_OPERATION;
506     }
507     if (!(mCurrentState & MEDIA_RECORDER_RECORDING)) {
508         ALOGE("stop called in an invalid state: %d", mCurrentState);
509         return INVALID_OPERATION;
510     }
511 
512     status_t ret = mMediaRecorder->stop();
513     if (OK != ret) {
514         ALOGE("stop failed: %d", ret);
515         mCurrentState = MEDIA_RECORDER_ERROR;
516         return ret;
517     }
518 
519     // FIXME:
520     // stop and reset are semantically different.
521     // We treat them the same for now, and will change this in the future.
522     doCleanUp();
523     mCurrentState = MEDIA_RECORDER_IDLE;
524     return ret;
525 }
526 
527 // Reset should be OK in any state
reset()528 status_t MediaRecorder::reset()
529 {
530     ALOGV("reset");
531     if (mMediaRecorder == NULL) {
532         ALOGE("media recorder is not initialized yet");
533         return INVALID_OPERATION;
534     }
535 
536     doCleanUp();
537     status_t ret = UNKNOWN_ERROR;
538     switch (mCurrentState) {
539         case MEDIA_RECORDER_IDLE:
540             ret = OK;
541             break;
542 
543         case MEDIA_RECORDER_RECORDING:
544         case MEDIA_RECORDER_DATASOURCE_CONFIGURED:
545         case MEDIA_RECORDER_PREPARED:
546         case MEDIA_RECORDER_ERROR: {
547             ret = doReset();
548             if (OK != ret) {
549                 return ret;  // No need to continue
550             }
551         }  // Intentional fall through
552         case MEDIA_RECORDER_INITIALIZED:
553             ret = close();
554             break;
555 
556         default: {
557             ALOGE("Unexpected non-existing state: %d", mCurrentState);
558             break;
559         }
560     }
561     return ret;
562 }
563 
close()564 status_t MediaRecorder::close()
565 {
566     ALOGV("close");
567     if (!(mCurrentState & MEDIA_RECORDER_INITIALIZED)) {
568         ALOGE("close called in an invalid state: %d", mCurrentState);
569         return INVALID_OPERATION;
570     }
571     status_t ret = mMediaRecorder->close();
572     if (OK != ret) {
573         ALOGE("close failed: %d", ret);
574         mCurrentState = MEDIA_RECORDER_ERROR;
575         return UNKNOWN_ERROR;
576     } else {
577         mCurrentState = MEDIA_RECORDER_IDLE;
578     }
579     return ret;
580 }
581 
doReset()582 status_t MediaRecorder::doReset()
583 {
584     ALOGV("doReset");
585     status_t ret = mMediaRecorder->reset();
586     if (OK != ret) {
587         ALOGE("doReset failed: %d", ret);
588         mCurrentState = MEDIA_RECORDER_ERROR;
589         return ret;
590     } else {
591         mCurrentState = MEDIA_RECORDER_INITIALIZED;
592     }
593     return ret;
594 }
595 
doCleanUp()596 void MediaRecorder::doCleanUp()
597 {
598     ALOGV("doCleanUp");
599     mIsAudioSourceSet  = false;
600     mIsVideoSourceSet  = false;
601     mIsAudioEncoderSet = false;
602     mIsVideoEncoderSet = false;
603     mIsOutputFileSet   = false;
604 }
605 
606 // Release should be OK in any state
release()607 status_t MediaRecorder::release()
608 {
609     ALOGV("release");
610     if (mMediaRecorder != NULL) {
611         return mMediaRecorder->release();
612     }
613     return INVALID_OPERATION;
614 }
615 
MediaRecorder(const String16 & opPackageName)616 MediaRecorder::MediaRecorder(const String16& opPackageName) : mSurfaceMediaSource(NULL)
617 {
618     ALOGV("constructor");
619 
620     const sp<IMediaPlayerService> service(getMediaPlayerService());
621     if (service != NULL) {
622         mMediaRecorder = service->createMediaRecorder(opPackageName);
623     }
624     if (mMediaRecorder != NULL) {
625         mCurrentState = MEDIA_RECORDER_IDLE;
626     }
627 
628 
629     doCleanUp();
630 }
631 
initCheck()632 status_t MediaRecorder::initCheck()
633 {
634     return mMediaRecorder != 0 ? NO_ERROR : NO_INIT;
635 }
636 
~MediaRecorder()637 MediaRecorder::~MediaRecorder()
638 {
639     ALOGV("destructor");
640     if (mMediaRecorder != NULL) {
641         mMediaRecorder.clear();
642     }
643 
644     if (mSurfaceMediaSource != NULL) {
645         mSurfaceMediaSource.clear();
646     }
647 }
648 
setListener(const sp<MediaRecorderListener> & listener)649 status_t MediaRecorder::setListener(const sp<MediaRecorderListener>& listener)
650 {
651     ALOGV("setListener");
652     Mutex::Autolock _l(mLock);
653     mListener = listener;
654 
655     return NO_ERROR;
656 }
657 
setClientName(const String16 & clientName)658 status_t MediaRecorder::setClientName(const String16& clientName)
659 {
660     ALOGV("setClientName");
661     if (mMediaRecorder == NULL) {
662         ALOGE("media recorder is not initialized yet");
663         return INVALID_OPERATION;
664     }
665     bool isInvalidState = (mCurrentState &
666                            (MEDIA_RECORDER_PREPARED |
667                             MEDIA_RECORDER_RECORDING |
668                             MEDIA_RECORDER_ERROR));
669     if (isInvalidState) {
670         ALOGE("setClientName is called in an invalid state: %d", mCurrentState);
671         return INVALID_OPERATION;
672     }
673 
674     mMediaRecorder->setClientName(clientName);
675 
676     return NO_ERROR;
677 }
678 
notify(int msg,int ext1,int ext2)679 void MediaRecorder::notify(int msg, int ext1, int ext2)
680 {
681     ALOGV("message received msg=%d, ext1=%d, ext2=%d", msg, ext1, ext2);
682 
683     sp<MediaRecorderListener> listener;
684     mLock.lock();
685     listener = mListener;
686     mLock.unlock();
687 
688     if (listener != NULL) {
689         Mutex::Autolock _l(mNotifyLock);
690         ALOGV("callback application");
691         listener->notify(msg, ext1, ext2);
692         ALOGV("back from callback");
693     }
694 }
695 
died()696 void MediaRecorder::died()
697 {
698     ALOGV("died");
699     notify(MEDIA_RECORDER_EVENT_ERROR, MEDIA_ERROR_SERVER_DIED, 0);
700 }
701 
702 } // namespace android
703