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

Commit b01c7307 authored by Jakub Tyszkowski's avatar Jakub Tyszkowski
Browse files

LeAudio/Broadcast: Fix channel map creation

There were to many channels enabled in the stream map for each BIS
instead of dividing the channels between all the BISes.

Bug: 335809981
Test: atest bluetooth_le_audio_codec_manager_test
Flag: EXEMPT; Regression fix covered with unit test
Change-Id: I74132a77993f97b5ea7ea5c200b749728048e275
parent 27da434b
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -194,6 +194,12 @@ struct BroadcastSubgroupCodecConfig {
    return 0;
  }

  /* Note: this should be used for tests only */
  const std::vector<BroadcastSubgroupBisCodecConfig>& GetBisCodecConfigs()
      const {
    return bis_codec_configs_;
  }

  std::optional<types::LeAudioLtvMap> GetBisCodecSpecData(
      uint8_t bis_idx) const {
    if (bis_codec_configs_.empty()) return std::nullopt;
+5 −3
Original line number Diff line number Diff line
@@ -290,10 +290,12 @@ struct codec_manager_impl {
          core_config.GetChannelCountPerIsoStream());

      // Enable the individual channels per BIS in the stream map
      auto all_channels = adsp_config.codec.channel_count_per_iso_stream;
      uint8_t channel_alloc_idx = 0;
      for (auto& [_, channels] : broadcast_config.stream_map) {
        for (uint8_t i = 0; i < adsp_config.codec.channel_count_per_iso_stream;
             ++i) {
          channels |= (0b1 << i);
        if (all_channels) {
          channels |= (0b1 << channel_alloc_idx++);
          --all_channels;
        }
      }

+39 −2
Original line number Diff line number Diff line
@@ -471,9 +471,23 @@ TEST_F(CodecManagerTestAdsp, test_capabilities) {
}

TEST_F(CodecManagerTestAdsp, test_broadcast_config) {
  static const set_configurations::CodecConfigSetting bc_lc3_48_2 = {
      .id = kLeAudioCodecIdLc3,
      .params = types::LeAudioLtvMap({
          LTV_ENTRY_SAMPLING_FREQUENCY(
              codec_spec_conf::kLeAudioSamplingFreq48000Hz),
          LTV_ENTRY_FRAME_DURATION(
              codec_spec_conf::kLeAudioCodecFrameDur10000us),
          LTV_ENTRY_AUDIO_CHANNEL_ALLOCATION(
              codec_spec_conf::kLeAudioLocationStereo),
          LTV_ENTRY_OCTETS_PER_CODEC_FRAME(100),
      }),
      .channel_count_per_iso_stream = 2,
  };

  std::vector<AudioSetConfiguration> offload_capabilities = {
      {.name = "Test_Broadcast_Config_No_Dev_lc3_48_2",
       .confs = {.sink = {set_configurations::AseConfiguration(lc3_48_2)},
       .confs = {.sink = {set_configurations::AseConfiguration(bc_lc3_48_2)},
                 .source = {}},
       .topology_info = {{{0, 0}}}}};
  set_mock_offload_capabilities(offload_capabilities);
@@ -491,14 +505,37 @@ TEST_F(CodecManagerTestAdsp, test_broadcast_config) {
  ASSERT_EQ(48000u, cfg->GetSamplingFrequencyHzMax());
  ASSERT_EQ(10000u, cfg->GetSduIntervalUs());
  ASSERT_EQ(100u, cfg->GetMaxSduOctets());
  ASSERT_EQ(1lu, cfg->subgroups.size());
  ASSERT_EQ(2lu, cfg->subgroups.at(0).GetNumBis());
  ASSERT_EQ(2lu, cfg->subgroups.at(0).GetNumChannelsTotal());

  ASSERT_EQ(2lu, cfg->subgroups.at(0).GetBisCodecConfigs().at(0).GetNumBis());
  ASSERT_EQ(2lu,
            cfg->subgroups.at(0).GetBisCodecConfigs().at(0).GetNumChannels());
  ASSERT_EQ(
      1lu,
      cfg->subgroups.at(0).GetBisCodecConfigs().at(0).GetNumChannelsPerBis());

  // Clean up the before testing any other offload capabilities.
  codec_manager->Stop();
}

TEST_F(CodecManagerTestAdsp, test_update_broadcast_offloader) {
  static const set_configurations::CodecConfigSetting bc_lc3_48_2 = {
      .id = kLeAudioCodecIdLc3,
      .params = types::LeAudioLtvMap({
          LTV_ENTRY_SAMPLING_FREQUENCY(
              codec_spec_conf::kLeAudioSamplingFreq48000Hz),
          LTV_ENTRY_FRAME_DURATION(
              codec_spec_conf::kLeAudioCodecFrameDur10000us),
          LTV_ENTRY_AUDIO_CHANNEL_ALLOCATION(
              codec_spec_conf::kLeAudioLocationStereo),
          LTV_ENTRY_OCTETS_PER_CODEC_FRAME(100),
      }),
      .channel_count_per_iso_stream = 2,
  };
  std::vector<AudioSetConfiguration> offload_capabilities = {
      {.confs = {.sink = {set_configurations::AseConfiguration(lc3_48_2)},
      {.confs = {.sink = {set_configurations::AseConfiguration(bc_lc3_48_2)},
                 .source = {}},
       .topology_info = {{{0, 0}}}}};
  set_mock_offload_capabilities(offload_capabilities);