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

Commit 2e64b4d9 authored by Patty's avatar Patty
Browse files

Update HAL structure to include offload capability for broadcast

Bug: 205806028
Bug: 150670922
Test: make build
Change-Id: Ife4a3585474999855ffb04f3946462a137fdc181
parent d563e5bc
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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()) {
+22 −9
Original line number Diff line number Diff line
@@ -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;
};
+32 −28
Original line number Diff line number Diff line
@@ -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,
UnicastCapability composeUnicastLc3Capability(AudioLocation audioLocation,
                                              uint8_t deviceCnt,
                                              uint8_t channelCount,
                                              Lc3Parameters capability) {
  return LeAudioCodecCapability{.codecType = CodecType::LC3,
  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});
      }
    }
  }
+1 −1
Original line number Diff line number Diff line
@@ -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);