diff --git a/services/audio_policy/server/domain/device/include/audio_active_device.h b/services/audio_policy/server/domain/device/include/audio_active_device.h index 321b00008cfe23d3848dcc73b25dbcc38eb01d4f..39e190580f3802f70827b08e8f91a94650c985ed 100644 --- a/services/audio_policy/server/domain/device/include/audio_active_device.h +++ b/services/audio_policy/server/domain/device/include/audio_active_device.h @@ -82,6 +82,8 @@ public: bool IsDeviceInVector(std::shared_ptr desc, std::vector> descs); void UpdateStreamDeviceMap(std::string source); + bool IsDeviceInActiveOutputDevices(DeviceType type, bool isRemote); + private: AudioActiveDevice() : audioDeviceManager_(AudioDeviceManager::GetAudioDeviceManager()), @@ -93,6 +95,9 @@ private: const AudioStreamDeviceChangeReason reason); void HandleActiveBt(DeviceType deviceType, std::string macAddress); void HandleNegtiveBt(DeviceType deviceType); + void UpdateVolumeTypeDeviceMap(std::shared_ptr desc); + void UpdateStreamUsageDeviceMap(std::shared_ptr desc); + private: std::mutex curOutputDevice_; // lock this mutex to operate currentActiveDevice_ AudioDeviceDescriptor currentActiveDevice_ = AudioDeviceDescriptor(DEVICE_TYPE_NONE, DEVICE_ROLE_NONE); @@ -102,8 +107,8 @@ private: std::string activeBTDevice_; std::string activeBTInDevice_; std::vector> activeOutputDevices_; - std::unordered_map> streamTypeDeviceMap_; - std::unordered_map> streamUsageDeviceMap_; + std::unordered_map>> volumeTypeDeviceMap_; + std::unordered_map>> streamUsageDeviceMap_; AudioDeviceManager &audioDeviceManager_; AudioAffinityManager &audioAffinityManager_; diff --git a/services/audio_policy/server/domain/device/src/audio_active_device.cpp b/services/audio_policy/server/domain/device/src/audio_active_device.cpp index 3fec386b98041cdbc8ee384e579d97ba6bd7e837..0f2ec3bb0a6fc845feb9aba00cfaf776fd8cd995 100644 --- a/services/audio_policy/server/domain/device/src/audio_active_device.cpp +++ b/services/audio_policy/server/domain/device/src/audio_active_device.cpp @@ -417,42 +417,76 @@ void AudioActiveDevice::UpdateActiveDevicesRoute(std::vector desc, std::vector> descs) { + CHECK_AND_RETURN_RET_LOG(desc != nullptr, false, "IsDeviceInVector: desc is null"); for (auto &it : descs) { CHECK_AND_RETURN_RET(!it->IsSameDeviceDesc(desc), true); } return false; } +void AudioActiveDevice::UpdateVolumeTypeDeviceMap(std::shared_ptr desc) +{ + CHECK_AND_RETURN_LOG(desc != nullptr, "streamDesc is null"); + CHECK_AND_RETURN_LOG(desc->newDeviceDescs_.front() != nullptr, "Devicedesc is null"); + + AudioVolumeType volumeType = VolumeUtils::GetVolumeTypeFromStreamUsage(desc->rendererInfo_.streamUsage); + CHECK_AND_RETURN_LOG(!IsDeviceInVector(desc->newDeviceDescs_.front(), volumeTypeDeviceMap_[volumeType]), + "descId %{public}d is exist", desc->newDeviceDescs_.front()->deviceId_); + + volumeTypeDeviceMap_[volumeType].push_back(desc->newDeviceDescs_.front()); + AUDIO_INFO_LOG("volumeDeviceMap: %{public}d add deviceId %{public}d", + volumeType, desc->newDeviceDescs_.front()->deviceId_); +} + +void AudioActiveDevice::UpdateStreamUsageDeviceMap(std::shared_ptr desc) +{ + CHECK_AND_RETURN_LOG(desc != nullptr, "desc is null"); + CHECK_AND_RETURN_LOG(desc->newDeviceDescs_.front() != nullptr, "Devicedesc is null"); + + CHECK_AND_RETURN_LOG(!IsDeviceInVector(desc->newDeviceDescs_.front(), + streamUsageDeviceMap_[desc->rendererInfo_.streamUsage]), + "descId %{public}d is exist", desc->newDeviceDescs_.front()->deviceId_); + + streamUsageDeviceMap_[desc->rendererInfo_.streamUsage].push_back(desc->newDeviceDescs_.front()); + AUDIO_INFO_LOG("streamUsageDeviceMap: %{public}d add deviceId %{public}d", + desc->rendererInfo_.streamUsage, desc->newDeviceDescs_.front()->deviceId_); +} + void AudioActiveDevice::UpdateStreamDeviceMap(std::string source) { AUDIO_INFO_LOG("update for %{public}s", source.c_str()); std::vector> descs = AudioPipeManager::GetPipeManager()->GetAllOutputStreamDescs(); activeOutputDevices_.clear(); + volumeTypeDeviceMap_.clear(); + streamUsageDeviceMap_.clear(); for (auto &desc : descs) { CHECK_AND_CONTINUE(desc != nullptr); AUDIO_INFO_LOG("session: %{public}d, calleruid: %{public}d, appuid: %{public}d " \ "usage:%{public}d devices:%{public}s", desc->sessionId_, desc->callerUid_, desc->appInfo_.appUid, desc->rendererInfo_.streamUsage, desc->GetNewDevicesInfo().c_str()); - AudioStreamType streamType = VolumeUtils::GetVolumeTypeFromStreamUsage(desc->rendererInfo_.streamUsage); - streamTypeDeviceMap_[streamType] = desc->newDeviceDescs_.back(); - streamUsageDeviceMap_[desc->rendererInfo_.streamUsage] = desc->newDeviceDescs_.front(); + + // front device is main device, second device use copy stream + UpdateVolumeTypeDeviceMap(desc); + UpdateStreamUsageDeviceMap(desc); + for (const auto &device : desc->newDeviceDescs_) { CHECK_AND_CONTINUE(!IsDeviceInVector(device, activeOutputDevices_)); activeOutputDevices_.push_back(device); + AUDIO_INFO_LOG("[activeOutputDevices_] deviceId: %{public}d", device->deviceId_); } } +} - for (auto &pair : streamTypeDeviceMap_) { - CHECK_AND_CONTINUE(!IsDeviceInVector(pair.second, activeOutputDevices_)); - streamTypeDeviceMap_[pair.first] = nullptr; - } - - for (auto &pair : streamUsageDeviceMap_) { - CHECK_AND_CONTINUE(!IsDeviceInVector(pair.second, activeOutputDevices_)); - streamUsageDeviceMap_[pair.first] = nullptr; - } +bool AudioActiveDevice::IsDeviceInActiveOutputDevices(DeviceType type, bool isRemote) +{ + auto isExist = std::find_if(activeOutputDevices_.begin(), activeOutputDevices_.end(), + [type, isRemote](std::shared_ptr &device) { + return device->deviceType_ == type && + isRemote == (device->networkId_ != LOCAL_NETWORK_ID); + }); + return isExist != activeOutputDevices_.end(); } } }