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

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

LeAudio/Brodcaster: Adjust the configuration struct

This defines the channel count explicitly in the static configuration
structs for the broadcast codec configurations, instead of deriving it
from one of the LTV parameters.

This is to match the AIDL config provider and decouple from the
LTV allocation counter channel count, which is not vendor codec
friendly (uses LTV list).

Bug: 308428860
Test: atest bluetooth_le_audio_test bluetooth_le_audio_client_test  bluetooth_test_broadcaster bluetooth_test_broadcaster_state_machine bluetooth_le_audio_codec_manager_test
Flag: EXEMPT; no functional change, parameter extraction veirfied by the unit tests
Change-Id: I95fb89191717f4f560fdc89e11d99d34ce4ea39f
parent 01e90bd3
Loading
Loading
Loading
Loading
+14 −7
Original line number Diff line number Diff line
@@ -33,6 +33,8 @@ static const BroadcastSubgroupCodecConfig lc3_mono_16_2 =
        {BroadcastSubgroupBisCodecConfig{
            // num_bis
            1,
            // bis_channel_cnt_
            1,
            // codec_specific
            types::LeAudioLtvMap({
                LTV_ENTRY_SAMPLING_FREQUENCY(
@@ -41,7 +43,6 @@ static const BroadcastSubgroupCodecConfig lc3_mono_16_2 =
                    codec_spec_conf::kLeAudioCodecFrameDur10000us),
                LTV_ENTRY_OCTETS_PER_CODEC_FRAME(40),
            }),
            // .channel_count_per_iso_stream = 1,
        }},
        // bits_per_sample
        16);
@@ -52,6 +53,8 @@ static const BroadcastSubgroupCodecConfig lc3_stereo_16_2 =
        {BroadcastSubgroupBisCodecConfig{
            // num_bis
            2,
            // bis_channel_cnt_
            1,
            // codec_specific
            types::LeAudioLtvMap({
                LTV_ENTRY_SAMPLING_FREQUENCY(
@@ -60,7 +63,6 @@ static const BroadcastSubgroupCodecConfig lc3_stereo_16_2 =
                    codec_spec_conf::kLeAudioCodecFrameDur10000us),
                LTV_ENTRY_OCTETS_PER_CODEC_FRAME(40),
            }),
            // .channel_count_per_iso_stream = 1,
        }},
        // bits_per_sample
        16);
@@ -71,6 +73,8 @@ static const BroadcastSubgroupCodecConfig lc3_stereo_24_2 =
        {BroadcastSubgroupBisCodecConfig{
            // num_bis
            2,
            // bis_channel_cnt_
            1,
            // codec_specific
            types::LeAudioLtvMap({
                LTV_ENTRY_SAMPLING_FREQUENCY(
@@ -79,7 +83,6 @@ static const BroadcastSubgroupCodecConfig lc3_stereo_24_2 =
                    codec_spec_conf::kLeAudioCodecFrameDur10000us),
                LTV_ENTRY_OCTETS_PER_CODEC_FRAME(60),
            }),
            // .channel_count_per_iso_stream = 1,
        }},
        // bits_per_sample
        16);
@@ -90,6 +93,8 @@ static const BroadcastSubgroupCodecConfig lc3_stereo_48_1 =
        {BroadcastSubgroupBisCodecConfig{
            // num_bis
            2,
            // bis_channel_cnt_
            1,
            // codec_specific
            types::LeAudioLtvMap({
                LTV_ENTRY_SAMPLING_FREQUENCY(
@@ -98,7 +103,6 @@ static const BroadcastSubgroupCodecConfig lc3_stereo_48_1 =
                    codec_spec_conf::kLeAudioCodecFrameDur7500us),
                LTV_ENTRY_OCTETS_PER_CODEC_FRAME(75),
            }),
            // .channel_count_per_iso_stream = 1,
        }},
        // bits_per_sample
        16);
@@ -109,6 +113,8 @@ static const BroadcastSubgroupCodecConfig lc3_stereo_48_2 =
        {BroadcastSubgroupBisCodecConfig{
            // num_bis
            2,
            // bis_channel_cnt_
            1,
            // codec_specific
            types::LeAudioLtvMap({
                LTV_ENTRY_SAMPLING_FREQUENCY(
@@ -117,7 +123,6 @@ static const BroadcastSubgroupCodecConfig lc3_stereo_48_2 =
                    codec_spec_conf::kLeAudioCodecFrameDur10000us),
                LTV_ENTRY_OCTETS_PER_CODEC_FRAME(100),
            }),
            // .channel_count_per_iso_stream = 1,
        }},
        // bits_per_sample
        16);
@@ -128,6 +133,8 @@ static const BroadcastSubgroupCodecConfig lc3_stereo_48_3 =
        {BroadcastSubgroupBisCodecConfig{
            // num_bis
            2,
            // bis_channel_cnt_
            1,
            // codec_specific
            types::LeAudioLtvMap({
                LTV_ENTRY_SAMPLING_FREQUENCY(
@@ -136,7 +143,6 @@ static const BroadcastSubgroupCodecConfig lc3_stereo_48_3 =
                    codec_spec_conf::kLeAudioCodecFrameDur7500us),
                LTV_ENTRY_OCTETS_PER_CODEC_FRAME(90),
            }),
            // .channel_count_per_iso_stream = 1,
        }},
        // bits_per_sample
        16);
@@ -147,6 +153,8 @@ static const BroadcastSubgroupCodecConfig lc3_stereo_48_4 =
        {BroadcastSubgroupBisCodecConfig{
            // num_bis
            2,
            // bis_channel_cnt_
            1,
            // codec_specific
            types::LeAudioLtvMap({
                LTV_ENTRY_SAMPLING_FREQUENCY(
@@ -155,7 +163,6 @@ static const BroadcastSubgroupCodecConfig lc3_stereo_48_4 =
                    codec_spec_conf::kLeAudioCodecFrameDur10000us),
                LTV_ENTRY_OCTETS_PER_CODEC_FRAME(120),
            }),
            // .channel_count_per_iso_stream = 1,
        }},
        // bits_per_sample
        16);
+2 −0
Original line number Diff line number Diff line
@@ -895,6 +895,8 @@ static const broadcaster::BroadcastSubgroupCodecConfig vendor_stereo_16_2 =
        {broadcaster::BroadcastSubgroupBisCodecConfig{
            // num_bis
            2,
            // bis_channel_cnt
            1,
            // codec_specific
            types::LeAudioLtvMap({
                LTV_ENTRY_SAMPLING_FREQUENCY(
+6 −4
Original line number Diff line number Diff line
@@ -54,14 +54,17 @@ void PreparePeriodicData(

struct BroadcastSubgroupBisCodecConfig {
  BroadcastSubgroupBisCodecConfig(
      uint8_t num_bis, types::LeAudioLtvMap codec_specific,
      uint8_t num_bis, uint8_t bis_channel_cnt,
      types::LeAudioLtvMap codec_specific,
      std::optional<std::vector<uint8_t>> vendor_codec_specific = std::nullopt)
      : num_bis_(num_bis),
        bis_channel_cnt_(bis_channel_cnt),
        codec_specific_(codec_specific),
        vendor_codec_specific_(vendor_codec_specific) {}

  bool operator==(const BroadcastSubgroupBisCodecConfig& other) const {
    return (num_bis_ == other.num_bis_) &&
           (bis_channel_cnt_ == other.bis_channel_cnt_) &&
           (codec_specific_ == other.codec_specific_) &&
           (vendor_codec_specific_ == other.vendor_codec_specific_);
  }
@@ -90,12 +93,11 @@ struct BroadcastSubgroupBisCodecConfig {
    return codec_specific_.GetAsCoreCodecConfig().GetSamplingFrequencyHz();
  }

  uint8_t GetNumChannelsPerBis() const {
    return codec_specific_.GetAsCoreCodecConfig().GetChannelCountPerIsoStream();
  }
  uint8_t GetNumChannelsPerBis() const { return bis_channel_cnt_; }

 private:
  uint8_t num_bis_;
  uint8_t bis_channel_cnt_;
  /* Codec Specific Configuration */
  types::LeAudioLtvMap codec_specific_;
  std::optional<std::vector<uint8_t>> vendor_codec_specific_;
+17 −4
Original line number Diff line number Diff line
@@ -288,6 +288,15 @@ struct codec_manager_impl {
      bluetooth::le_audio::broadcast_offload_config broadcast_config;
      broadcast_config.stream_map.resize(
          core_config.GetChannelCountPerIsoStream());

      // Enable the individual channels per BIS in the stream map
      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);
        }
      }

      broadcast_config.bits_per_sample =
          LeAudioCodecConfiguration::kBitsPerSample16;
      broadcast_config.sampling_rate = core_config.GetSamplingFrequencyHz();
@@ -437,13 +446,17 @@ struct codec_manager_impl {
    codec_params.Add(codec_spec_conf::kLeAudioLtvTypeOctetsPerCodecFrame,
                     offload_config->octets_per_frame);

    // Note: We do not support a different channel count on each BIS within the
    // same subgroup.
    uint8_t allocated_channel_count =
        offload_config->stream_map.size()
            ? std::bitset<32>{offload_config->stream_map.at(0).second}.count()
            : 1;
    bluetooth::le_audio::broadcaster::BroadcastSubgroupCodecConfig codec_config(
        bluetooth::le_audio::broadcaster::kLeAudioCodecIdLc3,
        {bluetooth::le_audio::broadcaster::BroadcastSubgroupBisCodecConfig{
            // num_bis
        {bluetooth::le_audio::broadcaster::BroadcastSubgroupBisCodecConfig(
            static_cast<uint8_t>(offload_config->stream_map.size()),
            codec_params,
        }},
            allocated_channel_count, codec_params)},
        offload_config->bits_per_sample);

    bluetooth::le_audio::broadcaster::BroadcastQosConfig qos_config(