Loading system/bta/le_audio/devices.cc +69 −12 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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()); Loading system/bta/le_audio/devices.h +1 −0 Original line number Diff line number Diff line Loading @@ -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 Loading system/bta/le_audio/le_audio_types.h +7 −1 Original line number Diff line number Diff line Loading @@ -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 */ Loading @@ -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; Loading Loading
system/bta/le_audio/devices.cc +69 −12 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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()); Loading
system/bta/le_audio/devices.h +1 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
system/bta/le_audio/le_audio_types.h +7 −1 Original line number Diff line number Diff line Loading @@ -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 */ Loading @@ -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; Loading