From fa7d88437409efbb0c2d818817b5a3264c4fcd73 Mon Sep 17 00:00:00 2001 From: zhangwt3652 Date: Fri, 29 Aug 2025 17:03:43 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=86=E5=B8=83=E5=BC=8F=E9=9F=B3=E9=A2=91?= =?UTF-8?q?=E8=AE=BE=E5=A4=87=E8=87=AA=E6=81=A2=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhangwt3652 Change-Id: If9014e105451b5800f3b09d09725aa8f398a6fd5 --- .../device/include/device_status_listener.h | 6 +++ .../device/src/audio_recovery_device.cpp | 1 + .../device/src/device_status_listener.cpp | 46 +++++++++++++++++++ .../service_main/include/audio_core_service.h | 1 + .../service_main/src/audio_core_service.cpp | 11 +++++ .../service_main/src/audio_policy_server.cpp | 3 ++ 6 files changed, 68 insertions(+) diff --git a/services/audio_policy/server/domain/device/include/device_status_listener.h b/services/audio_policy/server/domain/device/include/device_status_listener.h index e6d11e0e86..47409ba95d 100644 --- a/services/audio_policy/server/domain/device/include/device_status_listener.h +++ b/services/audio_policy/server/domain/device/include/device_status_listener.h @@ -46,6 +46,11 @@ public: int32_t SetAudioDeviceAnahsCallback(const sptr &object); int32_t UnsetAudioDeviceAnahsCallback(); void UpdateAnahsPlatformType(std::string anahsShowType); + bool SendDistributedInfo(const std::string &deviceInfo); + void SetDistributedOnline(bool isOnline); + bool GetDistributedOnline() const; + void WriteDeviceStatusChangeSysEvent(const std::string &deviceInfo, const DStatusInfo &statusInfo, + int serviceStatus); private: #ifdef AUDIO_WIRED_DETECT @@ -56,6 +61,7 @@ private: struct ServiceStatusListener *listener_; sptr audioDeviceAnahsCb_; std::string anahsShowType_ = "Dialog"; + std::atomic_bool isDistributedOnline_ = false; }; #ifdef AUDIO_WIRED_DETECT diff --git a/services/audio_policy/server/domain/device/src/audio_recovery_device.cpp b/services/audio_policy/server/domain/device/src/audio_recovery_device.cpp index 4d697ebc54..48571272df 100644 --- a/services/audio_policy/server/domain/device/src/audio_recovery_device.cpp +++ b/services/audio_policy/server/domain/device/src/audio_recovery_device.cpp @@ -79,6 +79,7 @@ void AudioRecoveryDevice::RecoveryPreferredDevices() tryCounter--; Media::MediaMonitor::MediaMonitorManager::GetInstance().GetAudioRouteMsg(preferredDevices); if (preferredDevices.size() == 0) { + AUDIO_ERR_LOG("The length of preferredDevices is 0 and does not need to be set."); continue; } for (auto iter = preferredDevices.begin(); iter != preferredDevices.end(); ++iter) { diff --git a/services/audio_policy/server/domain/device/src/device_status_listener.cpp b/services/audio_policy/server/domain/device/src/device_status_listener.cpp index 2ee590d392..a4b56f0daa 100644 --- a/services/audio_policy/server/domain/device/src/device_status_listener.cpp +++ b/services/audio_policy/server/domain/device/src/device_status_listener.cpp @@ -36,6 +36,7 @@ namespace { #include "audio_errors.h" #include "audio_policy_log.h" #include "audio_core_service.h" +#include "media_monitor_manager.h" namespace OHOS { namespace AudioStandard { @@ -116,10 +117,13 @@ static void ReceiveRemoteOffloadInfo(std::string &info, DStatusInfo &statusInfo) static void ReceviceDistributedInfo(struct ServiceStatus* serviceStatus, std::string & info, DeviceStatusListener * devListener) { + CHECK_AND_RETURN_LOG(serviceStatus != nullptr, "serviceStatus is nullptr"); + CHECK_AND_RETURN_LOG(devListener != nullptr, "devListener is nullptr"); DStatusInfo statusInfo; PnpEventType pnpEventType = PNP_EVENT_UNKNOWN; if (serviceStatus->status == SERVIE_STATUS_START) { AUDIO_DEBUG_LOG("distributed service online"); + devListener->SetDistributedOnline(true); } else if (serviceStatus->status == SERVIE_STATUS_CHANGE && !info.empty()) { statusInfo.connectType = ConnectType::CONNECT_TYPE_DISTRIBUTED; if (sscanf_s(info.c_str(), "EVENT_TYPE=%d;NID=%[^;];PIN=%d;VID=%d;IID=%d", &pnpEventType, @@ -132,12 +136,15 @@ static void ReceviceDistributedInfo(struct ServiceStatus* serviceStatus, std::st statusInfo.isConnected = (pnpEventType == PNP_EVENT_DEVICE_ADD) ? true : false; ReceiveRemoteOffloadInfo(info, statusInfo); devListener->deviceObserver_.OnDeviceStatusUpdated(statusInfo); + devListener->WriteDeviceStatusChangeSysEvent(info, statusInfo, serviceStatus->status); } else if (serviceStatus->status == SERVIE_STATUS_STOP) { AUDIO_DEBUG_LOG("distributed service offline"); JUDGE_AND_ERR_LOG(sscanf_s(info.c_str(), "EVENT_TYPE=%d;NID=%[^;];PIN=%d;VID=%d;IID=%d", &pnpEventType, statusInfo.networkId, sizeof(statusInfo.networkId), &(statusInfo.hdiPin), &(statusInfo.mappingVolumeId), &(statusInfo.mappingInterruptId)) < D_EVENT_PARAMS, "[DeviceStatusListener]: Failed to scan info string"); devListener->deviceObserver_.OnDeviceStatusUpdated(statusInfo, true); + devListener->SetDistributedOnline(false); + devListener->WriteDeviceStatusChangeSysEvent(info, statusInfo, serviceStatus->status); } } @@ -360,6 +367,45 @@ void DeviceStatusListener::OnMicrophoneBlocked(const std::string &info) deviceObserver_.OnMicrophoneBlockedUpdate(micBlockedDeviceType, status); } +bool DeviceStatusListener::SendDistributedInfo(const std::string &deviceInfo) +{ + CHECK_AND_RETURN_RET_LOG(isDistributedOnline_, false, "distributed service offline"); + struct ServiceStatus serviceStatus = {}; + std::string info = deviceInfo; + serviceStatus.status = static_cast(SERVIE_STATUS_CHANGE); + ReceviceDistributedInfo(&serviceStatus, info, this); + return true; +} + +void DeviceStatusListener::SetDistributedOnline(bool isOnline) +{ + AUDIO_DEBUG_LOG("distributed service status changed to %{public}d", isOnline); + isDistributedOnline_.store(isOnline); +} + +bool DeviceStatusListener::GetDistributedOnline() const +{ + return isDistributedOnline_; +} + +void DeviceStatusListener::WriteDeviceStatusChangeSysEvent(const std::string &deviceInfo, + const DStatusInfo &statusInfo, int serviceStatus) +{ + AUDIO_INFO_LOG("deviceInfo:%{public}s, networkId:%{public}s, hdiPin:%{public}d,"\ + "serviceStatus:%{public}d", deviceInfo.c_str(), statusInfo.networkId, statusInfo.hdiPin, + serviceStatus); + std::shared_ptr bean = std::make_shared( + Media::MediaMonitor::ModuleId::AUDIO, Media::MediaMonitor::DISTRIBUTED_DEVICE_STATE, + Media::MediaMonitor::BEHAVIOR_EVENT); + CHECK_AND_RETURN_LOG(bean != nullptr, "bean is nullptr"); + bean->Add("IS_ADD", statusInfo.isConnected); + bean->Add("NETWORK_ID", statusInfo.networkId); + bean->Add("HDI_PIN", statusInfo.hdiPin); + bean->Add("SERVICE_STATUS", serviceStatus); + bean->Add("DEVICE_INFO", deviceInfo); + Media::MediaMonitor::MediaMonitorManager::GetInstance().WriteLogMsg(bean); +} + #ifdef AUDIO_WIRED_DETECT AudioPnpStatusCallback::AudioPnpStatusCallback() { diff --git a/services/audio_policy/server/service/service_main/include/audio_core_service.h b/services/audio_policy/server/service/service_main/include/audio_core_service.h index dd623410ae..31d320d723 100644 --- a/services/audio_policy/server/service/service_main/include/audio_core_service.h +++ b/services/audio_policy/server/service/service_main/include/audio_core_service.h @@ -258,6 +258,7 @@ private: int32_t UnexcludeOutputDevices(AudioDeviceUsage audioDevUsage, std::vector> &audioDeviceDescriptors); int32_t SetSessionDefaultOutputDevice(const int32_t callerPid, const DeviceType &deviceType); + void RestoreDistributedDevice(); // Functions related to get operations - device related std::vector> GetDevices(DeviceFlag deviceFlag); diff --git a/services/audio_policy/server/service/service_main/src/audio_core_service.cpp b/services/audio_policy/server/service/service_main/src/audio_core_service.cpp index 060909bc53..ae0dae489e 100644 --- a/services/audio_policy/server/service/service_main/src/audio_core_service.cpp +++ b/services/audio_policy/server/service/service_main/src/audio_core_service.cpp @@ -729,6 +729,17 @@ int32_t AudioCoreService::SetSessionDefaultOutputDevice(const int32_t callerPid, return audioSessionService_->SetSessionDefaultOutputDevice(callerPid, deviceType); } +void AudioCoreService::RestoreDistributedDevice() +{ + CHECK_AND_RETURN_LOG(deviceStatusListener_ != nullptr, "deviceStatusListener_ is nullptr"); + AUDIO_INFO_LOG("restore distributed device"); + std::vector deviceInfos; + Media::MediaMonitor::MediaMonitorManager::GetInstance().GetDistributedDeviceInfo(deviceInfos); + for (const auto &deviceInfo : deviceInfos) { + deviceStatusListener_->SendDistributedInfo(deviceInfo); + } +} + int32_t AudioCoreService::GetPreferredInputStreamType(AudioCapturerInfo &capturerInfo) { // Use GetPreferredInputDeviceDescriptors instead of currentActiveDevice, if prefer != current, recreate stream diff --git a/services/audio_policy/server/service/service_main/src/audio_policy_server.cpp b/services/audio_policy/server/service/service_main/src/audio_policy_server.cpp index 2153facd09..03dbe025bd 100644 --- a/services/audio_policy/server/service/service_main/src/audio_policy_server.cpp +++ b/services/audio_policy/server/service/service_main/src/audio_policy_server.cpp @@ -933,7 +933,10 @@ void AudioPolicyServer::AddAudioServiceOnStart() RegisterParamCallback(); ConnectServiceAdapter(); LoadEffectLibrary(); + AUDIO_INFO_LOG("lzz OnAddSystemAbility audio service is not first start"); isFirstAudioServiceStart_ = true; + CHECK_AND_RETURN_LOG(coreService_ != nullptr, "coreService_ is nullptr"); + coreService_->RestoreDistributedDevice(); } else { AUDIO_WARNING_LOG("OnAddSystemAbility audio service is not first start"); } -- Gitee