diff --git a/services/audio_policy/server/domain/router/privacy_priority_router.cpp b/services/audio_policy/server/domain/router/privacy_priority_router.cpp index d63c0286bf2190dd605fd94b88f154cf5b00f699..4b44563f85f77a18ebede47fb92a76326322a31e 100644 --- a/services/audio_policy/server/domain/router/privacy_priority_router.cpp +++ b/services/audio_policy/server/domain/router/privacy_priority_router.cpp @@ -130,7 +130,8 @@ vector> PrivacyPriorityRouter::GetRingRen shared_ptr PrivacyPriorityRouter::GetRecordCaptureDevice(SourceType sourceType, int32_t clientUID, const uint32_t sessionID) { - if (Util::IsScoSupportSource(sourceType)) { + const bool isScoSupportSource = Util::IsScoSupportSource(sourceType); + if (isScoSupportSource) { vector> descs = AudioDeviceManager::GetAudioDeviceManager().GetRecongnitionCapturePrivacyDevices(); shared_ptr desc = GetLatestNonExcludedConnectDevice(CALL_INPUT_DEVICES, descs); @@ -142,6 +143,14 @@ shared_ptr PrivacyPriorityRouter::GetRecordCaptureDevice( } vector> descs = AudioDeviceManager::GetAudioDeviceManager().GetMediaCapturePrivacyDevices(); + // a2dp_in exclusion for SOURCE_TYPE_VOICE_TRANSCRIPTION and SOURCE_TYPE_VOICE_RECOGNITION + if (isScoSupportSource) { + auto isA2dpInputDevice = [](const std::shared_ptr &desc) { + return desc != nullptr && desc->deviceType_ == DEVICE_TYPE_BLUETOOTH_A2DP_IN; + }; + descs.erase( + remove_if(descs.begin(), descs.end(), isA2dpInputDevice), descs.end()); + } shared_ptr desc = GetLatestNonExcludedConnectDevice(MEDIA_INPUT_DEVICES, descs); CHECK_AND_RETURN_RET_LOG(desc != nullptr, make_shared(), "nullptr desc"); AUDIO_DEBUG_LOG("sourceType %{public}d clientUID %{public}d fetch device %{public}d", sourceType, diff --git a/services/audio_policy/test/unittest/privacy_priority_router_unit_test/src/privacy_priority_router_unit_test.cpp b/services/audio_policy/test/unittest/privacy_priority_router_unit_test/src/privacy_priority_router_unit_test.cpp index 584e708a9a01e59bcb2db21f34219855d9fd2cf4..374f0d1b2e78ec13fb9d5019741539f594bb0859 100644 --- a/services/audio_policy/test/unittest/privacy_priority_router_unit_test/src/privacy_priority_router_unit_test.cpp +++ b/services/audio_policy/test/unittest/privacy_priority_router_unit_test/src/privacy_priority_router_unit_test.cpp @@ -80,6 +80,399 @@ HWTEST(PrivacyPriorityRouterUnitTest, GetRecordCaptureDevice_004, TestSize.Level EXPECT_NE(result->deviceType_, desc->deviceType_); } +/** + * Building SCO + */ +shared_ptr CreateScoDevice(int32_t timestamp, bool isSuspended = false) +{ + auto scoDevice = make_shared(); + scoDevice->deviceType_ = DEVICE_TYPE_BLUETOOTH_SCO; + scoDevice->exceptionFlag_ = false; + scoDevice->isEnable_ = true; + scoDevice->connectState_ = isSuspended ? SUSPEND_CONNECTED : CONNECTED; + scoDevice->connectTimeStamp_ = timestamp; + return scoDevice; +} + +/** + * Building a2dp_in + */ +shared_ptr CreateA2dpInDevice(int32_t timestamp) +{ + auto a2dpInDevice = make_shared(); + a2dpInDevice->deviceType_ = DEVICE_TYPE_BLUETOOTH_A2DP_IN; + a2dpInDevice->exceptionFlag_ = false; + a2dpInDevice->isEnable_ = true; + a2dpInDevice->connectState_ = CONNECTED; + a2dpInDevice->connectTimeStamp_ = timestamp; + return a2dpInDevice; +} + +/** + * Building WiredHeadset + */ +shared_ptr CreateWiredHeadsetDevice(int32_t timestamp) +{ + auto wiredDevice = make_shared(); + wiredDevice->deviceType_ = DEVICE_TYPE_WIRED_HEADSET; + wiredDevice->exceptionFlag_ = false; + wiredDevice->isEnable_ = true; + wiredDevice->connectState_ = CONNECTED; + wiredDevice->connectTimeStamp_ = timestamp; + return wiredDevice; +} + +/** + * @tc.name : Test PrivacyPriorityRouter. + * @tc.number: GetRecordCaptureDevice_005 + * @tc.desc : If SCO and A2DP_IN are available, SCO should be selected. + */ +HWTEST(PrivacyPriorityRouterUnitTest, GetRecordCaptureDevice_005, TestSize.Level1) +{ + PrivacyPriorityRouter privacyPriorityRouter; + int32_t clientUID = TEST_CLIENT_UID; + uint32_t sessionID = TEST_SESSION_ID; + + auto &manager = AudioDeviceManager::GetAudioDeviceManager(); + auto sco = CreateScoDevice(100); + auto a2dpin = CreateA2dpInDevice(200); + manager.reconCapturePrivacyDevices_.clear(); + manager.mediaCapturePrivacyDevices_.clear(); + manager.reconCapturePrivacyDevices_.push_back(sco); + manager.mediaCapturePrivacyDevices_.push_back(a2dpin); + auto result = privacyPriorityRouter.GetRecordCaptureDevice(SOURCE_TYPE_VOICE_RECOGNITION, clientUID, sessionID); + EXPECT_NE(result, nullptr); + EXPECT_EQ(result->deviceType_, DEVICE_TYPE_BLUETOOTH_SCO); + manager.reconCapturePrivacyDevices_.clear(); + manager.mediaCapturePrivacyDevices_.clear(); +} + +/** + * @tc.name : Test PrivacyPriorityRouter. + * @tc.number: GetRecordCaptureDevice_006 + * @tc.desc : Only A2DP_IN, recognition source should return NONE (because SCO is suspend). + */ +HWTEST(PrivacyPriorityRouterUnitTest, GetRecordCaptureDevice_006, TestSize.Level1) +{ + PrivacyPriorityRouter privacyPriorityRouter; + int32_t clientUID = TEST_CLIENT_UID; + uint32_t sessionID = TEST_SESSION_ID; + + auto &manager = AudioDeviceManager::GetAudioDeviceManager(); + auto a2dpin = CreateA2dpInDevice(200); + manager.reconCapturePrivacyDevices_.clear(); + manager.mediaCapturePrivacyDevices_.clear(); + manager.mediaCapturePrivacyDevices_.push_back(a2dpin); + auto result = privacyPriorityRouter.GetRecordCaptureDevice(SOURCE_TYPE_VOICE_RECOGNITION, clientUID, sessionID); + EXPECT_NE(result, nullptr); + EXPECT_EQ(result->deviceType_, DEVICE_TYPE_NONE); + manager.reconCapturePrivacyDevices_.clear(); + manager.mediaCapturePrivacyDevices_.clear(); +} + +/** + * @tc.name : Test PrivacyPriorityRouter. + * @tc.number: GetRecordCaptureDevice_007 + * @tc.desc : Normal recording source microphone, A2DP_IN is available, and A2DP_IN should be selected. + */ +HWTEST(PrivacyPriorityRouterUnitTest, GetRecordCaptureDevice_007, TestSize.Level1) +{ + PrivacyPriorityRouter privacyPriorityRouter; + int32_t clientUID = TEST_CLIENT_UID; + uint32_t sessionID = TEST_SESSION_ID; + + auto &manager = AudioDeviceManager::GetAudioDeviceManager(); + auto a2dpin = CreateA2dpInDevice(1000); + manager.reconCapturePrivacyDevices_.clear(); + manager.mediaCapturePrivacyDevices_.clear(); + manager.mediaCapturePrivacyDevices_.push_back(a2dpin); + auto result = privacyPriorityRouter.GetRecordCaptureDevice(SOURCE_TYPE_MIC, clientUID, sessionID); + EXPECT_NE(result, nullptr); + EXPECT_EQ(result->deviceType_, DEVICE_TYPE_BLUETOOTH_A2DP_IN); + manager.reconCapturePrivacyDevices_.clear(); + manager.mediaCapturePrivacyDevices_.clear(); +} + +/** + * @tc.name : Test PrivacyPriorityRouter. + * @tc.number: GetRecordCaptureDevice_008 + * @tc.desc : No equipment, None should be returned. + */ +HWTEST(PrivacyPriorityRouterUnitTest, GetRecordCaptureDevice_008, TestSize.Level1) +{ + PrivacyPriorityRouter privacyPriorityRouter; + int32_t clientUID = TEST_CLIENT_UID; + uint32_t sessionID = TEST_SESSION_ID; + + auto &manager = AudioDeviceManager::GetAudioDeviceManager(); + manager.reconCapturePrivacyDevices_.clear(); + manager.mediaCapturePrivacyDevices_.clear(); + auto result = privacyPriorityRouter.GetRecordCaptureDevice(SOURCE_TYPE_MIC, clientUID, sessionID); + EXPECT_NE(result, nullptr); + EXPECT_EQ(result->deviceType_, DEVICE_TYPE_NONE); + manager.reconCapturePrivacyDevices_.clear(); + manager.mediaCapturePrivacyDevices_.clear(); +} + +/** + * @tc.name : Test PrivacyPriorityRouter. + * @tc.number: GetRecordCaptureDevice_009 + * @tc.desc : Enable Bluetooth SCO, Connect Bluetooth and then WiredHeadset, Select WiredHeadset. + */ +HWTEST(PrivacyPriorityRouterUnitTest, GetRecordCaptureDevice_009, TestSize.Level1) +{ + PrivacyPriorityRouter privacyPriorityRouter; + int32_t clientUID = TEST_CLIENT_UID; + uint32_t sessionID = TEST_SESSION_ID; + + auto &manager = AudioDeviceManager::GetAudioDeviceManager(); + auto sco = CreateScoDevice(1000); + auto wired = CreateWiredHeadsetDevice(2000); + manager.reconCapturePrivacyDevices_.clear(); + manager.mediaCapturePrivacyDevices_.clear(); + manager.reconCapturePrivacyDevices_.push_back(sco); + manager.reconCapturePrivacyDevices_.push_back(wired); + AudioPolicyUtils::GetInstance().SetScoExcluded(false); + auto result = privacyPriorityRouter.GetRecordCaptureDevice(SOURCE_TYPE_VOICE_RECOGNITION, clientUID, sessionID); + EXPECT_NE(result, nullptr); + EXPECT_EQ(result->deviceType_, DEVICE_TYPE_WIRED_HEADSET); + manager.reconCapturePrivacyDevices_.clear(); + manager.mediaCapturePrivacyDevices_.clear(); +} + +/** + * @tc.name : Test PrivacyPriorityRouter. + * @tc.number: GetRecordCaptureDevice_010 + * @tc.desc : If Bluetooth SCO is enabled, connect WiredHeadset and then connect SCO, SELECT SCO. + */ +HWTEST(PrivacyPriorityRouterUnitTest, GetRecordCaptureDevice_010, TestSize.Level1) +{ + PrivacyPriorityRouter privacyPriorityRouter; + int32_t clientUID = TEST_CLIENT_UID; + uint32_t sessionID = TEST_SESSION_ID; + + auto &manager = AudioDeviceManager::GetAudioDeviceManager(); + auto wired = CreateWiredHeadsetDevice(1000); + auto sco = CreateScoDevice(2000); + manager.reconCapturePrivacyDevices_.clear(); + manager.reconCapturePrivacyDevices_.push_back(wired); + manager.reconCapturePrivacyDevices_.push_back(sco); + AudioPolicyUtils::GetInstance().SetScoExcluded(false); + auto result = privacyPriorityRouter.GetRecordCaptureDevice(SOURCE_TYPE_VOICE_RECOGNITION, clientUID, sessionID); + EXPECT_NE(result, nullptr); + EXPECT_EQ(result->deviceType_, DEVICE_TYPE_BLUETOOTH_SCO); + manager.reconCapturePrivacyDevices_.clear(); +} + +/** + * @tc.name : Test PrivacyPriorityRouter. + * @tc.number: GetRecordCaptureDevice_011 + * @tc.desc : Bluetooth SCO is disabled (suspended), connect to SCO first, select WiredHeadset. + */ +HWTEST(PrivacyPriorityRouterUnitTest, GetRecordCaptureDevice_011, TestSize.Level1) +{ + PrivacyPriorityRouter privacyPriorityRouter; + int32_t clientUID = TEST_CLIENT_UID; + uint32_t sessionID = TEST_SESSION_ID; + + auto &manager = AudioDeviceManager::GetAudioDeviceManager(); + auto sco = CreateScoDevice(1000, true); + auto a2dpin = CreateA2dpInDevice(1000); + auto wired = CreateWiredHeadsetDevice(2000); + manager.reconCapturePrivacyDevices_.clear(); + manager.mediaCapturePrivacyDevices_.clear(); + manager.mediaCapturePrivacyDevices_.push_back(a2dpin); + manager.reconCapturePrivacyDevices_.push_back(wired); + AudioPolicyUtils::GetInstance().SetScoExcluded(true); + auto result = privacyPriorityRouter.GetRecordCaptureDevice(SOURCE_TYPE_VOICE_RECOGNITION, clientUID, sessionID); + EXPECT_NE(result, nullptr); + EXPECT_EQ(result->deviceType_, DEVICE_TYPE_WIRED_HEADSET); + manager.reconCapturePrivacyDevices_.clear(); + manager.mediaCapturePrivacyDevices_.clear(); +} + +/** + * @tc.name : Test PrivacyPriorityRouter. + * @tc.number: GetRecordCaptureDevice_012 + * @tc.desc : Bluetooth SCO is disabled. Connect the WiredHeadset and then connect the SCO, select WiredHeadset. + */ +HWTEST(PrivacyPriorityRouterUnitTest, GetRecordCaptureDevice_012, TestSize.Level1) +{ + PrivacyPriorityRouter privacyPriorityRouter; + int32_t clientUID = TEST_CLIENT_UID; + uint32_t sessionID = TEST_SESSION_ID; + + auto &manager = AudioDeviceManager::GetAudioDeviceManager(); + auto wired = CreateWiredHeadsetDevice(1000); + auto a2dpin = CreateA2dpInDevice(1000); + auto sco = CreateScoDevice(2000, true); + manager.reconCapturePrivacyDevices_.clear(); + manager.mediaCapturePrivacyDevices_.clear(); + manager.reconCapturePrivacyDevices_.push_back(wired); + manager.mediaCapturePrivacyDevices_.push_back(a2dpin); + AudioPolicyUtils::GetInstance().SetScoExcluded(true); + auto result = privacyPriorityRouter.GetRecordCaptureDevice(SOURCE_TYPE_VOICE_RECOGNITION, clientUID, sessionID); + EXPECT_NE(result, nullptr); + EXPECT_EQ(result->deviceType_, DEVICE_TYPE_WIRED_HEADSET); + manager.reconCapturePrivacyDevices_.clear(); + manager.mediaCapturePrivacyDevices_.clear(); +} + +/** + * @tc.name : Test PrivacyPriorityRouter. + * @tc.number: GetRecordCaptureDevice_013 + * @tc.desc : If SCO and A2DP_IN are available, SCO should be selected. + */ +HWTEST(PrivacyPriorityRouterUnitTest, GetRecordCaptureDevice_013, TestSize.Level1) +{ + PrivacyPriorityRouter privacyPriorityRouter; + int32_t clientUID = TEST_CLIENT_UID; + uint32_t sessionID = TEST_SESSION_ID; + + auto &manager = AudioDeviceManager::GetAudioDeviceManager(); + auto sco = CreateScoDevice(100); + auto a2dpin = CreateA2dpInDevice(100); + manager.reconCapturePrivacyDevices_.clear(); + manager.mediaCapturePrivacyDevices_.clear(); + manager.reconCapturePrivacyDevices_.push_back(sco); + manager.mediaCapturePrivacyDevices_.push_back(a2dpin); + AudioPolicyUtils::GetInstance().SetScoExcluded(false); + auto result = privacyPriorityRouter.GetRecordCaptureDevice(SOURCE_TYPE_VOICE_TRANSCRIPTION, clientUID, sessionID); + EXPECT_NE(result, nullptr); + EXPECT_EQ(result->deviceType_, DEVICE_TYPE_BLUETOOTH_SCO); + manager.reconCapturePrivacyDevices_.clear(); + manager.mediaCapturePrivacyDevices_.clear(); +} + +/** + * @tc.name : Test PrivacyPriorityRouter. + * @tc.number: GetRecordCaptureDevice_014 + * @tc.desc : Only A2DP_IN, device select should return NONE (because SCO is suspend). + */ +HWTEST(PrivacyPriorityRouterUnitTest, GetRecordCaptureDevice_014, TestSize.Level1) +{ + PrivacyPriorityRouter privacyPriorityRouter; + int32_t clientUID = TEST_CLIENT_UID; + uint32_t sessionID = TEST_SESSION_ID; + + auto &manager = AudioDeviceManager::GetAudioDeviceManager(); + auto a2dpin = CreateA2dpInDevice(200); + manager.reconCapturePrivacyDevices_.clear(); + manager.mediaCapturePrivacyDevices_.clear(); + manager.mediaCapturePrivacyDevices_.push_back(a2dpin); + auto result = privacyPriorityRouter.GetRecordCaptureDevice(SOURCE_TYPE_VOICE_TRANSCRIPTION, clientUID, sessionID); + EXPECT_NE(result, nullptr); + EXPECT_EQ(result->deviceType_, DEVICE_TYPE_NONE); + manager.reconCapturePrivacyDevices_.clear(); + manager.mediaCapturePrivacyDevices_.clear(); +} + +/** + * @tc.name : Test PrivacyPriorityRouter. + * @tc.number: GetRecordCaptureDevice_015 + * @tc.desc : Enable Bluetooth SCO, Connect Bluetooth and then WiredHeadset, Select WiredHeadset. + */ +HWTEST(PrivacyPriorityRouterUnitTest, GetRecordCaptureDevice_015, TestSize.Level1) +{ + PrivacyPriorityRouter privacyPriorityRouter; + int32_t clientUID = TEST_CLIENT_UID; + uint32_t sessionID = TEST_SESSION_ID; + + auto &manager = AudioDeviceManager::GetAudioDeviceManager(); + auto sco = CreateScoDevice(1000); + auto wired = CreateWiredHeadsetDevice(2000); + manager.reconCapturePrivacyDevices_.clear(); + manager.mediaCapturePrivacyDevices_.clear(); + manager.reconCapturePrivacyDevices_.push_back(sco); + manager.reconCapturePrivacyDevices_.push_back(wired); + AudioPolicyUtils::GetInstance().SetScoExcluded(false); + auto result = privacyPriorityRouter.GetRecordCaptureDevice(SOURCE_TYPE_VOICE_TRANSCRIPTION, clientUID, sessionID); + EXPECT_NE(result, nullptr); + EXPECT_EQ(result->deviceType_, DEVICE_TYPE_WIRED_HEADSET); + manager.reconCapturePrivacyDevices_.clear(); + manager.mediaCapturePrivacyDevices_.clear(); +} + +/** + * @tc.name : Test PrivacyPriorityRouter. + * @tc.number: GetRecordCaptureDevice_016 + * @tc.desc : If Bluetooth SCO is enabled, connect WiredHeadset and then connect SCO, should be selected SCO. + */ +HWTEST(PrivacyPriorityRouterUnitTest, GetRecordCaptureDevice_016, TestSize.Level1) +{ + PrivacyPriorityRouter privacyPriorityRouter; + int32_t clientUID = TEST_CLIENT_UID; + uint32_t sessionID = TEST_SESSION_ID; + + auto &manager = AudioDeviceManager::GetAudioDeviceManager(); + auto wired = CreateWiredHeadsetDevice(1000); + auto sco = CreateScoDevice(2000); + manager.reconCapturePrivacyDevices_.clear(); + manager.mediaCapturePrivacyDevices_.clear(); + manager.reconCapturePrivacyDevices_.push_back(wired); + manager.reconCapturePrivacyDevices_.push_back(sco); + AudioPolicyUtils::GetInstance().SetScoExcluded(false); + auto result = privacyPriorityRouter.GetRecordCaptureDevice(SOURCE_TYPE_VOICE_TRANSCRIPTION, clientUID, sessionID); + EXPECT_NE(result, nullptr); + EXPECT_EQ(result->deviceType_, DEVICE_TYPE_BLUETOOTH_SCO); + manager.reconCapturePrivacyDevices_.clear(); + manager.mediaCapturePrivacyDevices_.clear(); +} + +/** + * @tc.name : Test PrivacyPriorityRouter. + * @tc.number: GetRecordCaptureDevice_017 + * @tc.desc : Bluetooth SCO is disabled, connect SCO first, then connect WiredHeadset, should be selected WiredHeadset. + */ +HWTEST(PrivacyPriorityRouterUnitTest, GetRecordCaptureDevice_017, TestSize.Level1) +{ + PrivacyPriorityRouter privacyPriorityRouter; + int32_t clientUID = TEST_CLIENT_UID; + uint32_t sessionID = TEST_SESSION_ID; + + auto &manager = AudioDeviceManager::GetAudioDeviceManager(); + auto sco = CreateScoDevice(1000, true); + auto a2dpin = CreateA2dpInDevice(1000); + auto wired = CreateWiredHeadsetDevice(2000); + manager.reconCapturePrivacyDevices_.clear(); + manager.mediaCapturePrivacyDevices_.clear(); + manager.mediaCapturePrivacyDevices_.push_back(a2dpin); + manager.reconCapturePrivacyDevices_.push_back(wired); + AudioPolicyUtils::GetInstance().SetScoExcluded(true); + auto result = privacyPriorityRouter.GetRecordCaptureDevice(SOURCE_TYPE_VOICE_TRANSCRIPTION, clientUID, sessionID); + EXPECT_NE(result, nullptr); + EXPECT_EQ(result->deviceType_, DEVICE_TYPE_WIRED_HEADSET); + manager.reconCapturePrivacyDevices_.clear(); + manager.mediaCapturePrivacyDevices_.clear(); +} + +/** + * @tc.name : Test PrivacyPriorityRouter. + * @tc.number: GetRecordCaptureDevice_018 + * @tc.desc : Bluetooth SCO is disabled. Connect the WiredHeadset and then connect the SCO, should be selected WiredHeadset. + */ +HWTEST(PrivacyPriorityRouterUnitTest, GetRecordCaptureDevice_018, TestSize.Level1) +{ + PrivacyPriorityRouter privacyPriorityRouter; + int32_t clientUID = TEST_CLIENT_UID; + uint32_t sessionID = TEST_SESSION_ID; + + auto &manager = AudioDeviceManager::GetAudioDeviceManager(); + auto wired = CreateWiredHeadsetDevice(1000); + auto a2dpin = CreateA2dpInDevice(1000); + auto sco = CreateScoDevice(2000, true); + manager.reconCapturePrivacyDevices_.clear(); + manager.mediaCapturePrivacyDevices_.clear(); + manager.reconCapturePrivacyDevices_.push_back(wired); + manager.mediaCapturePrivacyDevices_.push_back(a2dpin); + AudioPolicyUtils::GetInstance().SetScoExcluded(true); + auto result = privacyPriorityRouter.GetRecordCaptureDevice(SOURCE_TYPE_VOICE_TRANSCRIPTION, clientUID, sessionID); + EXPECT_NE(result, nullptr); + EXPECT_EQ(result->deviceType_, DEVICE_TYPE_WIRED_HEADSET); + manager.reconCapturePrivacyDevices_.clear(); + manager.mediaCapturePrivacyDevices_.clear(); +} + /** * @tc.name : Test PrivacyPriorityRouter. * @tc.number: GetCallRenderDevice_001