From dcde9ad97cf8092221b765f71bc92095ef58f678 Mon Sep 17 00:00:00 2001 From: zhangwt3652 Date: Fri, 5 Sep 2025 15:25:36 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9F=B3=E9=A2=91=E5=88=86=E5=B8=83=E5=BC=8F?= =?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: I9e32f14f866aef4cca446ec34bcecdbaa9bff5c4 --- .../device/src/device_status_listener.cpp | 39 +++++++++++++------ .../service_main/include/audio_core_service.h | 1 + .../service_main/src/audio_core_service.cpp | 5 +++ .../service_main/src/audio_policy_server.cpp | 2 + 4 files changed, 36 insertions(+), 11 deletions(-) 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..ec4471f183 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 @@ -113,25 +113,42 @@ static void ReceiveRemoteOffloadInfo(std::string &info, DStatusInfo &statusInfo) } } +static void ProcessDistributedInfoChanged(DeviceStatusListener *devListener, std::string &info, AudioPin hdiPin) +{ + CHECK_AND_RETURN(devListener != nullptr); + DStatusInfo statusInfo; + PnpEventType pnpEventType = PNP_EVENT_UNKNOWN; + statusInfo.connectType = ConnectType::CONNECT_TYPE_DISTRIBUTED; + if (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) { + AUDIO_ERR_LOG("[DeviceStatusListener]: Failed to scan info string"); + return; + } + + statusInfo.isConnected = (pnpEventType == PNP_EVENT_DEVICE_ADD) ? true : false; + if (hdiPin != AUDIO_PIN_NONE) { + statusInfo.hdiPin = hdiPin; + } + ReceiveRemoteOffloadInfo(info, statusInfo); + devListener->deviceObserver_.OnDeviceStatusUpdated(statusInfo); +} + static void ReceviceDistributedInfo(struct ServiceStatus* serviceStatus, std::string & info, DeviceStatusListener * devListener) { + CHECK_AND_RETURN_LOG(serviceStatus != nullptr, "ReceviceDistributedInfo invalid serviceStatus"); + CHECK_AND_RETURN_LOG(devListener != nullptr, "ReceviceDistributedInfo invalid devListener"); + AUDIO_INFO_LOG("serviceStatus->status = %{public}d", serviceStatus->status); + AUDIO_INFO_LOG("info = %{public}s", info.c_str()); DStatusInfo statusInfo; PnpEventType pnpEventType = PNP_EVENT_UNKNOWN; if (serviceStatus->status == SERVIE_STATUS_START) { AUDIO_DEBUG_LOG("distributed service online"); + ProcessDistributedInfoChanged(devListener, info, AUDIO_PIN_OUT_SPEAKER); + ProcessDistributedInfoChanged(devListener, info, AUDIO_PIN_IN_MIC); } 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, - statusInfo.networkId, sizeof(statusInfo.networkId), &(statusInfo.hdiPin), &(statusInfo.mappingVolumeId), - &(statusInfo.mappingInterruptId)) < D_EVENT_PARAMS) { - AUDIO_ERR_LOG("[DeviceStatusListener]: Failed to scan info string"); - return; - } - - statusInfo.isConnected = (pnpEventType == PNP_EVENT_DEVICE_ADD) ? true : false; - ReceiveRemoteOffloadInfo(info, statusInfo); - devListener->deviceObserver_.OnDeviceStatusUpdated(statusInfo); + ProcessDistributedInfoChanged(devListener, info, AUDIO_PIN_NONE); } 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, 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 b6031df78f..bd3bf052de 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 @@ -196,6 +196,7 @@ private: void DumpSelectHistory(std::string &dumpString); void SetAudioRouteCallback(uint32_t sessionId, const sptr &object); void UnsetAudioRouteCallback(uint32_t sessionId); + void RegisterDeviceStatusListener(); // Called by EventEntry - with lock // Stream operations 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 aef2d6c2b1..58709d3ac9 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 @@ -117,6 +117,11 @@ void AudioCoreService::Init() audioCapturerSession_.Init(audioA2dpOffloadManager_); isFastControlled_ = GetFastControlParam(); +} + +void AudioCoreService::RegisterDeviceStatusListener() +{ + CHECK_AND_RETURN_LOG(deviceStatusListener_ != nullptr, "deviceStatusListener_ is nullptr"); // Register device status listener int32_t status = deviceStatusListener_->RegisterDeviceStatusListener(); if (status != SUCCESS) { 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 907bd12767..de12412b62 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 @@ -935,6 +935,8 @@ void AudioPolicyServer::AddAudioServiceOnStart() ConnectServiceAdapter(); LoadEffectLibrary(); isFirstAudioServiceStart_ = true; + CHECK_AND_RETURN_LOG(coreService_ != nullptr, "coreService_ is nullptr"); + coreService_->RegisterDeviceStatusListener(); } else { AUDIO_WARNING_LOG("OnAddSystemAbility audio service is not first start"); } -- Gitee