Loading system/bta/le_audio/state_machine.cc +7 −0 Original line number Diff line number Diff line Loading @@ -179,6 +179,13 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine { LOG_INFO("Could not activate device, try to configure it again"); } /* Deactivate previousely activated ASEs in case if there were just a * reconfiguration (group target state as CODEC CONFIGURED) and no * deactivation. Currently activated ASEs cannot be used for different * context. */ group->Deactivate(); /* We are going to reconfigure whole group. Clear Cises.*/ ReleaseCisIds(group); Loading system/bta/le_audio/state_machine_test.cc +71 −0 Original line number Diff line number Diff line Loading @@ -4210,5 +4210,76 @@ TEST_F(StateMachineTest, StreamReconfigureAfterCisLostTwoDevices) { testing::Mock::VerifyAndClearExpectations(&mock_callbacks_); } TEST_F(StateMachineTest, StreamStartWithDifferentContextFromConfiguredState) { auto context_type = kContextTypeConversational; const auto leaudio_group_id = 6; const auto num_devices = 2; ContentControlIdKeeper::GetInstance()->SetCcid(media_context, media_ccid); // Prepare multiple fake connected devices in a group auto* group = PrepareSingleTestDeviceGroup( leaudio_group_id, context_type, num_devices, kContextTypeConversational | kContextTypeMedia); ASSERT_EQ(group->Size(), num_devices); PrepareConfigureCodecHandler(group, 0, true); PrepareConfigureQosHandler(group); PrepareEnableHandler(group); PrepareDisableHandler(group); PrepareReleaseHandler(group); PrepareReceiverStartReady(group); InjectInitialIdleNotification(group); auto* leAudioDevice = group->GetFirstDevice(); auto expected_devices_written = 0; while (leAudioDevice) { /* Three Writes: * 1. Codec configure * 2: Codec QoS * 3: Enabling */ EXPECT_CALL(gatt_queue, WriteCharacteristic(leAudioDevice->conn_id_, leAudioDevice->ctp_hdls_.val_hdl, _, GATT_WRITE_NO_RSP, _, _)) .Times(4); expected_devices_written++; leAudioDevice = group->GetNextDevice(leAudioDevice); } ASSERT_EQ(expected_devices_written, num_devices); // Validate GroupStreamStatus EXPECT_CALL(mock_callbacks_, StatusReportCb( leaudio_group_id, bluetooth::le_audio::GroupStreamStatus::CONFIGURED_BY_USER)); // Start the configuration and stream Media content group->SetPendingConfiguration(); LeAudioGroupStateMachine::Get()->ConfigureStream( group, context_type, {.sink = types::AudioContexts(context_type), .source = types::AudioContexts(context_type)}); testing::Mock::VerifyAndClearExpectations(&mock_callbacks_); group->ClearPendingConfiguration(); // Validate GroupStreamStatus EXPECT_CALL( mock_callbacks_, StatusReportCb(leaudio_group_id, bluetooth::le_audio::GroupStreamStatus::STREAMING)); context_type = kContextTypeMedia; // Start the configuration and stream Media content LeAudioGroupStateMachine::Get()->StartStream( group, context_type, {.sink = types::AudioContexts(context_type), .source = types::AudioContexts(context_type)}); testing::Mock::VerifyAndClearExpectations(&mock_callbacks_); } } // namespace internal } // namespace le_audio Loading
system/bta/le_audio/state_machine.cc +7 −0 Original line number Diff line number Diff line Loading @@ -179,6 +179,13 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine { LOG_INFO("Could not activate device, try to configure it again"); } /* Deactivate previousely activated ASEs in case if there were just a * reconfiguration (group target state as CODEC CONFIGURED) and no * deactivation. Currently activated ASEs cannot be used for different * context. */ group->Deactivate(); /* We are going to reconfigure whole group. Clear Cises.*/ ReleaseCisIds(group); Loading
system/bta/le_audio/state_machine_test.cc +71 −0 Original line number Diff line number Diff line Loading @@ -4210,5 +4210,76 @@ TEST_F(StateMachineTest, StreamReconfigureAfterCisLostTwoDevices) { testing::Mock::VerifyAndClearExpectations(&mock_callbacks_); } TEST_F(StateMachineTest, StreamStartWithDifferentContextFromConfiguredState) { auto context_type = kContextTypeConversational; const auto leaudio_group_id = 6; const auto num_devices = 2; ContentControlIdKeeper::GetInstance()->SetCcid(media_context, media_ccid); // Prepare multiple fake connected devices in a group auto* group = PrepareSingleTestDeviceGroup( leaudio_group_id, context_type, num_devices, kContextTypeConversational | kContextTypeMedia); ASSERT_EQ(group->Size(), num_devices); PrepareConfigureCodecHandler(group, 0, true); PrepareConfigureQosHandler(group); PrepareEnableHandler(group); PrepareDisableHandler(group); PrepareReleaseHandler(group); PrepareReceiverStartReady(group); InjectInitialIdleNotification(group); auto* leAudioDevice = group->GetFirstDevice(); auto expected_devices_written = 0; while (leAudioDevice) { /* Three Writes: * 1. Codec configure * 2: Codec QoS * 3: Enabling */ EXPECT_CALL(gatt_queue, WriteCharacteristic(leAudioDevice->conn_id_, leAudioDevice->ctp_hdls_.val_hdl, _, GATT_WRITE_NO_RSP, _, _)) .Times(4); expected_devices_written++; leAudioDevice = group->GetNextDevice(leAudioDevice); } ASSERT_EQ(expected_devices_written, num_devices); // Validate GroupStreamStatus EXPECT_CALL(mock_callbacks_, StatusReportCb( leaudio_group_id, bluetooth::le_audio::GroupStreamStatus::CONFIGURED_BY_USER)); // Start the configuration and stream Media content group->SetPendingConfiguration(); LeAudioGroupStateMachine::Get()->ConfigureStream( group, context_type, {.sink = types::AudioContexts(context_type), .source = types::AudioContexts(context_type)}); testing::Mock::VerifyAndClearExpectations(&mock_callbacks_); group->ClearPendingConfiguration(); // Validate GroupStreamStatus EXPECT_CALL( mock_callbacks_, StatusReportCb(leaudio_group_id, bluetooth::le_audio::GroupStreamStatus::STREAMING)); context_type = kContextTypeMedia; // Start the configuration and stream Media content LeAudioGroupStateMachine::Get()->StartStream( group, context_type, {.sink = types::AudioContexts(context_type), .source = types::AudioContexts(context_type)}); testing::Mock::VerifyAndClearExpectations(&mock_callbacks_); } } // namespace internal } // namespace le_audio