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

Commit a36df328 authored by Jakub Tyszkowski (xWF)'s avatar Jakub Tyszkowski (xWF) Committed by Gerrit Code Review
Browse files

Merge "LeAudio: Fix handling mono audio allocation" into main

parents 9ad78551 dd406217
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -548,7 +548,7 @@ TEST(LeAudioClientParserTest, testParsePacsVendorCodecRecords) {
}

TEST(LeAudioClientParserTest, testParseAudioLocationsInvalidLength) {
  types::AudioLocations locations = codec_spec_conf::kLeAudioLocationNotAllowed;
  types::AudioLocations locations = codec_spec_conf::kLeAudioLocationMonoAudio;
  const uint8_t value1[] = {
          0x01,
          0x02,
@@ -563,7 +563,7 @@ TEST(LeAudioClientParserTest, testParseAudioLocationsInvalidLength) {
}

TEST(LeAudioClientParserTest, testParseAudioLocations) {
  types::AudioLocations locations = codec_spec_conf::kLeAudioLocationNotAllowed;
  types::AudioLocations locations = codec_spec_conf::kLeAudioLocationMonoAudio;
  const uint8_t value1[] = {0x01, 0x02, 0x03, 0x04};
  ParseAudioLocations(locations, sizeof(value1), value1);
  ASSERT_EQ(locations, 0x04030201u);
+7 −6
Original line number Diff line number Diff line
@@ -832,8 +832,8 @@ LeAudioDeviceGroup::GetAudioSetConfigurationRequirements(types::LeAudioContextTy
                                    ? device->snk_audio_locations_
                                    : device->src_audio_locations_;
      if (dev_locations.none()) {
        log::warn("Device {} has no locations for direction: {}", device->address_, (int)direction);
        continue;
        log::warn("Device {} has no specified locations for direction: {}", device->address_,
                  (int)direction);
      }

      has_location.get(direction) = true;
@@ -932,8 +932,8 @@ types::BidirectionalPair<AudioContexts> LeAudioDeviceGroup::GetLatestAvailableCo
}

bool LeAudioDeviceGroup::ReloadAudioLocations(void) {
  AudioLocations updated_snk_audio_locations_ = codec_spec_conf::kLeAudioLocationNotAllowed;
  AudioLocations updated_src_audio_locations_ = codec_spec_conf::kLeAudioLocationNotAllowed;
  AudioLocations updated_snk_audio_locations_ = codec_spec_conf::kLeAudioLocationMonoAudio;
  AudioLocations updated_src_audio_locations_ = codec_spec_conf::kLeAudioLocationMonoAudio;

  for (const auto& device : leAudioDevices_) {
    if (device.expired() ||
@@ -1048,7 +1048,8 @@ types::LeAudioConfigurationStrategy LeAudioDeviceGroup::GetGroupSinkStrategy() c

      log::debug("audio location 0x{:04x}", snk_audio_locations_.to_ulong());
      if (!(snk_audio_locations_.to_ulong() & codec_spec_conf::kLeAudioLocationAnyLeft) ||
          !(snk_audio_locations_.to_ulong() & codec_spec_conf::kLeAudioLocationAnyRight)) {
          !(snk_audio_locations_.to_ulong() & codec_spec_conf::kLeAudioLocationAnyRight) ||
          snk_audio_locations_.none()) {
        return types::LeAudioConfigurationStrategy::MONO_ONE_CIS_PER_DEVICE;
      }

@@ -1341,7 +1342,7 @@ bool CheckIfStrategySupported(types::LeAudioConfigurationStrategy strategy,

  switch (strategy) {
    case types::LeAudioConfigurationStrategy::MONO_ONE_CIS_PER_DEVICE:
      return audio_locations.any();
      return true;
    case types::LeAudioConfigurationStrategy::STEREO_TWO_CISES_PER_DEVICE:
      if ((audio_locations.to_ulong() & codec_spec_conf::kLeAudioLocationAnyLeft) &&
          (audio_locations.to_ulong() & codec_spec_conf::kLeAudioLocationAnyRight)) {
+5 −0
Original line number Diff line number Diff line
@@ -298,6 +298,11 @@ bool LeAudioDevice::ConfigureAses(const set_configurations::AudioSetConfiguratio
                   return true;
                 }

                 // No locations bits means mono audio
                 if (audio_locations.none()) {
                   return true;
                 }

                 // Filter-out not matching audio locations
                 return (cfg.codec.params.GetAsCoreCodecConfig().audio_channel_allocation.value() &
                         audio_locations.to_ulong()) != 0;
+18 −0
Original line number Diff line number Diff line
@@ -596,6 +596,14 @@ protected:
          bit_pos++;
        }

        if (split_allocations.empty()) {
          // Add a single ASE mono configuration
          endpoint_cfg.codec.params.Add(codec_spec_conf::kLeAudioLtvTypeAudioChannelAllocation,
                                        (uint32_t)codec_spec_conf::kLeAudioLocationMonoAudio);
          ase_confs.push_back(endpoint_cfg);
          continue;
        }

        // Pick a number of allocations from the list (depending on supported
        // channel counts per ASE) and create an ASE configuration.
        while (split_allocations.size()) {
@@ -1598,6 +1606,16 @@ TEST_P(LeAudioAseConfigurationTest, test_banded_headset_ringtone_mono_microphone
  TestGroupAseConfiguration(LeAudioContextType::RINGTONE, &data, 1);
}

TEST_P(LeAudioAseConfigurationTest, test_banded_headset_ringtone_mono_microphone_loc0) {
  LeAudioDevice* banded_headset =
          AddTestDevice(2, 1, 0, 0, false, false, codec_spec_conf::kLeAudioLocationStereo,
                        codec_spec_conf::kLeAudioLocationMonoAudio);
  TestGroupAseConfigurationData data({banded_headset, kLeAudioCodecChannelCountTwoChannel,
                                      kLeAudioCodecChannelCountSingleChannel, 2, 1});

  TestGroupAseConfiguration(LeAudioContextType::RINGTONE, &data, 1);
}

TEST_P(LeAudioAseConfigurationTest, test_banded_headset_ringtone_stereo_microphone) {
  LeAudioDevice* banded_headset = AddTestDevice(2, 2);
  TestGroupAseConfigurationData data(
+1 −1
Original line number Diff line number Diff line
@@ -127,7 +127,7 @@ constexpr uint8_t kLeAudioCodecFrameDur7500us = 0x00;
constexpr uint8_t kLeAudioCodecFrameDur10000us = 0x01;

/* Audio Allocations */
constexpr uint32_t kLeAudioLocationNotAllowed = 0x00000000;
constexpr uint32_t kLeAudioLocationMonoAudio = 0x00000000;
constexpr uint32_t kLeAudioLocationFrontLeft = 0x00000001;
constexpr uint32_t kLeAudioLocationFrontRight = 0x00000002;
constexpr uint32_t kLeAudioLocationFrontCenter = 0x00000004;