From 088146a4213f5099b8fcc93e1b75538c53f61404 Mon Sep 17 00:00:00 2001 From: Nipun Kwatra Date: Sat, 11 Sep 2010 19:31:10 -0700 Subject: Adding enable/disable option for sendCommand() - Added enum CAMERA_CMD_ENABLE_SHUTTER_SOUND which corresponds to command type for enabling/disabling shutter sound. - The implementation checks if it is legal to disable shutter sound. If it is, then any process can disable the sound. If not, then only the mediaserver process is allowed to do this. Currently time lapse capture needs this functionality to disable shutter sound when still mode is used to capture time lapse video. Change-Id: Id147a3bcc6a345c2c6a6d52bf98fd8292386bb19 --- services/camera/libcameraservice/CameraService.cpp | 47 +++++++++++++++++++++- services/camera/libcameraservice/CameraService.h | 4 ++ 2 files changed, 50 insertions(+), 1 deletion(-) (limited to 'services/camera') diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp index e5889bf..355763e 100644 --- a/services/camera/libcameraservice/CameraService.cpp +++ b/services/camera/libcameraservice/CameraService.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -319,6 +320,7 @@ CameraService::Client::Client(const sp& cameraService, // Callback is disabled by default mPreviewCallbackFlag = FRAME_CALLBACK_FLAG_NOOP; mOrientation = 0; + mPlayShutterSound = true; cameraService->setCameraBusy(cameraId); cameraService->loadSound(); LOG1("Client::Client X (pid %d)", callingPid); @@ -769,6 +771,35 @@ String8 CameraService::Client::getParameters() const { return params; } +// enable shutter sound +status_t CameraService::Client::enableShutterSound(bool enable) { + LOG1("enableShutterSound (pid %d)", getCallingPid()); + + status_t result = checkPidAndHardware(); + if (result != NO_ERROR) return result; + + if (enable) { + mPlayShutterSound = true; + return OK; + } + + // Disabling shutter sound may not be allowed. In that case only + // allow the mediaserver process to disable the sound. + char value[PROPERTY_VALUE_MAX]; + property_get("ro.camera.sound.forced", value, "0"); + if (strcmp(value, "0") != 0) { + // Disabling shutter sound is not allowed. Deny if the current + // process is not mediaserver. + if (getCallingPid() != getpid()) { + LOGE("Failed to disable shutter sound. Permission denied (pid %d)", getCallingPid()); + return PERMISSION_DENIED; + } + } + + mPlayShutterSound = false; + return OK; +} + status_t CameraService::Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) { LOG1("sendCommand (pid %d)", getCallingPid()); Mutex::Autolock lock(mLock); @@ -797,6 +828,18 @@ status_t CameraService::Client::sendCommand(int32_t cmd, int32_t arg1, int32_t a return BAD_VALUE; } return OK; + } else if (cmd == CAMERA_CMD_ENABLE_SHUTTER_SOUND) { + switch (arg1) { + case 0: + enableShutterSound(false); + break; + case 1: + enableShutterSound(true); + break; + default: + return BAD_VALUE; + } + return OK; } return mHardware->sendCommand(cmd, arg1, arg2); @@ -957,7 +1000,9 @@ void CameraService::Client::dataCallbackTimestamp(nsecs_t timestamp, // "size" is the width and height of yuv picture for registerBuffer. // If it is NULL, use the picture size from parameters. void CameraService::Client::handleShutter(image_rect_type *size) { - mCameraService->playSound(SOUND_SHUTTER); + if (mPlayShutterSound) { + mCameraService->playSound(SOUND_SHUTTER); + } sp c = mCameraClient; if (c != 0) { diff --git a/services/camera/libcameraservice/CameraService.h b/services/camera/libcameraservice/CameraService.h index 7ed192e..2b5c511 100644 --- a/services/camera/libcameraservice/CameraService.h +++ b/services/camera/libcameraservice/CameraService.h @@ -138,6 +138,9 @@ private: status_t startPreviewMode(); status_t startRecordingMode(); + // internal function used by sendCommand to enable/disable shutter sound. + status_t enableShutterSound(bool enable); + // these are static callback functions static void notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2, void* user); static void dataCallback(int32_t msgType, const sp& dataPtr, void* user); @@ -171,6 +174,7 @@ private: int mOverlayH; int mPreviewCallbackFlag; int mOrientation; + bool mPlayShutterSound; // Ensures atomicity among the public methods mutable Mutex mLock; -- cgit v1.1