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

Commit 9c716b2d authored by Himanshu Rawat's avatar Himanshu Rawat
Browse files

Use Headtracker codec metadata for transport support

Test: mmm packages/modules/Bluetooth
Flag: com.android.bluetooth.flags.headtracker_codec_capability
Bug: 331415942
Bug: 338098113
Change-Id: I72bf37e479d14b63964287d9bb4644bef824738f
parent b6a30e16
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;