Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4f3a41fc authored by Łukasz Rymanowski's avatar Łukasz Rymanowski Committed by Gerrit Code Review
Browse files

Merge "leaudio: Fix crash when connecting to LeAudio speaker only"

parents 4e424311 dc70936c
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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};
+62 −18
Original line number Diff line number Diff line
@@ -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);
    }

@@ -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;
@@ -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(),
@@ -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;
@@ -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;