Update HAL structure to include offload capability for broadcast

Bug: 205806028
Bug: 150670922
Test: make build
Change-Id: Ife4a3585474999855ffb04f3946462a137fdc181
This commit is contained in:
Patty
2022-01-06 15:24:01 +08:00
parent d563e5bc9e
commit 2e64b4d9f6
4 changed files with 56 additions and 39 deletions

View File

@@ -239,7 +239,7 @@ Return<void> BluetoothAudioProvidersFactory::getProviderCapabilities_2_2(
LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH ||
sessionType == V2_1::SessionType::
LE_AUDIO_HARDWARE_OFFLOAD_DECODING_DATAPATH) {
std::vector<LeAudioCodecCapabilitiesPair> db_codec_capabilities =
std::vector<LeAudioCodecCapabilitiesSetting> db_codec_capabilities =
android::bluetooth::audio::GetLeAudioOffloadCodecCapabilities(
sessionType);
if (db_codec_capabilities.size()) {

View File

@@ -83,23 +83,22 @@ safe_union AudioConfiguration {
safe_union AudioCapabilities {
PcmParameters pcmCapabilities;
CodecCapabilities codecCapabilities;
LeAudioCodecCapabilitiesPair leAudioCapabilities;
LeAudioCodecCapabilitiesSetting leAudioCapabilities;
};
/**
* Used to specify th le audio capabilities pair of the Hardware offload encode and decode.
* Used to specify the le audio capabilities for unicast and broadcast hardware offload.
*/
struct LeAudioCodecCapabilitiesPair{
LeAudioMode mode;
LeAudioCodecCapability encodeCapability;
LeAudioCodecCapability decodeCapability;
struct LeAudioCodecCapabilitiesSetting{
UnicastCapability unicastEncodeCapability;
UnicastCapability unicastDecodeCapability;
BroadcastCapability broadcastCapability;
};
/**
* Used to specify the le audio capabilities of the codecs supported by Hardware offload
* for encode or decode.
* Used to specify the le audio unicast codec capabilities for hardware offload.
*/
struct LeAudioCodecCapability {
struct UnicastCapability {
CodecType codecType;
AudioLocation supportedChannel;
@@ -112,3 +111,17 @@ struct LeAudioCodecCapability {
// Should use safe union when there is more than one codec
Lc3Parameters capabilities;
};
/**
* Used to specify the le audio broadcast codec capabilities for hardware offload.
*/
struct BroadcastCapability {
CodecType codecType;
AudioLocation supportedChannel;
// Supported channel count for each stream
uint8_t channelCountPerStream;
// Should use safe union when there is more than one codec
vec<Lc3Parameters> capabilities;
};

View File

@@ -30,16 +30,20 @@ using ::android::hardware::bluetooth::audio::V2_1::Lc3FrameDuration;
using ::android::hardware::bluetooth::audio::V2_1::Lc3Parameters;
using ::android::hardware::bluetooth::audio::V2_1::SampleRate;
using ::android::hardware::bluetooth::audio::V2_2::AudioLocation;
using ::android::hardware::bluetooth::audio::V2_2::LeAudioCodecCapabilitiesPair;
using ::android::hardware::bluetooth::audio::V2_2::LeAudioCodecCapability;
using ::android::hardware::bluetooth::audio::V2_2::LeAudioMode;
using ::android::hardware::bluetooth::audio::V2_2::BroadcastCapability;
using ::android::hardware::bluetooth::audio::V2_2::
LeAudioCodecCapabilitiesSetting;
using ::android::hardware::bluetooth::audio::V2_2::UnicastCapability;
using SessionType_2_1 =
::android::hardware::bluetooth::audio::V2_1::SessionType;
// Stores the list of offload supported capability
std::vector<LeAudioCodecCapabilitiesPair> kDefaultOffloadLeAudioCapabilities;
std::vector<LeAudioCodecCapabilitiesSetting> kDefaultOffloadLeAudioCapabilities;
static const LeAudioCodecCapability kInvalidLc3Capability = {
static const UnicastCapability kInvalidUnicastCapability = {
.codecType = CodecType::UNKNOWN};
static const BroadcastCapability kInvalidBroadcastCapability = {
.codecType = CodecType::UNKNOWN};
// Default Supported Codecs
@@ -94,53 +98,53 @@ bool IsOffloadLeAudioConfigurationValid(
return true;
}
LeAudioCodecCapability composeLc3Capability(AudioLocation audioLocation,
uint8_t deviceCnt,
uint8_t channelCount,
Lc3Parameters capability) {
return LeAudioCodecCapability{.codecType = CodecType::LC3,
.supportedChannel = audioLocation,
.deviceCount = deviceCnt,
.channelCountPerDevice = channelCount,
.capabilities = capability};
UnicastCapability composeUnicastLc3Capability(AudioLocation audioLocation,
uint8_t deviceCnt,
uint8_t channelCount,
Lc3Parameters capability) {
return UnicastCapability{.codecType = CodecType::LC3,
.supportedChannel = audioLocation,
.deviceCount = deviceCnt,
.channelCountPerDevice = channelCount,
.capabilities = capability};
}
std::vector<LeAudioCodecCapabilitiesPair> GetLeAudioOffloadCodecCapabilities(
std::vector<LeAudioCodecCapabilitiesSetting> GetLeAudioOffloadCodecCapabilities(
const SessionType_2_1& session_type) {
if (session_type !=
SessionType_2_1::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH &&
session_type !=
SessionType_2_1::LE_AUDIO_HARDWARE_OFFLOAD_DECODING_DATAPATH) {
return std::vector<LeAudioCodecCapabilitiesPair>(0);
return std::vector<LeAudioCodecCapabilitiesSetting>(0);
}
if (kDefaultOffloadLeAudioCapabilities.empty()) {
for (auto [audioLocation, deviceCnt, channelCount] :
supportedDeviceSetting) {
for (auto capability : supportedLc3CapabilityList) {
LeAudioCodecCapability lc3Capability = composeLc3Capability(
UnicastCapability lc3Capability = composeUnicastLc3Capability(
audioLocation, deviceCnt, channelCount, capability);
LeAudioCodecCapability lc3MonoCapability =
composeLc3Capability(monoAudio, 1, 1, capability);
UnicastCapability lc3MonoDecodeCapability =
composeUnicastLc3Capability(monoAudio, 1, 1, capability);
// Adds the capability for encode only
kDefaultOffloadLeAudioCapabilities.push_back(
{.mode = LeAudioMode::UNICAST,
.encodeCapability = lc3Capability,
.decodeCapability = kInvalidLc3Capability});
{.unicastEncodeCapability = lc3Capability,
.unicastDecodeCapability = kInvalidUnicastCapability,
.broadcastCapability = kInvalidBroadcastCapability});
// Adds the capability for decode only
kDefaultOffloadLeAudioCapabilities.push_back(
{.mode = LeAudioMode::UNICAST,
.encodeCapability = kInvalidLc3Capability,
.decodeCapability = lc3Capability});
{.unicastEncodeCapability = kInvalidUnicastCapability,
.unicastDecodeCapability = lc3Capability,
.broadcastCapability = kInvalidBroadcastCapability});
// Adds the capability for the case that encode and decode exist at the
// same time
kDefaultOffloadLeAudioCapabilities.push_back(
{.mode = LeAudioMode::UNICAST,
.encodeCapability = lc3Capability,
.decodeCapability = lc3MonoCapability});
{.unicastEncodeCapability = lc3Capability,
.unicastDecodeCapability = lc3MonoDecodeCapability,
.broadcastCapability = kInvalidBroadcastCapability});
}
}
}

View File

@@ -31,7 +31,7 @@ bool IsOffloadLeAudioConfigurationValid(
const ::android::hardware::bluetooth::audio::V2_2::LeAudioConfiguration&
le_audio_codec_config);
std::vector<hardware::bluetooth::audio::V2_2::LeAudioCodecCapabilitiesPair>
std::vector<hardware::bluetooth::audio::V2_2::LeAudioCodecCapabilitiesSetting>
GetLeAudioOffloadCodecCapabilities(
const ::android::hardware::bluetooth::audio::V2_1::SessionType&
session_type);