From e8639769e072bf65b0f2541c459210b7bf5392d0 Mon Sep 17 00:00:00 2001 From: banana_pluto Date: Thu, 4 Sep 2025 18:36:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8E=A7=E5=88=B6=E5=99=A8=E5=AE=89=E5=85=A8?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: banana_pluto --- .../camera_service/include/hcamera_service.h | 13 ++++- .../camera_service/src/hcamera_service.cpp | 57 +++++++++++-------- 2 files changed, 45 insertions(+), 25 deletions(-) diff --git a/services/camera_service/include/hcamera_service.h b/services/camera_service/include/hcamera_service.h index 04a7e7ccf..642a7b181 100644 --- a/services/camera_service/include/hcamera_service.h +++ b/services/camera_service/include/hcamera_service.h @@ -214,6 +214,16 @@ public: int32_t CallbackExit([[maybe_unused]] uint32_t code, [[maybe_unused]] int32_t result) override; int32_t SetUsePhysicalCameraOrientation(bool isUsed) override; bool GetUsePhysicalCameraOrientation(); + inline void SetSessionForControlCenter(sptr session) + { + std::lock_guard lock(videoSessionMutex_); + videoSessionForControlCenter_ = session; + } + inline sptr GetSessionForControlCenter() + { + std::lock_guard lock(videoSessionMutex_); + return videoSessionForControlCenter_; + } protected: explicit HCameraService(sptr cameraHostManager); void OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId) override; @@ -333,6 +343,7 @@ private: mutex muteCbMutex_; mutex serviceStatusMutex_; mutex controlCenterStatusMutex_; + mutex videoSessionMutex_; mutex usePhysicalCameraOrientationMutex_; recursive_mutex torchCbMutex_; recursive_mutex foldCbMutex_; @@ -361,7 +372,7 @@ private: bool isFoldable = false; bool isFoldableInit = false; bool isControlCenterEnabled_ = false; - bool controlCenterPrecondition = true; + std::atomic controlCenterPrecondition = true; bool deviceControlCenterAbility = false; bool usePhysicalCameraOrientation_ = false; string preCameraId_; diff --git a/services/camera_service/src/hcamera_service.cpp b/services/camera_service/src/hcamera_service.cpp index 7d19712e0..74e62cb5d 100644 --- a/services/camera_service/src/hcamera_service.cpp +++ b/services/camera_service/src/hcamera_service.cpp @@ -364,6 +364,9 @@ int32_t HCameraService::GetControlCenterStatusFromDataShareHelper(bool &status) lock_guard lock(g_dataShareHelperMutex); CHECK_RETURN_RET_ELOG(cameraDataShareHelper_ == nullptr, CAMERA_INVALID_ARG, "GetControlCenterStatusFromDataShareHelper NULL"); + sptr sessionForControlCenter = GetSessionForControlCenter(); + CHECK_RETURN_RET_ELOG(sessionForControlCenter == nullptr, CAMERA_INVALID_STATE, + "GetControlCenterStatusFromDataShareHelper failed, not in video session."); std::string value = ""; auto ret = cameraDataShareHelper_->QueryOnce(CONTROL_CENTER_DATA, value); @@ -375,7 +378,7 @@ int32_t HCameraService::GetControlCenterStatusFromDataShareHelper(bool &status) return CAMERA_OK; } - std::string bundleName = videoSessionForControlCenter_->GetBundleForControlCenter(); + std::string bundleName = sessionForControlCenter->GetBundleForControlCenter(); std::map> controlCenterMap = StringToControlCenterMap(value); if (controlCenterMap.find(bundleName) != controlCenterMap.end()) { @@ -406,10 +409,13 @@ int32_t HCameraService::UpdateDataShareAndTag(bool status, bool needPersistEnabl { MEDIA_INFO_LOG("HCameraService::UpdateDataShareAndTag"); lock_guard lock(g_dataShareHelperMutex); + sptr sessionForControlCenter = GetSessionForControlCenter(); CHECK_RETURN_RET_ELOG(cameraDataShareHelper_ == nullptr, CAMERA_ALLOC_ERROR, "GetMuteModeFromDataShareHelper NULL"); + CHECK_RETURN_RET_ELOG(sessionForControlCenter == nullptr, CAMERA_INVALID_STATE, + "GetControlCenterStatusFromDataShareHelper failed, not in video session."); - std::string bundleName = videoSessionForControlCenter_->GetBundleForControlCenter(); + std::string bundleName = sessionForControlCenter->GetBundleForControlCenter(); std::map> controlCenterMap; std::string value = ""; auto ret = cameraDataShareHelper_->QueryOnce(CONTROL_CENTER_DATA, value); @@ -429,13 +435,13 @@ int32_t HCameraService::UpdateDataShareAndTag(bool status, bool needPersistEnabl MEDIA_INFO_LOG("UpdateDataShareAndTag ret: %{public}d", ret); } if (status) { - videoSessionForControlCenter_->SetBeautyValue( + sessionForControlCenter->SetBeautyValue( BeautyType::AUTO_TYPE, controlCenterMap[bundleName][CONTROL_CENTER_BEAUTY_INDEX], false); - videoSessionForControlCenter_->SetVirtualApertureValue( + sessionForControlCenter->SetVirtualApertureValue( controlCenterMap[bundleName][CONTROL_CENTER_APERTURE_INDEX], false); } else if (needPersistEnable) { - videoSessionForControlCenter_->SetBeautyValue(BeautyType::AUTO_TYPE, 0, false); - videoSessionForControlCenter_->SetVirtualApertureValue(0, false); + sessionForControlCenter->SetBeautyValue(BeautyType::AUTO_TYPE, 0, false); + sessionForControlCenter->SetVirtualApertureValue(0, false); } } else if (needPersistEnable) { MEDIA_INFO_LOG("UpdateDataShareAndTag no bundle, create info for new bundle."); @@ -447,8 +453,11 @@ int32_t HCameraService::UpdateDataShareAndTag(bool status, bool needPersistEnabl int32_t HCameraService::CreateControlCenterDataShare(std::map> controlCenterMap, std::string bundleName, bool status) { + sptr sessionForControlCenter = GetSessionForControlCenter(); + CHECK_RETURN_RET_ELOG(sessionForControlCenter == nullptr, CAMERA_INVALID_STATE, + "CreateControlCenterDataShare failed, not in video session."); std::vector virtualMetadata = {}; - videoSessionForControlCenter_->GetVirtualApertureMetadate(virtualMetadata); + sessionForControlCenter->GetVirtualApertureMetadate(virtualMetadata); float biggestAperture = 0; CHECK_EXECUTE(virtualMetadata.size() > 0, biggestAperture = virtualMetadata.back()); @@ -457,11 +466,11 @@ int32_t HCameraService::CreateControlCenterDataShare(std::mapUpdateOnce(CONTROL_CENTER_DATA, controlCenterString); CHECK_RETURN_RET_ELOG(ret != CAMERA_OK, ret, "CreateControlCenterDataShare failed."); - videoSessionForControlCenter_->SetBeautyValue(BeautyType::AUTO_TYPE, 0, false); + sessionForControlCenter->SetBeautyValue(BeautyType::AUTO_TYPE, 0, false); if (status) { - videoSessionForControlCenter_->SetVirtualApertureValue(biggestAperture, false); + sessionForControlCenter->SetVirtualApertureValue(biggestAperture, false); } else { - videoSessionForControlCenter_->SetVirtualApertureValue(0, false); + sessionForControlCenter->SetVirtualApertureValue(0, false); } return ret; } @@ -743,14 +752,14 @@ int32_t HCameraService::CreateCaptureSession(sptr& session, int } session = captureSession; if (opMode == SceneMode::VIDEO) { - videoSessionForControlCenter_ = captureSession; - videoSessionForControlCenter_->SetUpdateControlCenterCallback( + SetSessionForControlCenter(captureSession); + captureSession->SetUpdateControlCenterCallback( std::bind(&HCameraService::UpdateControlCenterStatus, this, std::placeholders::_1)); std::string bundleName = BmsAdapter::GetInstance()->GetBundleName(IPCSkeleton::GetCallingUid()); - videoSessionForControlCenter_->SetBundleForControlCenter(bundleName); + captureSession->SetBundleForControlCenter(bundleName); MEDIA_INFO_LOG("Save videoSession for controlCenter"); } else { - videoSessionForControlCenter_ = nullptr; + SetSessionForControlCenter(nullptr); MEDIA_INFO_LOG("Clear videoSession of controlCenter"); } @@ -776,11 +785,12 @@ int32_t HCameraService::GetVideoSessionForControlCenter(sptr& s { std::lock_guard lock(mutex_); MEDIA_INFO_LOG("HCameraService::GetVideoSessionForControlCenter"); - if (videoSessionForControlCenter_ == nullptr) { + sptr sessionForControlCenter = GetSessionForControlCenter(); + if (sessionForControlCenter == nullptr) { MEDIA_ERR_LOG("GetVideoSessionForControlCenter failed, session == nullptr."); return CAMERA_INVALID_ARG; } - session = videoSessionForControlCenter_; + session = sessionForControlCenter; return CAMERA_OK; } @@ -1618,19 +1628,18 @@ int32_t HCameraService::EnableControlCenter(bool status, bool needPersistEnable) int32_t HCameraService::SetControlCenterPrecondition(bool condition) { - std::lock_guard lock(mutex_); MEDIA_INFO_LOG("HCameraService::SetControlCenterPrecondition %{public}d", condition); + sptr sessionForControlCenter = GetSessionForControlCenter(); controlCenterPrecondition = condition; - if (videoSessionForControlCenter_ != nullptr) { - videoSessionForControlCenter_->SetControlCenterPrecondition(controlCenterPrecondition); - } else { - MEDIA_WARNING_LOG(""); + if (sessionForControlCenter != nullptr) { + sessionForControlCenter->SetControlCenterPrecondition(controlCenterPrecondition); } CHECK_RETURN_RET_DLOG(controlCenterPrecondition || !isControlCenterEnabled_, CAMERA_OK, "SetControlCenterPrecondition success."); auto ret = EnableControlCenter(false, true); CHECK_RETURN_RET_ELOG(ret != CAMERA_OK, ret, "EnableControlCenter failed."); isControlCenterEnabled_ = false; + lock_guard lock(controlCenterStatusMutex_); for (auto it : controlcenterCallbacks_) { if (it.second == nullptr) { MEDIA_ERR_LOG("OnControlCenterStatusChanged pid:%{public}d Callbacks is null", it.first); @@ -1647,10 +1656,10 @@ int32_t HCameraService::SetControlCenterPrecondition(bool condition) int32_t HCameraService::SetDeviceControlCenterAbility(bool ability) { - std::lock_guard lock(mutex_); + sptr sessionForControlCenter = GetSessionForControlCenter(); deviceControlCenterAbility = ability; - if (videoSessionForControlCenter_ != nullptr) { - videoSessionForControlCenter_->SetDeviceControlCenterAbility(ability); + if (sessionForControlCenter != nullptr) { + sessionForControlCenter->SetDeviceControlCenterAbility(ability); } return CAMERA_OK; } -- Gitee