From b18b6910b827356136b91ddc7550b2b6cbdeb2db Mon Sep 17 00:00:00 2001 From: Jason Sams <> Date: Tue, 24 Mar 2009 20:21:36 -0700 Subject: Automated import from //branches/donutburger/...@141469,141469 --- camera/libcameraservice/CameraService.cpp | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'camera/libcameraservice/CameraService.cpp') diff --git a/camera/libcameraservice/CameraService.cpp b/camera/libcameraservice/CameraService.cpp index 15e3b21aeaa0..851b2132f648 100644 --- a/camera/libcameraservice/CameraService.cpp +++ b/camera/libcameraservice/CameraService.cpp @@ -28,6 +28,8 @@ #include #include +#include +#include #include "CameraService.h" namespace android { @@ -151,6 +153,19 @@ void CameraService::removeClient(const sp& cameraClient) } } +static sp newMediaPlayer(const char *file) +{ + sp mp = new MediaPlayer(); + if (mp->setDataSource(file) == NO_ERROR) { + mp->setAudioStreamType(AudioSystem::ALARM); + mp->prepare(); + } else { + mp.clear(); + LOGE("Failed to load CameraService sounds."); + } + return mp; +} + CameraService::Client::Client(const sp& cameraService, const sp& cameraClient, pid_t clientPid) { @@ -161,6 +176,9 @@ CameraService::Client::Client(const sp& cameraService, mHardware = openCameraHardware(); mUseOverlay = mHardware->useOverlay(); + mMediaPlayerClick = newMediaPlayer("/system/media/audio/ui/camera_click.ogg"); + mMediaPlayerBeep = newMediaPlayer("/system/media/audio/ui/VideoRecord.ogg"); + // Callback is disabled by default mPreviewCallbackFlag = FRAME_CALLBACK_FLAG_NOOP; LOGD("Client X constructor"); @@ -265,6 +283,9 @@ CameraService::Client::~Client() #endif } + mMediaPlayerBeep.clear(); + mMediaPlayerClick.clear(); + // make sure we tear down the hardware mClientPid = IPCThreadState::self()->getCallingPid(); disconnect(); @@ -464,6 +485,9 @@ status_t CameraService::Client::startPreview() status_t CameraService::Client::startRecording() { + if (mMediaPlayerBeep.get() != NULL) { + mMediaPlayerBeep->start(); + } return startCameraMode(CAMERA_RECORDING_MODE); } @@ -502,6 +526,9 @@ void CameraService::Client::stopRecording() return; } + if (mMediaPlayerBeep.get() != NULL) { + mMediaPlayerBeep->start(); + } mHardware->stopRecording(); LOGV("stopRecording(), hardware stopped OK"); mPreviewBuffer.clear(); @@ -684,6 +711,9 @@ status_t CameraService::Client::takePicture() return INVALID_OPERATION; } + if (mMediaPlayerClick.get() != NULL) { + mMediaPlayerClick->start(); + } return mHardware->takePicture(shutterCallback, yuvPictureCallback, jpegPictureCallback, -- cgit v1.2.3-59-g8ed1b From 403914a108fec85c9677f1588b62088a416d5d1e Mon Sep 17 00:00:00 2001 From: Jason Sams <> Date: Tue, 24 Mar 2009 20:36:57 -0700 Subject: Automated import from //branches/donutburger/...@141598,141598 --- camera/libcameraservice/CameraService.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'camera/libcameraservice/CameraService.cpp') diff --git a/camera/libcameraservice/CameraService.cpp b/camera/libcameraservice/CameraService.cpp index 851b2132f648..c5c95b05e7df 100644 --- a/camera/libcameraservice/CameraService.cpp +++ b/camera/libcameraservice/CameraService.cpp @@ -283,8 +283,14 @@ CameraService::Client::~Client() #endif } - mMediaPlayerBeep.clear(); - mMediaPlayerClick.clear(); + if (mMediaPlayerBeep.get() != NULL) { + mMediaPlayerBeep->disconnect(); + mMediaPlayerBeep.clear(); + } + if (mMediaPlayerClick.get() != NULL) { + mMediaPlayerClick->disconnect(); + mMediaPlayerClick.clear(); + } // make sure we tear down the hardware mClientPid = IPCThreadState::self()->getCallingPid(); @@ -711,9 +717,6 @@ status_t CameraService::Client::takePicture() return INVALID_OPERATION; } - if (mMediaPlayerClick.get() != NULL) { - mMediaPlayerClick->start(); - } return mHardware->takePicture(shutterCallback, yuvPictureCallback, jpegPictureCallback, @@ -751,6 +754,10 @@ void CameraService::Client::shutterCallback(void *user) client->mSurface->registerBuffers(buffers); } + + if (client->mMediaPlayerClick.get() != NULL) { + client->mMediaPlayerClick->start(); + } } // picture callback - raw image ready -- cgit v1.2.3-59-g8ed1b From a9f95fbee978e2d134052c2dceea2559b64badb4 Mon Sep 17 00:00:00 2001 From: Wu-cheng Li <> Date: Tue, 24 Mar 2009 20:39:09 -0700 Subject: Automated import from //branches/donutburger/...@141614,141614 --- camera/libcameraservice/CameraService.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'camera/libcameraservice/CameraService.cpp') diff --git a/camera/libcameraservice/CameraService.cpp b/camera/libcameraservice/CameraService.cpp index c5c95b05e7df..6a6a811fa790 100644 --- a/camera/libcameraservice/CameraService.cpp +++ b/camera/libcameraservice/CameraService.cpp @@ -731,6 +731,11 @@ void CameraService::Client::shutterCallback(void *user) return; } + // Play shutter sound. + if (client->mMediaPlayerClick.get() != NULL) { + client->mMediaPlayerClick->start(); + } + // Screen goes black after the buffer is unregistered. if (client->mSurface != 0 && !client->mUseOverlay) { client->mSurface->unregisterBuffers(); @@ -754,10 +759,6 @@ void CameraService::Client::shutterCallback(void *user) client->mSurface->registerBuffers(buffers); } - - if (client->mMediaPlayerClick.get() != NULL) { - client->mMediaPlayerClick->start(); - } } // picture callback - raw image ready -- cgit v1.2.3-59-g8ed1b From e25b51baf43bab5b8c19546a93c0bf73025ffbee Mon Sep 17 00:00:00 2001 From: Andreas Huber <> Date: Tue, 24 Mar 2009 20:47:19 -0700 Subject: Automated import from //branches/donutburger/...@141711,141711 --- camera/libcameraservice/CameraService.cpp | 3 +++ media/libmedia/mediaplayer.cpp | 11 ++++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) (limited to 'camera/libcameraservice/CameraService.cpp') diff --git a/camera/libcameraservice/CameraService.cpp b/camera/libcameraservice/CameraService.cpp index 6a6a811fa790..7e5fdbe1561c 100644 --- a/camera/libcameraservice/CameraService.cpp +++ b/camera/libcameraservice/CameraService.cpp @@ -492,6 +492,7 @@ status_t CameraService::Client::startPreview() status_t CameraService::Client::startRecording() { if (mMediaPlayerBeep.get() != NULL) { + mMediaPlayerBeep->seekTo(0); mMediaPlayerBeep->start(); } return startCameraMode(CAMERA_RECORDING_MODE); @@ -533,6 +534,7 @@ void CameraService::Client::stopRecording() } if (mMediaPlayerBeep.get() != NULL) { + mMediaPlayerBeep->seekTo(0); mMediaPlayerBeep->start(); } mHardware->stopRecording(); @@ -733,6 +735,7 @@ void CameraService::Client::shutterCallback(void *user) // Play shutter sound. if (client->mMediaPlayerClick.get() != NULL) { + client->mMediaPlayerClick->seekTo(0); client->mMediaPlayerClick->start(); } diff --git a/media/libmedia/mediaplayer.cpp b/media/libmedia/mediaplayer.cpp index 58419227264b..809316a9f7b9 100644 --- a/media/libmedia/mediaplayer.cpp +++ b/media/libmedia/mediaplayer.cpp @@ -416,8 +416,12 @@ status_t MediaPlayer::seekTo_l(int msec) status_t MediaPlayer::seekTo(int msec) { + mLockThreadId = getThreadId(); Mutex::Autolock _l(mLock); - return seekTo_l(msec); + status_t result = seekTo_l(msec); + mLockThreadId = 0; + + return result; } status_t MediaPlayer::reset() @@ -501,8 +505,9 @@ void MediaPlayer::notify(int msg, int ext1, int ext2) // this will deadlock. // // The threadId hack below works around this for the care of prepare - // within the same process. - + // and seekTo within the same process. + // FIXME: Remember, this is a hack, it's not even a hack that is applied + // consistently for all use-cases, this needs to be revisited. if (mLockThreadId != getThreadId()) { mLock.lock(); locked = true; -- cgit v1.2.3-59-g8ed1b From a7f1e5c540ff7b94c212facdcd89459cba3e4edc Mon Sep 17 00:00:00 2001 From: Eric Laurent <> Date: Fri, 27 Mar 2009 16:27:16 -0700 Subject: AI 143177: am: CL 142889 Fix issue #1736153 Camera shutter sound can be muted by new AlarmClock setting. Current implementation of Camera service plays the camera shutter sound over the ALARM stream so that it cannot be muted by silent mode in order to comply to some country specific requirement. A recent change made it possible for the user to mute the ALARM stream thus making this stream not suitable any more for the camera shutter sound. The fix consists in creating a new stream type only accessible by native code and that cannot be muted and use it to play camera sounds. Original author: elaurent Merged from: //branches/cupcake/... Automated import of CL 143177 --- camera/libcameraservice/CameraService.cpp | 10 +++++++++- include/media/AudioSystem.h | 1 + libs/audioflinger/AudioFlinger.cpp | 9 ++++++--- 3 files changed, 16 insertions(+), 4 deletions(-) (limited to 'camera/libcameraservice/CameraService.cpp') diff --git a/camera/libcameraservice/CameraService.cpp b/camera/libcameraservice/CameraService.cpp index 7e5fdbe1561c..cb8ab58827c0 100644 --- a/camera/libcameraservice/CameraService.cpp +++ b/camera/libcameraservice/CameraService.cpp @@ -32,6 +32,8 @@ #include #include "CameraService.h" +#include + namespace android { extern "C" { @@ -157,7 +159,13 @@ static sp newMediaPlayer(const char *file) { sp mp = new MediaPlayer(); if (mp->setDataSource(file) == NO_ERROR) { - mp->setAudioStreamType(AudioSystem::ALARM); + char value[PROPERTY_VALUE_MAX]; + property_get("ro.camera.sound.forced", value, "0"); + if (atoi(value)) { + mp->setAudioStreamType(AudioSystem::ENFORCED_AUDIBLE); + } else { + mp->setAudioStreamType(AudioSystem::SYSTEM); + } mp->prepare(); } else { mp.clear(); diff --git a/include/media/AudioSystem.h b/include/media/AudioSystem.h index 77c90ba7fc1f..3a3a714c9e9d 100644 --- a/include/media/AudioSystem.h +++ b/include/media/AudioSystem.h @@ -38,6 +38,7 @@ public: ALARM = 4, NOTIFICATION = 5, BLUETOOTH_SCO = 6, + ENFORCED_AUDIBLE = 7, // Sounds that cannot be muted by user and must be routed to speaker NUM_STREAM_TYPES }; diff --git a/libs/audioflinger/AudioFlinger.cpp b/libs/audioflinger/AudioFlinger.cpp index 9ba7f90f956e..b9ecdd8e41fb 100644 --- a/libs/audioflinger/AudioFlinger.cpp +++ b/libs/audioflinger/AudioFlinger.cpp @@ -243,7 +243,8 @@ bool AudioFlinger::streamForcedToSpeaker(int streamType) // AudioSystem::routedToA2dpOutput(streamType) == false return (streamType == AudioSystem::RING || streamType == AudioSystem::ALARM || - streamType == AudioSystem::NOTIFICATION); + streamType == AudioSystem::NOTIFICATION || + streamType == AudioSystem::ENFORCED_AUDIBLE); } status_t AudioFlinger::dumpClients(int fd, const Vector& args) @@ -645,7 +646,8 @@ status_t AudioFlinger::setStreamVolume(int stream, float value) return PERMISSION_DENIED; } - if (uint32_t(stream) >= AudioSystem::NUM_STREAM_TYPES) { + if (uint32_t(stream) >= AudioSystem::NUM_STREAM_TYPES || + uint32_t(stream) == AudioSystem::ENFORCED_AUDIBLE) { return BAD_VALUE; } @@ -680,7 +682,8 @@ status_t AudioFlinger::setStreamMute(int stream, bool muted) return PERMISSION_DENIED; } - if (uint32_t(stream) >= AudioSystem::NUM_STREAM_TYPES) { + if (uint32_t(stream) >= AudioSystem::NUM_STREAM_TYPES || + uint32_t(stream) == AudioSystem::ENFORCED_AUDIBLE) { return BAD_VALUE; } -- cgit v1.2.3-59-g8ed1b From e251f32b765afa514648d6a5a2d2da5d0f0a2514 Mon Sep 17 00:00:00 2001 From: James Dong Date: Mon, 20 Apr 2009 19:35:28 -0700 Subject: Remove dangling media recorder client reference when setCamera() is used. --- camera/libcameraservice/CameraService.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'camera/libcameraservice/CameraService.cpp') diff --git a/camera/libcameraservice/CameraService.cpp b/camera/libcameraservice/CameraService.cpp index cb8ab58827c0..701259e6774c 100644 --- a/camera/libcameraservice/CameraService.cpp +++ b/camera/libcameraservice/CameraService.cpp @@ -217,7 +217,13 @@ status_t CameraService::Client::unlock() // allow anyone to use camera LOGV("unlock (%p)", getCameraClient()->asBinder().get()); status_t result = checkPid(); - if (result == NO_ERROR) mClientPid = 0; + if (result == NO_ERROR) { + mClientPid = 0; + + // we need to remove the reference so that when app goes + // away, the reference count goes to 0. + mCameraClient.clear(); + } return result; } -- cgit v1.2.3-59-g8ed1b From ab5b424db30b478570d83a30497319a72e91068c Mon Sep 17 00:00:00 2001 From: Wu-cheng Li Date: Wed, 22 Apr 2009 16:21:26 +0800 Subject: Remove debug messages. modified: core/java/android/hardware/Camera.java modified: camera/libcameraservice/CameraService.cpp --- camera/libcameraservice/CameraService.cpp | 6 +++--- core/java/android/hardware/Camera.java | 3 --- 2 files changed, 3 insertions(+), 6 deletions(-) (limited to 'camera/libcameraservice/CameraService.cpp') diff --git a/camera/libcameraservice/CameraService.cpp b/camera/libcameraservice/CameraService.cpp index 701259e6774c..96ee5022415e 100644 --- a/camera/libcameraservice/CameraService.cpp +++ b/camera/libcameraservice/CameraService.cpp @@ -900,8 +900,6 @@ status_t CameraService::Client::setParameters(const String8& params) // get preview/capture parameters - key/value pairs String8 CameraService::Client::getParameters() const { - LOGD("getParameters"); - Mutex::Autolock lock(mLock); if (mHardware == 0) { @@ -909,7 +907,9 @@ String8 CameraService::Client::getParameters() const return String8(); } - return mHardware->getParameters().flatten(); + String8 params(mHardware->getParameters().flatten()); + LOGD("getParameters(%s)", params.string()); + return params; } void CameraService::Client::postAutoFocus(bool focused) diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java index 106c9200b680..ca579b6b501b 100644 --- a/core/java/android/hardware/Camera.java +++ b/core/java/android/hardware/Camera.java @@ -405,8 +405,6 @@ public class Camera { * @param params the Parameters to use for this Camera service */ public void setParameters(Parameters params) { - Log.e(TAG, "setParameters()"); - //params.dump(); native_setParameters(params.flatten()); } @@ -416,7 +414,6 @@ public class Camera { public Parameters getParameters() { Parameters p = new Parameters(); String s = native_getParameters(); - Log.e(TAG, "_getParameters: " + s); p.unflatten(s); return p; } -- cgit v1.2.3-59-g8ed1b