diff --git a/camera/Camera.cpp b/camera/Camera.cpp index 19849f8d68..84d1d934e1 100644 --- a/camera/Camera.cpp +++ b/camera/Camera.cpp @@ -347,13 +347,20 @@ status_t Camera::setPreviewCallbackTarget( return c->setPreviewCallbackTarget(callbackProducer); } -int32_t Camera::setAudioRestriction(int32_t mode) +status_t Camera::setAudioRestriction(int32_t mode) { sp <::android::hardware::ICamera> c = mCamera; if (c == 0) return NO_INIT; return c->setAudioRestriction(mode); } +int32_t Camera::getGlobalAudioRestriction() +{ + sp <::android::hardware::ICamera> c = mCamera; + if (c == 0) return NO_INIT; + return c->getGlobalAudioRestriction(); +} + // callback from camera service void Camera::notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2) { diff --git a/camera/ICamera.cpp b/camera/ICamera.cpp index 060e8e06a8..b83edf7060 100644 --- a/camera/ICamera.cpp +++ b/camera/ICamera.cpp @@ -57,6 +57,7 @@ enum { RELEASE_RECORDING_FRAME_HANDLE, RELEASE_RECORDING_FRAME_HANDLE_BATCH, SET_AUDIO_RESTRICTION, + GET_GLOBAL_AUDIO_RESTRICTION, }; class BpCamera: public BpInterface @@ -192,7 +193,7 @@ public: } } - int32_t setAudioRestriction(int32_t mode) { + status_t setAudioRestriction(int32_t mode) { Parcel data, reply; data.writeInterfaceToken(ICamera::getInterfaceDescriptor()); data.writeInt32(mode); @@ -200,6 +201,13 @@ public: return reply.readInt32(); } + int32_t getGlobalAudioRestriction() { + Parcel data, reply; + data.writeInterfaceToken(ICamera::getInterfaceDescriptor()); + remote()->transact(GET_GLOBAL_AUDIO_RESTRICTION, data, &reply); + return reply.readInt32(); + } + status_t setVideoBufferMode(int32_t videoBufferMode) { ALOGV("setVideoBufferMode: %d", videoBufferMode); @@ -509,6 +517,11 @@ status_t BnCamera::onTransact( reply->writeInt32(setAudioRestriction(mode)); return NO_ERROR; } break; + case GET_GLOBAL_AUDIO_RESTRICTION: { + CHECK_INTERFACE(ICamera, data, reply); + reply->writeInt32(getGlobalAudioRestriction()); + return NO_ERROR; + } break; default: return BBinder::onTransact(code, data, reply, flags); } diff --git a/camera/aidl/android/hardware/camera2/ICameraDeviceUser.aidl b/camera/aidl/android/hardware/camera2/ICameraDeviceUser.aidl index 5987b4231c..93549e05de 100644 --- a/camera/aidl/android/hardware/camera2/ICameraDeviceUser.aidl +++ b/camera/aidl/android/hardware/camera2/ICameraDeviceUser.aidl @@ -168,7 +168,13 @@ interface ICameraDeviceUser * * @param mode the audio restriction mode ID as above * - * @return the resulting system-wide audio restriction mode */ - int setCameraAudioRestriction(int mode); + void setCameraAudioRestriction(int mode); + + /** + * Get global audio restriction mode for all camera clients. + * + * @return the currently applied system-wide audio restriction mode + */ + int getGlobalAudioRestriction(); } diff --git a/camera/include/camera/Camera.h b/camera/include/camera/Camera.h index 9800bb747f..2cdb617e81 100644 --- a/camera/include/camera/Camera.h +++ b/camera/include/camera/Camera.h @@ -167,7 +167,8 @@ public: sp getRecordingProxy(); - int32_t setAudioRestriction(int32_t mode); + status_t setAudioRestriction(int32_t mode); + int32_t getGlobalAudioRestriction(); // ICameraClient interface virtual void notifyCallback(int32_t msgType, int32_t ext, int32_t ext2); diff --git a/camera/include/camera/android/hardware/ICamera.h b/camera/include/camera/android/hardware/ICamera.h index eba9efec52..ec19e5d631 100644 --- a/camera/include/camera/android/hardware/ICamera.h +++ b/camera/include/camera/android/hardware/ICamera.h @@ -142,7 +142,10 @@ public: const sp& bufferProducer) = 0; // Set the audio restriction mode - virtual int32_t setAudioRestriction(int32_t mode) = 0; + virtual status_t setAudioRestriction(int32_t mode) = 0; + + // Get the global audio restriction mode + virtual int32_t getGlobalAudioRestriction() = 0; }; // ---------------------------------------------------------------------------- diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp index 9ba6553acb..a503838850 100644 --- a/services/camera/libcameraservice/CameraService.cpp +++ b/services/camera/libcameraservice/CameraService.cpp @@ -2507,11 +2507,16 @@ bool CameraService::BasicClient::canCastToApiClient(apiLevel level) const { return level == API_2; } -int32_t CameraService::BasicClient::setAudioRestriction(int32_t mode) { +status_t CameraService::BasicClient::setAudioRestriction(int32_t mode) { { Mutex::Autolock l(mAudioRestrictionLock); mAudioRestriction = mode; } + sCameraService->updateAudioRestriction(); + return OK; +} + +int32_t CameraService::BasicClient::getServiceAudioRestriction() const { return sCameraService->updateAudioRestriction(); } diff --git a/services/camera/libcameraservice/CameraService.h b/services/camera/libcameraservice/CameraService.h index df8c17c88b..7c77e16421 100644 --- a/services/camera/libcameraservice/CameraService.h +++ b/services/camera/libcameraservice/CameraService.h @@ -261,8 +261,13 @@ public: // set audio restriction from client // Will call into camera service and hold mServiceLock - virtual int32_t setAudioRestriction(int32_t mode); + virtual status_t setAudioRestriction(int32_t mode); + // Get current global audio restriction setting + // Will call into camera service and hold mServiceLock + virtual int32_t getServiceAudioRestriction() const; + + // Get current audio restriction setting for this client virtual int32_t getAudioRestriction() const; static bool isValidAudioRestriction(int32_t mode); diff --git a/services/camera/libcameraservice/api1/Camera2Client.cpp b/services/camera/libcameraservice/api1/Camera2Client.cpp index e996e83147..c27388103d 100644 --- a/services/camera/libcameraservice/api1/Camera2Client.cpp +++ b/services/camera/libcameraservice/api1/Camera2Client.cpp @@ -2258,12 +2258,18 @@ status_t Camera2Client::setVideoTarget(const sp& bufferP return OK; } -int32_t Camera2Client::setAudioRestriction(int /*mode*/) { +status_t Camera2Client::setAudioRestriction(int /*mode*/) { // Empty implementation. setAudioRestriction is hidden interface and not // supported by android.hardware.Camera API return INVALID_OPERATION; } +int32_t Camera2Client::getGlobalAudioRestriction() { + // Empty implementation. getAudioRestriction is hidden interface and not + // supported by android.hardware.Camera API + return INVALID_OPERATION; +} + status_t Camera2Client::waitUntilCurrentRequestIdLocked() { int32_t activeRequestId = mStreamingProcessor->getActiveRequestId(); if (activeRequestId != 0) { diff --git a/services/camera/libcameraservice/api1/Camera2Client.h b/services/camera/libcameraservice/api1/Camera2Client.h index e79a442143..8a17b17399 100644 --- a/services/camera/libcameraservice/api1/Camera2Client.h +++ b/services/camera/libcameraservice/api1/Camera2Client.h @@ -83,7 +83,8 @@ public: virtual void notifyError(int32_t errorCode, const CaptureResultExtras& resultExtras); virtual status_t setVideoTarget(const sp& bufferProducer); - virtual int32_t setAudioRestriction(int mode); + virtual status_t setAudioRestriction(int mode); + virtual int32_t getGlobalAudioRestriction(); /** * Interface used by CameraService diff --git a/services/camera/libcameraservice/api1/CameraClient.cpp b/services/camera/libcameraservice/api1/CameraClient.cpp index 089f6cfc7f..764b3a94ff 100644 --- a/services/camera/libcameraservice/api1/CameraClient.cpp +++ b/services/camera/libcameraservice/api1/CameraClient.cpp @@ -1171,7 +1171,7 @@ status_t CameraClient::setVideoTarget(const sp& bufferPr return INVALID_OPERATION; } -int32_t CameraClient::setAudioRestriction(int mode) { +status_t CameraClient::setAudioRestriction(int mode) { if (!isValidAudioRestriction(mode)) { ALOGE("%s: invalid audio restriction mode %d", __FUNCTION__, mode); return BAD_VALUE; @@ -1184,5 +1184,12 @@ int32_t CameraClient::setAudioRestriction(int mode) { return BasicClient::setAudioRestriction(mode); } +int32_t CameraClient::getGlobalAudioRestriction() { + Mutex::Autolock lock(mLock); + if (checkPidAndHardware() != NO_ERROR) { + return INVALID_OPERATION; + } + return BasicClient::getServiceAudioRestriction(); +} }; // namespace android diff --git a/services/camera/libcameraservice/api1/CameraClient.h b/services/camera/libcameraservice/api1/CameraClient.h index fefa8c900c..b26b61292c 100644 --- a/services/camera/libcameraservice/api1/CameraClient.h +++ b/services/camera/libcameraservice/api1/CameraClient.h @@ -59,7 +59,8 @@ public: virtual String8 getParameters() const; virtual status_t sendCommand(int32_t cmd, int32_t arg1, int32_t arg2); virtual status_t setVideoTarget(const sp& bufferProducer); - virtual int32_t setAudioRestriction(int mode); + virtual status_t setAudioRestriction(int mode); + virtual int32_t getGlobalAudioRestriction(); // Interface used by CameraService CameraClient(const sp& cameraService, diff --git a/services/camera/libcameraservice/api2/CameraDeviceClient.cpp b/services/camera/libcameraservice/api2/CameraDeviceClient.cpp index be188bcee9..d93d26f5d2 100644 --- a/services/camera/libcameraservice/api2/CameraDeviceClient.cpp +++ b/services/camera/libcameraservice/api2/CameraDeviceClient.cpp @@ -1870,8 +1870,7 @@ binder::Status CameraDeviceClient::finalizeOutputConfigurations(int32_t streamId return res; } -binder::Status CameraDeviceClient::setCameraAudioRestriction(int32_t mode, - /*out*/ int32_t* outMode) { +binder::Status CameraDeviceClient::setCameraAudioRestriction(int32_t mode) { ATRACE_CALL(); binder::Status res; if (!(res = checkPidStatus(__FUNCTION__)).isOk()) return res; @@ -1883,9 +1882,18 @@ binder::Status CameraDeviceClient::setCameraAudioRestriction(int32_t mode, return STATUS_ERROR(CameraService::ERROR_ILLEGAL_ARGUMENT, msg.string()); } + Mutex::Autolock icl(mBinderSerializationLock); + BasicClient::setAudioRestriction(mode); + return binder::Status::ok(); +} + +binder::Status CameraDeviceClient::getGlobalAudioRestriction(/*out*/ int32_t* outMode) { + ATRACE_CALL(); + binder::Status res; + if (!(res = checkPidStatus(__FUNCTION__)).isOk()) return res; Mutex::Autolock icl(mBinderSerializationLock); if (outMode != nullptr) { - *outMode = BasicClient::setAudioRestriction(mode); + *outMode = BasicClient::getServiceAudioRestriction(); } return binder::Status::ok(); } diff --git a/services/camera/libcameraservice/api2/CameraDeviceClient.h b/services/camera/libcameraservice/api2/CameraDeviceClient.h index a9aa190cf1..fe250103f1 100644 --- a/services/camera/libcameraservice/api2/CameraDeviceClient.h +++ b/services/camera/libcameraservice/api2/CameraDeviceClient.h @@ -152,9 +152,9 @@ public: virtual binder::Status finalizeOutputConfigurations(int32_t streamId, const hardware::camera2::params::OutputConfiguration &outputConfiguration) override; - virtual binder::Status setCameraAudioRestriction(int32_t mode, - /*out*/ - int32_t* outMode = NULL) override; + virtual binder::Status setCameraAudioRestriction(int32_t mode) override; + + virtual binder::Status getGlobalAudioRestriction(/*out*/int32_t* outMode) override; /** * Interface used by CameraService