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

Commit cfb6729e authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Use Headtracker codec metadata for transport support" into main

parents 91011d3f 9c716b2d
Loading
Loading
Loading
Loading
+69 −12
Original line number Diff line number Diff line
@@ -409,6 +409,74 @@ LeAudioDevice::~LeAudioDevice(void) {
  this->ClearPACs();
}

void LeAudioDevice::ParseHeadtrackingCodec(
    const struct types::acs_ac_record& pac) {
  if (!com::android::bluetooth::flags::leaudio_dynamic_spatial_audio()) {
    return;
  }

  if (pac.codec_id == types::kLeAudioCodecHeadtracking) {
    log::info("Headtracking supported");

    // Assume LE-ISO is supported if metadata is not available
    dsa_.modes = {
        DsaMode::DISABLED,
        DsaMode::ISO_SW,
        DsaMode::ISO_HW,
    };

    if (!com::android::bluetooth::flags::headtracker_codec_capability()) {
      return;
    }

    /*
     * Android Headtracker Codec Metadata description
     *   length: 5
     *   type: 0xFF
     *   value: {
     *     vendorId: 0x00E0 (Google)
     *     vendorSpecificMetadata: {
     *       length: 1
     *       type: 1 (Headtracker supported transports)
     *       value: x
     *     }
     *   }
     */
    std::vector<uint8_t> ltv = pac.metadata;
    if (ltv.size() < 7) {
      log::info("Headtracker codec does not have metadata");
      return;
    }

    if (ltv[0] < 5 || ltv[1] != types::kLeAudioMetadataTypeVendorSpecific ||
        ltv[2] != (types::kLeAudioVendorCompanyIdGoogle & 0xFF) ||
        ltv[3] != (types::kLeAudioVendorCompanyIdGoogle >> 8) ||
        ltv[4] != types::kLeAudioMetadataHeadtrackerTransportLen ||
        ltv[5] != types::kLeAudioMetadataHeadtrackerTransportVal) {
      log::warn("Headtracker codec metadata invalid");
      return;
    }

    uint8_t supported_transports = ltv[6];
    DsaModes dsa_modes = {DsaMode::DISABLED};

    if ((supported_transports &
         types::kLeAudioMetadataHeadtrackerTransportLeAcl) != 0) {
      log::debug("Headtracking supported over LE-ACL");
      dsa_modes.push_back(DsaMode::ACL);
    }

    if ((supported_transports &
         types::kLeAudioMetadataHeadtrackerTransportLeIso) != 0) {
      log::debug("Headtracking supported over LE-ISO");
      dsa_modes.push_back(DsaMode::ISO_SW);
      dsa_modes.push_back(DsaMode::ISO_HW);
    }

    dsa_.modes = dsa_modes;
  }
}

void LeAudioDevice::RegisterPACs(
    std::vector<struct types::acs_ac_record>* pac_db,
    std::vector<struct types::acs_ac_record>* pac_recs) {
@@ -441,18 +509,7 @@ void LeAudioDevice::RegisterPACs(
              << base::HexEncode(pac.metadata.data(), pac.metadata.size());
    log::debug("{}", debug_str.str());

    if (com::android::bluetooth::flags::leaudio_dynamic_spatial_audio()) {
      if (pac.codec_id == types::kLeAudioCodecHeadtracking) {
        log::info("Headtracking supported");
        /* Todo: Set DSA modes according to the codec configuration */
        dsa_.modes = {
            DsaMode::DISABLED,
            DsaMode::ISO_SW,
            DsaMode::ISO_HW,
        };
        /* Todo: Remove the headtracking codec from the list */
      }
    }
    ParseHeadtrackingCodec(pac);
  }

  pac_db->insert(pac_db->begin(), pac_recs->begin(), pac_recs->end());
+1 −0
Original line number Diff line number Diff line
@@ -258,6 +258,7 @@ class LeAudioDevice {

  void DumpPacsDebugState(std::stringstream& stream,
                          types::PublishedAudioCapabilities pacs);
  void ParseHeadtrackingCodec(const struct types::acs_ac_record& pac);
};

/* LeAudioDevices class represents a wraper helper over all devices in le audio
+7 −1
Original line number Diff line number Diff line
@@ -288,7 +288,6 @@ constexpr uint16_t kLeAudioVendorCompanyIdUndefined = 0x00;
constexpr uint16_t kLeAudioVendorCodecIdUndefined = 0x00;

constexpr uint16_t kLeAudioVendorCompanyIdGoogle = 0x00E0;
/* Todo: Temporary value */
constexpr uint16_t kLeAudioVendorCodecIdHeadtracking = 0x0001;

/* Metadata types from Assigned Numbers */
@@ -297,12 +296,19 @@ constexpr uint8_t kLeAudioMetadataTypeStreamingAudioContext = 0x02;
constexpr uint8_t kLeAudioMetadataTypeProgramInfo = 0x03;
constexpr uint8_t kLeAudioMetadataTypeLanguage = 0x04;
constexpr uint8_t kLeAudioMetadataTypeCcidList = 0x05;
constexpr uint8_t kLeAudioMetadataTypeVendorSpecific = 0xFF;

constexpr uint8_t kLeAudioMetadataTypeLen = 1;
constexpr uint8_t kLeAudioMetadataLenLen = 1;

constexpr uint8_t kLeAudioMetadataStreamingAudioContextLen = 2;

/* Android Headtracker Codec metadata */
constexpr uint8_t kLeAudioMetadataHeadtrackerTransportLen = 1;
constexpr uint8_t kLeAudioMetadataHeadtrackerTransportVal = 1;
constexpr uint8_t kLeAudioMetadataHeadtrackerTransportLeAcl = 1;
constexpr uint8_t kLeAudioMetadataHeadtrackerTransportLeIso = 2;

/* CSIS Types */
constexpr uint8_t kDefaultScanDurationS = 5;
constexpr uint8_t kDefaultCsisSetSize = 2;