From 7dbb36928e91041ea41ab71b01913de33a9fad01 Mon Sep 17 00:00:00 2001 From: kw Date: Thu, 28 Aug 2025 19:55:03 +0800 Subject: [PATCH] GetPrivacyType Signed-off-by: kw --- .../ipc_proxy/include/audio_server_proxy.h | 1 + .../ipc_proxy/src/audio_server_proxy.cpp | 13 ++++ .../idl/IStandardAudioService.idl | 1 + .../libaudio_process_service.versionscript | 1 + .../server/include/audio_server.h | 1 + .../server/include/audio_service.h | 11 +++- .../audio_service/server/src/audio_server.cpp | 10 +++ .../server/src/audio_service.cpp | 61 ++++++++++++++++--- .../audio_server_more_fuzzer.cpp | 14 +++++ 9 files changed, 105 insertions(+), 8 deletions(-) diff --git a/services/audio_policy/server/infra/ipc_proxy/include/audio_server_proxy.h b/services/audio_policy/server/infra/ipc_proxy/include/audio_server_proxy.h index adc119bb64..c2216efefc 100644 --- a/services/audio_policy/server/infra/ipc_proxy/include/audio_server_proxy.h +++ b/services/audio_policy/server/infra/ipc_proxy/include/audio_server_proxy.h @@ -122,6 +122,7 @@ public: void SetBtHdiInvalidState(); int32_t ForceStopAudioStreamProxy(StopAudioType audioType); void SendInterruptEventToAudioServerProxy(InterruptEventInternal interruptEvent, int32_t sessionId); + int32_t GetPrivacyType(const uint32_t sessionId, AudioPrivacyType &privacyType); private: AudioServerProxy() {} ~AudioServerProxy() {} diff --git a/services/audio_policy/server/infra/ipc_proxy/src/audio_server_proxy.cpp b/services/audio_policy/server/infra/ipc_proxy/src/audio_server_proxy.cpp index 806c82237d..8eabfcd3bf 100644 --- a/services/audio_policy/server/infra/ipc_proxy/src/audio_server_proxy.cpp +++ b/services/audio_policy/server/infra/ipc_proxy/src/audio_server_proxy.cpp @@ -712,5 +712,18 @@ void AudioServerProxy::SendInterruptEventToAudioServerProxy(InterruptEventIntern IPCSkeleton::SetCallingIdentity(identity); } +int32_t AudioServerProxy::GetPrivacyType(const uint32_t sessionId, AudioPrivacyType &privacyType) +{ + const sptr gsp = GetAudioServerProxy(); + std::string identity = IPCSkeleton::ResetCallingIdentity(); + CHECK_AND_RETURN_RET_LOG(gsp != nullptr, ERR_OPERATION_FAILED, "error for audio server proxy null"); + int32_t ret = ERROR; + int32_t type; + gsp->GetPrivacyTypeAudioServer(sessionId, type, ret); + IPCSkeleton::SetCallingIdentity(identity); + CHECK_AND_RETURN_RET(ret == SUCCESS, ret); + privacyType = static_cast(type); + return ret; +} } } diff --git a/services/audio_service/idl/IStandardAudioService.idl b/services/audio_service/idl/IStandardAudioService.idl index f7a209b482..83b9f171d2 100644 --- a/services/audio_service/idl/IStandardAudioService.idl +++ b/services/audio_service/idl/IStandardAudioService.idl @@ -146,4 +146,5 @@ interface IStandardAudioService { [ipccode 1000] void SetForegroundList([in] List list); void GetVolumeDataCount([in] String sinkName, [out] long ret); void SendInterruptEventToAudioServer([in] unsigned int sessionId, [in] InterruptEventInternal interruptEvent); + void GetPrivacyTypeAudioServer([in] unsigned int sessionId, [out] int privacyType, [out] int ret); } diff --git a/services/audio_service/libaudio_process_service.versionscript b/services/audio_service/libaudio_process_service.versionscript index 184587e4fa..35613c701d 100644 --- a/services/audio_service/libaudio_process_service.versionscript +++ b/services/audio_service/libaudio_process_service.versionscript @@ -84,6 +84,7 @@ *UpdateBackgroundCaptureMap*; *SendInterruptEventToAudioServer*; *SendInterruptEventToAudioService*; + *GetPrivacyType*; local: *; }; \ No newline at end of file diff --git a/services/audio_service/server/include/audio_server.h b/services/audio_service/server/include/audio_server.h index 234c946f1c..dd035a8a7c 100644 --- a/services/audio_service/server/include/audio_server.h +++ b/services/audio_service/server/include/audio_server.h @@ -363,6 +363,7 @@ private: const std::vector &subKeys, std::vector> &result); int32_t ImproveAudioWorkgroupPrio(int32_t pid, const std::unordered_map &threads) override; int32_t RestoreAudioWorkgroupPrio(int32_t pid, const std::unordered_map &threads) override; + int32_t GetPrivacyTypeAudioServer(uint32_t sessionId, int32_t &privacyType, int32_t &ret) override; private: static constexpr int32_t MEDIA_SERVICE_UID = 1013; static constexpr int32_t VASSISTANT_UID = 3001; diff --git a/services/audio_service/server/include/audio_service.h b/services/audio_service/server/include/audio_service.h index 836aeaedd4..2b816d7ccb 100644 --- a/services/audio_service/server/include/audio_service.h +++ b/services/audio_service/server/include/audio_service.h @@ -159,7 +159,7 @@ public: bool UpdateBackgroundCaptureMap(uint32_t sessionId, bool res); void RemoveBackgroundCaptureMap(uint32_t sessionId); bool NeedRemoveBackgroundCaptureMap(uint32_t sessionId, CapturerState capturerState); - + int32_t GetPrivacyType(const uint32_t sessionId, AudioPrivacyType &privacyType); private: AudioService(); void DelayCallReleaseEndpoint(std::string endpointName); @@ -200,6 +200,14 @@ private: float GetSystemVolume(); void UpdateSystemVolume(AudioStreamType streamType, float volume); void UpdateSessionMuteStatus(const uint32_t sessionId, const bool muteFlag); + std::shared_ptr GetRendererInServerBySessionId(const uint32_t sessionId); + int32_t GetPrivacyTypeForNormalStream(const uint32_t sessionId, AudioPrivacyType &privacyType); + +#ifdef SUPPORT_LOW_LATENCY + sptr GetProcessInServerBySessionId(const uint32_t sessionId); + int32_t GetPrivacyTypeForFastStream(const uint32_t sessionId, AudioPrivacyType &privacyType); +#endif + private: std::mutex foregroundSetMutex_; std::set foregroundSet_; @@ -222,6 +230,7 @@ private: #ifdef SUPPORT_LOW_LATENCY std::vector, std::shared_ptr>> linkedPairedList_; std::map> endpointList_; + std::unordered_map> allProcessInServer_; #endif // for inner-capturer diff --git a/services/audio_service/server/src/audio_server.cpp b/services/audio_service/server/src/audio_server.cpp index 72378952a2..3d2d882c2a 100644 --- a/services/audio_service/server/src/audio_server.cpp +++ b/services/audio_service/server/src/audio_server.cpp @@ -3112,6 +3112,16 @@ int32_t AudioServer::RestoreAudioWorkgroupPrio(int32_t pid, const std::unordered { return AudioResourceService::GetInstance()->RestoreAudioWorkgroupPrio(pid, threads); } + +int32_t AudioServer::GetPrivacyTypeAudioServer(uint32_t sessionId, int32_t &privacyType, int32_t &ret) +{ + CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_SYSTEM_PERMISSION_DENIED, "not audio calling!"); + AudioPrivacyType type = PRIVACY_TYPE_PUBLIC; + ret = AudioService::GetInstance()->GetPrivacyType(sessionId, type); + CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, SUCCESS, "%{public}u err", sessionId); + privacyType = static_cast(type); + return SUCCESS; +} // LCOV_EXCL_STOP } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_service/server/src/audio_service.cpp b/services/audio_service/server/src/audio_service.cpp index f505381df6..4b01d8702a 100644 --- a/services/audio_service/server/src/audio_service.cpp +++ b/services/audio_service/server/src/audio_service.cpp @@ -96,7 +96,8 @@ int32_t AudioService::OnProcessRelease(IAudioProcessStream *process, bool isSwit while (paired != linkedPairedList_.end()) { if ((*paired).first == process) { AUDIO_INFO_LOG("SessionId %{public}u", (*paired).first->GetSessionId()); - AudioPerformanceMonitor::GetInstance().DeleteSilenceMonitor(process->GetAudioSessionId()); + uint32_t sessionId = process->GetAudioSessionId(); + AudioPerformanceMonitor::GetInstance().DeleteSilenceMonitor(sessionId); auto processConfig = process->GetAudioProcessConfig(); if (processConfig.audioMode == AUDIO_MODE_PLAYBACK) { SetDecMaxRendererStreamCnt(); @@ -117,6 +118,7 @@ int32_t AudioService::OnProcessRelease(IAudioProcessStream *process, bool isSwit delayTime = GetReleaseDelayTime((*paired).second, isSwitchStream, processConfig.audioMode == AUDIO_MODE_RECORD); } + allProcessInServer_.erase(sessionId); linkedPairedList_.erase(paired); isFind = true; break; @@ -124,11 +126,8 @@ int32_t AudioService::OnProcessRelease(IAudioProcessStream *process, bool isSwit paired++; } } - if (isFind) { - AUDIO_INFO_LOG("find and release process result %{public}d", ret); - } else { - AUDIO_INFO_LOG("can not find target process, maybe already released."); - } + JUDGE_AND_INFO_LOG(isFind, "find and release process result %{public}d", ret); + JUDGE_AND_INFO_LOG(!isFind, "can not find target process, maybe already released."); if (needRelease) { ReleaseProcess(endpointName, delayTime); } @@ -1031,7 +1030,8 @@ sptr AudioService::GetAudioProcess(const AudioProcessConfi sptr process = AudioProcessInServer::Create(config, this); CHECK_AND_RETURN_RET_LOG(process != nullptr, nullptr, "AudioProcessInServer create failed."); - CheckFastSessionMuteState(process->GetSessionId(), process); + uint32_t sessionId = process->GetSessionId(); + CheckFastSessionMuteState(sessionId, process); std::shared_ptr buffer = nullptr; int32_t ret = process->ConfigProcessBuffer(totalSizeInframe, spanSizeInframe, audioStreamInfo, buffer); @@ -1040,6 +1040,7 @@ sptr AudioService::GetAudioProcess(const AudioProcessConfi ret = LinkProcessToEndpoint(process, audioEndpoint); CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, nullptr, "LinkProcessToEndpoint failed"); linkedPairedList_.push_back(std::make_pair(process, audioEndpoint)); + allProcessInServer_[sessionId] = process; #ifdef HAS_FEATURE_INNERCAPTURER CheckInnerCapForProcess(process, audioEndpoint); #endif @@ -1936,5 +1937,51 @@ void AudioService::InitAllDupBuffer(int32_t innerCapId) } lock.unlock(); } + +#ifdef SUPPORT_LOW_LATENCY +sptr AudioService::GetProcessInServerBySessionId(const uint32_t sessionId) +{ + std::lock_guard processListLock(processListMutex_); + CHECK_AND_RETURN_RET(allProcessInServer_.count(sessionId) > 0, nullptr); + return allProcessInServer_[sessionId].promote(); +} + +int32_t AudioService::GetPrivacyTypeForFastStream(const uint32_t sessionId, AudioPrivacyType &privacyType) +{ + auto processInServer = GetProcessInServerBySessionId(sessionId); + CHECK_AND_RETURN_RET(processInServer != nullptr, ERROR); + privacyType = processInServer->processConfig_.privacyType; + return SUCCESS; +} +#endif + +std::shared_ptr AudioService::GetRendererInServerBySessionId(const uint32_t sessionId) +{ + std::lock_guard lock(rendererMapMutex_); + CHECK_AND_RETURN_RET(allRendererMap_.count(sessionId) > 0, nullptr); + return allRendererMap_[sessionId].lock(); +} + +int32_t AudioService::GetPrivacyTypeForNormalStream(const uint32_t sessionId, AudioPrivacyType &privacyType) +{ + auto rendererInServer = GetRendererInServerBySessionId(sessionId); + CHECK_AND_RETURN_RET(rendererInServer != nullptr, ERROR); + privacyType = rendererInServer->processConfig_.privacyType; + return SUCCESS; +} + +int32_t AudioService::GetPrivacyType(const uint32_t sessionId, AudioPrivacyType &privacyType) +{ + int32_t ret = GetPrivacyTypeForNormalStream(sessionId, privacyType); + CHECK_AND_RETURN_RET(ret != SUCCESS, ret); + +#ifdef SUPPORT_LOW_LATENCY + ret = GetPrivacyTypeForFastStream(sessionId, privacyType); + CHECK_AND_RETURN_RET(ret != SUCCESS, ret); +#endif + + AUDIO_ERR_LOG("%{public}u not found", sessionId); + return ERROR; +} } // namespace AudioStandard } // namespace OHOS diff --git a/test/fuzztest/audioservermore_fuzzer/audio_server_more_fuzzer.cpp b/test/fuzztest/audioservermore_fuzzer/audio_server_more_fuzzer.cpp index a7d0867b10..a2c8a6a3e3 100644 --- a/test/fuzztest/audioservermore_fuzzer/audio_server_more_fuzzer.cpp +++ b/test/fuzztest/audioservermore_fuzzer/audio_server_more_fuzzer.cpp @@ -931,6 +931,19 @@ void AudioServerGetVolumeBySessionIdFuzzTest(const uint8_t *rawData, size_t size audioServerPtr->GetVolumeBySessionId(sessionId, volume); } +void GetPrivacyTypeAudioServerFuzzTest(const uint8_t *rawData, size_t size) +{ + if (rawData == nullptr || size < LIMITSIZE) { + return; + } + uint32_t sessionId = GetData(); + std::shared_ptr audioServerPtr = std::make_shared(SYSTEM_ABILITY_ID, RUN_ON_CREATE); + CHECK_AND_RETURN(audioServerPtr != nullptr); + int32_t privacyType; + int32_t ret; + audioServerPtr->GetPrivacyTypeAudioServer(sessionId, privacyType, ret); +} + } // namespace AudioStandard } // namesapce OHOS @@ -983,5 +996,6 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) OHOS::AudioStandard::AudioServerHpaeDumpSourceOutputsInfoCbFuzzTest(data, size); OHOS::AudioStandard::AudioServerRemoveThreadFromGroupFuzzTest(data, size); OHOS::AudioStandard::AudioServerGetVolumeBySessionIdFuzzTest(data, size); + OHOS::AudioStandard::GetPrivacyTypeAudioServerFuzzTest(data, size); return 0; } -- Gitee