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 2ee590d3922ef3f23cf9ef982b554ce9454361ba..ec4471f183c8a2187d317f5f3f42dad6a2aa19a1 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 b6031df78f063888f6e63be091d207aec64871b4..bd3bf052de98e29af3256248a8814e96230926a0 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 aef2d6c2b1de0724e8b7f0c47ef84f232bfa6883..58709d3ac983c6c29f34dfdb4fc593eaeded7408 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 907bd12767a64465c8d04b0c71a29718e45cf22a..de12412b62fc96907328402921ac94fef4149a9d 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"); }