diff --git a/interfaces/inner_api/native/audiocommon/include/audio_device_info.h b/interfaces/inner_api/native/audiocommon/include/audio_device_info.h index 3b47d1a5efbcfc6a32e35673ee188ae4aa99710c..f9a7846520d078b270c4c46f2b5b006ba7a8f3cb 100644 --- a/interfaces/inner_api/native/audiocommon/include/audio_device_info.h +++ b/interfaces/inner_api/native/audiocommon/include/audio_device_info.h @@ -216,6 +216,14 @@ enum DeviceInfoUpdateCommand { CATEGORY_UPDATE = 1, CONNECTSTATE_UPDATE, ENABLE_UPDATE, + EXCEPTION_FLAG_UPDATE, +}; + +enum ConnectState { + CONNECTED, + SUSPEND_CONNECTED, + VIRTUAL_CONNECTED, + DEACTIVE_CONNECTED }; struct DevicePrivacyInfo { @@ -314,6 +322,7 @@ public: int32_t interruptGroupId; int32_t volumeGroupId; bool isLowLatencyDevice; + ConnectState connectState = CONNECTED; DeviceInfo() = default; ~DeviceInfo() = default; diff --git a/interfaces/inner_api/native/audiocommon/include/audio_info.h b/interfaces/inner_api/native/audiocommon/include/audio_info.h index e55916bd209ca63ec1aaf42cdab1b037600ca16a..8b401a7c52d557ee21643e92d39f592b07ae3117 100644 --- a/interfaces/inner_api/native/audiocommon/include/audio_info.h +++ b/interfaces/inner_api/native/audiocommon/include/audio_info.h @@ -277,6 +277,18 @@ struct AudioRendererInfo { ContentType contentType = CONTENT_TYPE_UNKNOWN; StreamUsage streamUsage = STREAM_USAGE_UNKNOWN; int32_t rendererFlags = 0; + bool Marshalling(Parcel &parcel) const + { + return parcel.WriteInt32(static_cast(contentType)) + && parcel.WriteInt32(static_cast(streamUsage)) + && parcel.WriteInt32(rendererFlags); + } + void Unmarshalling(Parcel &parcel) + { + contentType = static_cast(parcel.ReadInt32()); + streamUsage = static_cast(parcel.ReadInt32()); + rendererFlags = parcel.ReadInt32(); + } }; class AudioCapturerInfo { diff --git a/interfaces/inner_api/native/audiomanager/include/audio_system_manager.h b/interfaces/inner_api/native/audiomanager/include/audio_system_manager.h index dafbe12e164aae7245fae30ac8458f94b26fa497..4f063bdd834cdbece53c9cc2af7b1c785a6fd2df 100644 --- a/interfaces/inner_api/native/audiomanager/include/audio_system_manager.h +++ b/interfaces/inner_api/native/audiomanager/include/audio_system_manager.h @@ -31,12 +31,6 @@ namespace OHOS { namespace AudioStandard { -enum ConnectState { - CONNECTED, - SUSPEND_CONNECTED, - VIRTUAL_CONNECTED, - DEACTIVE_CONNECTED -}; class AudioDeviceDescriptor; class AudioDeviceDescriptor : public Parcelable { diff --git a/services/audio_policy/client/src/audio_policy_proxy.cpp b/services/audio_policy/client/src/audio_policy_proxy.cpp index 4c5aa75b707c63ec7431740e3545cb29ccd101fe..4c1d72ea3d9d370fc7014da5fc38f49cc03ba935 100644 --- a/services/audio_policy/client/src/audio_policy_proxy.cpp +++ b/services/audio_policy/client/src/audio_policy_proxy.cpp @@ -514,8 +514,12 @@ std::vector> AudioPolicyProxy::GetPreferredOutputDev AUDIO_ERR_LOG("AudioPolicyProxy: WriteInterfaceToken failed"); return deviceInfo; } - sptr audioRendererFilter = new(std::nothrow) AudioRendererFilter(); - audioRendererFilter->uid = -1; + + if (!rendererInfo.Marshalling(data)) { + AUDIO_ERR_LOG("AudioRendererInfo Marshalling() failed"); + return deviceInfo; + } + int32_t error = Remote()->SendRequest( static_cast(AudioPolicyInterfaceCode::GET_ACTIVE_OUTPUT_DEVICE_DESCRIPTORS), data, reply, option); if (error != ERR_NONE) { @@ -544,6 +548,11 @@ std::vector> AudioPolicyProxy::GetPreferredInputDevi return deviceInfo; } + if (!captureInfo.Marshalling(data)) { + AUDIO_ERR_LOG("AudioCapturerInfo Marshalling() failed"); + return deviceInfo; + } + int32_t error = Remote()->SendRequest( static_cast(AudioPolicyInterfaceCode::GET_PREFERRED_INTPUT_DEVICE_DESCRIPTORS), data, reply, option); if (error != ERR_NONE) { diff --git a/services/audio_policy/server/include/service/audio_device_manager.h b/services/audio_policy/server/include/service/audio_device_manager.h index 4384e783858b4a7df190e256379be01feab1b972..7ae1632c498db694c14dfb361c48a22e08179d68 100644 --- a/services/audio_policy/server/include/service/audio_device_manager.h +++ b/services/audio_policy/server/include/service/audio_device_manager.h @@ -115,6 +115,7 @@ private: void UpdateConnectState(const shared_ptr &devDesc); void UpdateDeviceCategory(const sptr &deviceDescriptor); void UpdateEnableState(const shared_ptr &deviceDescriptor); + void UpdateExceptionFlag(const shared_ptr &deviceDescriptor); list privacyDeviceList_; list publicDeviceList_; @@ -136,6 +137,7 @@ private: sptr earpiece_ = nullptr; sptr speaker_ = nullptr; sptr defalutMic_ = nullptr; + std::mutex deviceInfoUpdateMutex_; }; } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_policy/server/src/audio_policy_manager_stub.cpp b/services/audio_policy/server/src/audio_policy_manager_stub.cpp index 951f788925e242bde278a74b1721aa2e56a515c5..31c0fa39ea68ad4d63faa3218ea556cdb63a91fd 100644 --- a/services/audio_policy/server/src/audio_policy_manager_stub.cpp +++ b/services/audio_policy/server/src/audio_policy_manager_stub.cpp @@ -249,6 +249,7 @@ void AudioPolicyManagerStub::GetPreferredOutputDeviceDescriptorsInternal(Message { AUDIO_DEBUG_LOG("GET_ACTIVE_OUTPUT_DEVICE_DESCRIPTORS AudioManagerStub"); AudioRendererInfo rendererInfo; + rendererInfo.Unmarshalling(data); std::vector> devices = GetPreferredOutputDeviceDescriptors(rendererInfo); int32_t size = static_cast(devices.size()); AUDIO_DEBUG_LOG("GET_ACTIVE_OUTPUT_DEVICE_DESCRIPTORS size= %{public}d", size); @@ -261,6 +262,7 @@ void AudioPolicyManagerStub::GetPreferredOutputDeviceDescriptorsInternal(Message void AudioPolicyManagerStub::GetPreferredInputDeviceDescriptorsInternal(MessageParcel &data, MessageParcel &reply) { AudioCapturerInfo captureInfo; + captureInfo.Unmarshalling(data); std::vector> devices = GetPreferredInputDeviceDescriptors(captureInfo); size_t size = static_cast(devices.size()); AUDIO_DEBUG_LOG("GET_PREFERRED_INTPUT_DEVICE_DESCRIPTORS size= %{public}zu", size); diff --git a/services/audio_policy/server/src/service/audio_device_manager.cpp b/services/audio_policy/server/src/service/audio_device_manager.cpp index 6e0d0b83e6cc5f53793a5e1030150d131da173c3..10a7980004599d30ea5454bb75150a79081741ae 100644 --- a/services/audio_policy/server/src/service/audio_device_manager.cpp +++ b/services/audio_policy/server/src/service/audio_device_manager.cpp @@ -659,6 +659,9 @@ void AudioDeviceManager::UpdateDevicesListInfo(const sptr case ENABLE_UPDATE: UpdateEnableState(devDesc); break; + case EXCEPTION_FLAG_UPDATE: + UpdateExceptionFlag(devDesc); + break; default: break; } @@ -729,6 +732,24 @@ void AudioDeviceManager::UpdateEnableState(const shared_ptr &deviceDescriptor) +{ + lock_guard lock(deviceInfoUpdateMutex_); + for (auto &desc : connectedDevices_) { + if (deviceDescriptor->deviceType_ == DEVICE_TYPE_BLUETOOTH_A2DP || + deviceDescriptor->deviceType_ == DEVICE_TYPE_BLUETOOTH_SCO) { + if (desc->macAddress_ == deviceDescriptor->macAddress_ && + desc->exceptionFlag_ != deviceDescriptor->exceptionFlag_) { + desc->exceptionFlag_ = deviceDescriptor->exceptionFlag_; + } + } else if (desc->deviceType_ == deviceDescriptor->deviceType_ && + desc->networkId_ == deviceDescriptor->networkId_ && + desc->exceptionFlag_ != deviceDescriptor->exceptionFlag_) { + desc->exceptionFlag_ = deviceDescriptor->exceptionFlag_; + } + } +} + void AudioDeviceManager::AddBtToOtherList(const shared_ptr &devDesc) { if (devDesc->networkId_ != LOCAL_NETWORK_ID) { diff --git a/services/audio_policy/server/src/service/audio_policy_service.cpp b/services/audio_policy/server/src/service/audio_policy_service.cpp index 9a7aeb7989a03bc402cda2fe70cae043d9f60bb8..5846625f6d6a298197881ed1b6566517a15018e6 100644 --- a/services/audio_policy/server/src/service/audio_policy_service.cpp +++ b/services/audio_policy/server/src/service/audio_policy_service.cpp @@ -1648,10 +1648,12 @@ void AudioPolicyService::FetchInputDeviceWhenNoRunningStream() int32_t AudioPolicyService::ActivateA2dpDevice(unique_ptr &desc, vector> &rendererChangeInfos, bool isStreamStatusUpdated) { - int32_t ret = SwitchActiveA2dpDevice(new AudioDeviceDescriptor(*desc)); + sptr deviceDesc = new AudioDeviceDescriptor(*desc); + int32_t ret = SwitchActiveA2dpDevice(deviceDesc); if (ret != SUCCESS) { AUDIO_ERR_LOG("Active A2DP device failed, retrigger fetch output device"); - desc->exceptionFlag_ = true; + deviceDesc->exceptionFlag_ = true; + audioDeviceManager_.UpdateDevicesListInfo(deviceDesc, EXCEPTION_FLAG_UPDATE); FetchOutputDevice(rendererChangeInfos, isStreamStatusUpdated); return ERROR; } @@ -1666,6 +1668,7 @@ int32_t AudioPolicyService::HandleScoDeviceFetched(unique_ptrexceptionFlag_ = true; + audioDeviceManager_.UpdateDevicesListInfo(new AudioDeviceDescriptor(*desc), EXCEPTION_FLAG_UPDATE); FetchOutputDevice(rendererChangeInfos, isStreamStatusUpdated); return ERROR; } @@ -1741,7 +1744,7 @@ void AudioPolicyService::OffloadStartPlayingIfOffloadMode(uint64_t sessionId) bool AudioPolicyService::IsSameDevice(unique_ptr &desc, DeviceInfo &deviceInfo) { if (desc->networkId_ == deviceInfo.networkId && desc->deviceType_ == deviceInfo.deviceType && - desc->macAddress_ == deviceInfo.macAddress) { + desc->macAddress_ == deviceInfo.macAddress && desc->connectState_ == deviceInfo.connectState) { return true; } else { return false; @@ -1751,7 +1754,7 @@ bool AudioPolicyService::IsSameDevice(unique_ptr &desc, D bool AudioPolicyService::IsSameDevice(unique_ptr &desc, AudioDeviceDescriptor &deviceDesc) { if (desc->networkId_ == deviceDesc.networkId_ && desc->deviceType_ == deviceDesc.deviceType_ && - desc->macAddress_ == deviceDesc.macAddress_) { + desc->macAddress_ == deviceDesc.macAddress_ && desc->connectState_ == deviceDesc.connectState_) { return true; } else { return false; @@ -1784,6 +1787,7 @@ void AudioPolicyService::FetchInputDevice(vectorexceptionFlag_ = true; + audioDeviceManager_.UpdateDevicesListInfo(new AudioDeviceDescriptor(*desc), EXCEPTION_FLAG_UPDATE); FetchInputDevice(capturerChangeInfos, isStreamStatusUpdated); return; } @@ -2462,6 +2466,15 @@ void AudioPolicyService::AddEarpiece() } sptr audioDescriptor = new (std::nothrow) AudioDeviceDescriptor(DEVICE_TYPE_EARPIECE, OUTPUT_DEVICE); + // Use speaker streaminfo for earpiece cap + auto itr = std::find_if(connectedDevices_.begin(), connectedDevices_.end(), + [](const sptr &devDesc) { + CHECK_AND_RETURN_RET_LOG(devDesc != nullptr, false, "Invalid device descriptor"); + return (devDesc->deviceType_ == DEVICE_TYPE_SPEAKER); + }); + if (itr != connectedDevices_.end()) { + audioDescriptor->SetDeviceCapability((*itr)->audioStreamInfo_, 0); + } audioDescriptor->deviceId_ = startDeviceId++; UpdateDisplayName(audioDescriptor); audioDeviceManager_.AddNewDevice(audioDescriptor); @@ -3830,6 +3843,7 @@ void AudioPolicyService::UpdateDeviceInfo(DeviceInfo &deviceInfo, const sptrchannelMasks_; deviceInfo.channelIndexMasks = desc->channelIndexMasks_; deviceInfo.displayName = desc->displayName_; + deviceInfo.connectState = desc->connectState_; if (hasBTPermission) { deviceInfo.deviceName = desc->deviceName_; diff --git a/services/audio_service/client/src/audio_device_descriptor.cpp b/services/audio_service/client/src/audio_device_descriptor.cpp index 6862073c4c4c966fd7e7e593cef48624a012c96c..ff63fb58613947649c059f8f184437328a4d0fdb 100644 --- a/services/audio_service/client/src/audio_device_descriptor.cpp +++ b/services/audio_service/client/src/audio_device_descriptor.cpp @@ -40,6 +40,7 @@ AudioDeviceDescriptor::AudioDeviceDescriptor(DeviceType type, DeviceRole role, i pairDeviceDescriptor_ = nullptr; isScoRealConnected_ = false; isEnable_ = true; + exceptionFlag_ = false; } AudioDeviceDescriptor::AudioDeviceDescriptor(DeviceType type, DeviceRole role) : deviceType_(type), deviceRole_(role) @@ -61,6 +62,7 @@ AudioDeviceDescriptor::AudioDeviceDescriptor(DeviceType type, DeviceRole role) : pairDeviceDescriptor_ = nullptr; isScoRealConnected_ = false; isEnable_ = true; + exceptionFlag_ = false; } AudioDeviceDescriptor::AudioDeviceDescriptor() @@ -90,6 +92,7 @@ AudioDeviceDescriptor::AudioDeviceDescriptor(const AudioDeviceDescriptor &device pairDeviceDescriptor_ = deviceDescriptor.pairDeviceDescriptor_; isScoRealConnected_ = deviceDescriptor.isScoRealConnected_; isEnable_ = deviceDescriptor.isEnable_; + exceptionFlag_ = deviceDescriptor.exceptionFlag_; } AudioDeviceDescriptor::AudioDeviceDescriptor(const sptr &deviceDescriptor) @@ -119,6 +122,7 @@ AudioDeviceDescriptor::AudioDeviceDescriptor(const sptr & pairDeviceDescriptor_ = deviceDescriptor->pairDeviceDescriptor_; isScoRealConnected_ = deviceDescriptor->isScoRealConnected_; isEnable_ = deviceDescriptor->isEnable_; + exceptionFlag_ = deviceDescriptor->exceptionFlag_; } AudioDeviceDescriptor::~AudioDeviceDescriptor() diff --git a/services/audio_service/client/src/audio_stream_tracker.cpp b/services/audio_service/client/src/audio_stream_tracker.cpp index d5470258390a1cd8ca961fc1164594327e85885b..b19bb1167674b4ef53736918bad22968c65f1ed6 100644 --- a/services/audio_service/client/src/audio_stream_tracker.cpp +++ b/services/audio_service/client/src/audio_stream_tracker.cpp @@ -42,12 +42,14 @@ void AudioStreamTracker::RegisterTracker(const AudioRegisterTrackerInfo ®iste streamChangeInfo.audioRendererChangeInfo.clientPid = registerTrackerInfo.clientPid; streamChangeInfo.audioRendererChangeInfo.rendererState = static_cast(registerTrackerInfo.state); streamChangeInfo.audioRendererChangeInfo.rendererInfo = registerTrackerInfo.rendererInfo; + streamChangeInfo.audioRendererChangeInfo.outputDeviceInfo.deviceRole = OUTPUT_DEVICE; } else { streamChangeInfo.audioCapturerChangeInfo.clientUID = clientUid_; streamChangeInfo.audioCapturerChangeInfo.sessionId = registerTrackerInfo.sessionId; streamChangeInfo.audioCapturerChangeInfo.clientPid = registerTrackerInfo.clientPid; streamChangeInfo.audioCapturerChangeInfo.capturerState = static_cast(registerTrackerInfo.state); streamChangeInfo.audioCapturerChangeInfo.capturerInfo = registerTrackerInfo.capturerInfo; + streamChangeInfo.audioCapturerChangeInfo.inputDeviceInfo.deviceRole = INPUT_DEVICE; } AudioPolicyManager::GetInstance().RegisterTracker(eMode_, streamChangeInfo, clientTrackerObj); }