Loading system/bta/le_audio/devices.cc +6 −0 Original line number Diff line number Diff line Loading @@ -1661,6 +1661,12 @@ LeAudioDeviceGroup::GetActiveConfiguration(void) { std::optional<LeAudioCodecConfiguration> LeAudioDeviceGroup::GetCodecConfigurationByDirection( types::LeAudioContextType group_context_type, uint8_t direction) const { if (available_context_to_configuration_map.count(group_context_type) == 0) { LOG_DEBUG("Context type %s, not supported", bluetooth::common::ToString(group_context_type).c_str()); return std::nullopt; } const set_configurations::AudioSetConfiguration* audio_set_conf = available_context_to_configuration_map.at(group_context_type); LeAudioCodecConfiguration group_config = {0, 0, 0, 0}; Loading system/bta/le_audio/le_audio_client_test.cc +62 −18 Original line number Diff line number Diff line Loading @@ -1267,18 +1267,24 @@ class UnicastTestNoInit : public Test { SetUpMockGroups(); SetUpMockGatt(); supported_snk_context_types_ = 0xffff; supported_src_context_types_ = 0xffff; le_audio::AudioSetConfigurationProvider::Initialize(); ASSERT_FALSE(LeAudioClient::IsLeAudioClientRunning()); } void TearDown() override { if (is_audio_unicast_source_acquired) { if (unicast_source_hal_cb_ != nullptr) { EXPECT_CALL(*mock_le_audio_source_hal_client_, Stop).Times(1); } EXPECT_CALL(*mock_le_audio_source_hal_client_, OnDestroyed()).Times(1); } if (is_audio_unicast_sink_acquired) { if (unicast_sink_hal_cb_ != nullptr) { EXPECT_CALL(*mock_le_audio_sink_hal_client_, Stop).Times(1); } EXPECT_CALL(*mock_le_audio_sink_hal_client_, OnDestroyed()).Times(1); } Loading Loading @@ -1881,15 +1887,20 @@ class UnicastTestNoInit : public Test { ascs->start = 0x0090; uint16_t handle = 0x0091; for (int i = 0; i < add_ascs_cnt; i++) { if (sink_audio_allocation != 0) { ascs->sink_ase_char[i] = handle; handle += 2; ascs->sink_ase_ccc[i] = handle; handle++; } if (source_audio_allocation != 0) { ascs->source_ase_char[i] = handle; handle += 2; ascs->source_ase_ccc[i] = handle; handle++; } } ascs->ctp_char = handle; handle += 2; ascs->ctp_ccc = handle; Loading Loading @@ -2060,20 +2071,20 @@ class UnicastTestNoInit : public Test { } else if (handle == pacs->avail_contexts_char + 1) { value = { // Sink Avail Contexts 0xff, 0xff, (uint8_t)(supported_snk_context_types_ >> 8), (uint8_t)(supported_snk_context_types_), // Source Avail Contexts 0xff, 0xff, (uint8_t)(supported_src_context_types_ >> 8), (uint8_t)(supported_src_context_types_), }; } else if (handle == pacs->supp_contexts_char + 1) { value = { // Sink Avail Contexts 0xff, 0xff, (uint8_t)(supported_snk_context_types_ >> 8), (uint8_t)(supported_snk_context_types_), // Source Avail Contexts 0xff, 0xff, (uint8_t)(supported_src_context_types_ >> 8), (uint8_t)(supported_src_context_types_), }; } cb(conn_id, GATT_SUCCESS, handle, value.size(), value.data(), Loading Loading @@ -2244,6 +2255,9 @@ class UnicastTestNoInit : public Test { bluetooth::hci::iso_manager::CigCallbacks* cig_callbacks_ = nullptr; uint16_t iso_con_counter_ = 1; uint16_t supported_snk_context_types_ = 0xffff; uint16_t supported_src_context_types_ = 0xffff; bluetooth::storage::MockBtifStorageInterface mock_btif_storage_; std::map<uint16_t, std::unique_ptr<MockDeviceWrapper>> peer_devices; Loading Loading @@ -3217,6 +3231,36 @@ TEST_F(UnicastTest, EarbudsTwsStyleStreaming) { Mock::VerifyAndClearExpectations(&mock_le_audio_source_hal_client_); } TEST_F(UnicastTest, SpeakerFailedConversationalStreaming) { const RawAddress test_address0 = GetTestAddress(0); int group_id = bluetooth::groups::kGroupUnknown; supported_src_context_types_ = 0; supported_snk_context_types_ = 0x0004; SetSampleDatabaseEarbudsValid( 1, test_address0, codec_spec_conf::kLeAudioLocationStereo, 0, default_channel_cnt, default_channel_cnt, 0x0004, /* source sample freq 16khz */ false /*add_csis*/, true /*add_cas*/, true /*add_pacs*/, default_ase_cnt /*add_ascs_cnt*/, 1 /*set_size*/, 0 /*rank*/); EXPECT_CALL(mock_audio_hal_client_callbacks_, OnConnectionState(ConnectionState::CONNECTED, test_address0)) .Times(1); EXPECT_CALL(mock_audio_hal_client_callbacks_, OnGroupNodeStatus(test_address0, _, GroupNodeStatus::ADDED)) .WillOnce(DoAll(SaveArg<1>(&group_id))); ConnectLeAudio(test_address0); ASSERT_NE(group_id, bluetooth::groups::kGroupUnknown); // Audio sessions are started only when device gets active LeAudioClient::Get()->GroupSetActive(group_id); /* Nothing to do - expect no crash */ } TEST_F(UnicastTest, SpeakerStreaming) { const RawAddress test_address0 = GetTestAddress(0); int group_id = bluetooth::groups::kGroupUnknown; Loading Loading
system/bta/le_audio/devices.cc +6 −0 Original line number Diff line number Diff line Loading @@ -1661,6 +1661,12 @@ LeAudioDeviceGroup::GetActiveConfiguration(void) { std::optional<LeAudioCodecConfiguration> LeAudioDeviceGroup::GetCodecConfigurationByDirection( types::LeAudioContextType group_context_type, uint8_t direction) const { if (available_context_to_configuration_map.count(group_context_type) == 0) { LOG_DEBUG("Context type %s, not supported", bluetooth::common::ToString(group_context_type).c_str()); return std::nullopt; } const set_configurations::AudioSetConfiguration* audio_set_conf = available_context_to_configuration_map.at(group_context_type); LeAudioCodecConfiguration group_config = {0, 0, 0, 0}; Loading
system/bta/le_audio/le_audio_client_test.cc +62 −18 Original line number Diff line number Diff line Loading @@ -1267,18 +1267,24 @@ class UnicastTestNoInit : public Test { SetUpMockGroups(); SetUpMockGatt(); supported_snk_context_types_ = 0xffff; supported_src_context_types_ = 0xffff; le_audio::AudioSetConfigurationProvider::Initialize(); ASSERT_FALSE(LeAudioClient::IsLeAudioClientRunning()); } void TearDown() override { if (is_audio_unicast_source_acquired) { if (unicast_source_hal_cb_ != nullptr) { EXPECT_CALL(*mock_le_audio_source_hal_client_, Stop).Times(1); } EXPECT_CALL(*mock_le_audio_source_hal_client_, OnDestroyed()).Times(1); } if (is_audio_unicast_sink_acquired) { if (unicast_sink_hal_cb_ != nullptr) { EXPECT_CALL(*mock_le_audio_sink_hal_client_, Stop).Times(1); } EXPECT_CALL(*mock_le_audio_sink_hal_client_, OnDestroyed()).Times(1); } Loading Loading @@ -1881,15 +1887,20 @@ class UnicastTestNoInit : public Test { ascs->start = 0x0090; uint16_t handle = 0x0091; for (int i = 0; i < add_ascs_cnt; i++) { if (sink_audio_allocation != 0) { ascs->sink_ase_char[i] = handle; handle += 2; ascs->sink_ase_ccc[i] = handle; handle++; } if (source_audio_allocation != 0) { ascs->source_ase_char[i] = handle; handle += 2; ascs->source_ase_ccc[i] = handle; handle++; } } ascs->ctp_char = handle; handle += 2; ascs->ctp_ccc = handle; Loading Loading @@ -2060,20 +2071,20 @@ class UnicastTestNoInit : public Test { } else if (handle == pacs->avail_contexts_char + 1) { value = { // Sink Avail Contexts 0xff, 0xff, (uint8_t)(supported_snk_context_types_ >> 8), (uint8_t)(supported_snk_context_types_), // Source Avail Contexts 0xff, 0xff, (uint8_t)(supported_src_context_types_ >> 8), (uint8_t)(supported_src_context_types_), }; } else if (handle == pacs->supp_contexts_char + 1) { value = { // Sink Avail Contexts 0xff, 0xff, (uint8_t)(supported_snk_context_types_ >> 8), (uint8_t)(supported_snk_context_types_), // Source Avail Contexts 0xff, 0xff, (uint8_t)(supported_src_context_types_ >> 8), (uint8_t)(supported_src_context_types_), }; } cb(conn_id, GATT_SUCCESS, handle, value.size(), value.data(), Loading Loading @@ -2244,6 +2255,9 @@ class UnicastTestNoInit : public Test { bluetooth::hci::iso_manager::CigCallbacks* cig_callbacks_ = nullptr; uint16_t iso_con_counter_ = 1; uint16_t supported_snk_context_types_ = 0xffff; uint16_t supported_src_context_types_ = 0xffff; bluetooth::storage::MockBtifStorageInterface mock_btif_storage_; std::map<uint16_t, std::unique_ptr<MockDeviceWrapper>> peer_devices; Loading Loading @@ -3217,6 +3231,36 @@ TEST_F(UnicastTest, EarbudsTwsStyleStreaming) { Mock::VerifyAndClearExpectations(&mock_le_audio_source_hal_client_); } TEST_F(UnicastTest, SpeakerFailedConversationalStreaming) { const RawAddress test_address0 = GetTestAddress(0); int group_id = bluetooth::groups::kGroupUnknown; supported_src_context_types_ = 0; supported_snk_context_types_ = 0x0004; SetSampleDatabaseEarbudsValid( 1, test_address0, codec_spec_conf::kLeAudioLocationStereo, 0, default_channel_cnt, default_channel_cnt, 0x0004, /* source sample freq 16khz */ false /*add_csis*/, true /*add_cas*/, true /*add_pacs*/, default_ase_cnt /*add_ascs_cnt*/, 1 /*set_size*/, 0 /*rank*/); EXPECT_CALL(mock_audio_hal_client_callbacks_, OnConnectionState(ConnectionState::CONNECTED, test_address0)) .Times(1); EXPECT_CALL(mock_audio_hal_client_callbacks_, OnGroupNodeStatus(test_address0, _, GroupNodeStatus::ADDED)) .WillOnce(DoAll(SaveArg<1>(&group_id))); ConnectLeAudio(test_address0); ASSERT_NE(group_id, bluetooth::groups::kGroupUnknown); // Audio sessions are started only when device gets active LeAudioClient::Get()->GroupSetActive(group_id); /* Nothing to do - expect no crash */ } TEST_F(UnicastTest, SpeakerStreaming) { const RawAddress test_address0 = GetTestAddress(0); int group_id = bluetooth::groups::kGroupUnknown; Loading