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

Commit be0fd1c6 authored by Henri Chataing's avatar Henri Chataing
Browse files

gd/hci: Implement vendor HCI requirements v1.04

- Adds the flag a2dp_offload_v2_support that indicates
  wether the controller implements the vendor commands
  Start A2dp Offload (v2) and Stop A2dp Offload (v2)

Bug: 324570010
Bug: 308686081
Test: m com.android.btservices
Change-Id: Ie8df7eb98e09d383e158a249db81c0b3af7fcfaf
parent 45238a9d
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -1145,7 +1145,8 @@ bt_status_t BtifAvSource::Init(
  if (a2dp_offload_enabled_) {
    tBTM_BLE_VSC_CB vsc_cb = {};
    BTM_BleGetVendorCapabilities(&vsc_cb);
    bool supports_a2dp_hw_offload_v2 = vsc_cb.version_supported >= 0x0103;
    bool supports_a2dp_hw_offload_v2 =
        vsc_cb.version_supported >= 0x0104 && vsc_cb.a2dp_offload_v2_support;
    bluetooth::audio::a2dp::update_codec_offloading_capabilities(
        offloading_preference, supports_a2dp_hw_offload_v2);
  }
+33 −8
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

#include "hci/controller.h"

#include <android_bluetooth_flags.h>

#include <future>
#include <memory>
#include <string>
@@ -560,6 +562,7 @@ struct Controller::impl {
    vendor_capabilities_.le_address_generation_offloading_support_ = 0x00;
    vendor_capabilities_.a2dp_source_offload_capability_mask_ = 0x00;
    vendor_capabilities_.bluetooth_quality_report_support_ = 0x00;
    vendor_capabilities_.a2dp_offload_v2_support_ = 0x00;

    if (!complete_view.IsValid()) {
      vendor_promise.set_value();
@@ -636,6 +639,27 @@ struct Controller::impl {
    }
    vendor_capabilities_.dynamic_audio_buffer_support_ = v103.GetDynamicAudioBufferSupport();

    if (IS_FLAG_ENABLED(a2dp_offload_codec_extensibility)) {
      // v1.04
      auto v104 = LeGetVendorCapabilitiesComplete104View::Create(v103);
      if (!v104.IsValid()) {
        LOG_INFO("invalid data for hci requirements v1.04");
      } else {
        vendor_capabilities_.a2dp_offload_v2_support_ = v104.GetA2dpOffloadV2Support();
      }

      if (vendor_capabilities_.dynamic_audio_buffer_support_) {
        hci_->EnqueueCommand(
            DabGetAudioBufferTimeCapabilityBuilder::Create(),
            module_.GetHandler()->BindOnceOn(
                this,
                &Controller::impl::le_get_dynamic_audio_buffer_support_handler,
                std::move(vendor_promise)));
        return;
      }

      vendor_promise.set_value();
    } else {
      if (vendor_capabilities_.dynamic_audio_buffer_support_ == 0) {
        vendor_promise.set_value();
        return;
@@ -647,6 +671,7 @@ struct Controller::impl {
              &Controller::impl::le_get_dynamic_audio_buffer_support_handler,
              std::move(vendor_promise)));
    }
  }

  void le_get_dynamic_audio_buffer_support_handler(
      std::promise<void> vendor_promise, CommandCompleteView view) {
+1 −0
Original line number Diff line number Diff line
@@ -200,6 +200,7 @@ class ControllerInterface {
    uint32_t a2dp_source_offload_capability_mask_;
    uint8_t bluetooth_quality_report_support_;
    uint32_t dynamic_audio_buffer_support_;
    uint8_t a2dp_offload_v2_support_;
  };

  virtual uint32_t GetDabSupportedCodecs() const = 0;
+55 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

#include "hci/controller.h"

#include <android_bluetooth_flags.h>
#include <gtest/gtest.h>
#include <unistd.h>

@@ -359,6 +360,36 @@ class Controller103Test : public ControllerTest {
  }
};

class Controller104Test : public ControllerTest {
 protected:
  void SetUp() override {
    feature_spec_version_ = 0x100 + 0x04;
    BaseVendorCapabilities base_vendor_capabilities;
    base_vendor_capabilities.max_advt_instances_ = 0x10;
    base_vendor_capabilities.offloaded_resolution_of_private_address_ = 0x01;
    base_vendor_capabilities.total_scan_results_storage_ = 0x2800;
    base_vendor_capabilities.max_irk_list_sz_ = 0x20;
    base_vendor_capabilities.filtering_support_ = 0x01;
    base_vendor_capabilities.max_filter_ = 0x10;
    base_vendor_capabilities.activity_energy_info_support_ = 0x01;
    vendor_capabilities_ = LeGetVendorCapabilitiesComplete104Builder::Create(
        1,
        ErrorCode::SUCCESS,
        base_vendor_capabilities,
        feature_spec_version_,
        0x102,
        /*extended_scan_support=*/1,
        /*debug_logging_supported=*/1,
        /*le_address_generation_offloading_support=*/0,
        /*a2dp_source_offload_capability_mask=*/0x4,
        /*bluetooth_quality_report_support=*/1,
        kDynamicAudioBufferSupport,
        /*a2dp_offload_v2_support=*/1,
        std::make_unique<RawBuilder>());
    ControllerTest::SetUp();
  }
};

TEST_F(ControllerTest, startup_teardown) {}

TEST_F(ControllerTest, read_controller_info) {
@@ -504,6 +535,7 @@ TEST_F(ControllerTest, set_dynamic_audio_buffer_time) {

TEST_F(Controller103Test, feature_spec_version_103_dab_test) {
  ASSERT_EQ(controller_->GetVendorCapabilities().version_supported_, 0x100 + 3);
  ASSERT_FALSE(controller_->GetVendorCapabilities().a2dp_offload_v2_support_);
  ASSERT_TRUE(controller_->IsSupported(OpCode::LE_MULTI_ADVT));
  ASSERT_TRUE(controller_->IsSupported(OpCode::CONTROLLER_DEBUG_INFO));
  ASSERT_TRUE(controller_->IsSupported(OpCode::CONTROLLER_A2DP_OPCODE));
@@ -526,6 +558,29 @@ TEST_F(Controller103Test, set_dynamic_audio_buffer_time) {
  ASSERT_EQ(123, test_hci_layer_->dynamic_audio_buffer_time);
}

TEST_F(Controller104Test, feature_spec_version_104_test) {
  ASSERT_EQ(controller_->GetVendorCapabilities().version_supported_, 0x100 + 4);
  if (IS_FLAG_ENABLED(a2dp_offload_codec_extensibility)) {
    ASSERT_TRUE(controller_->GetVendorCapabilities().a2dp_offload_v2_support_);
  } else {
    ASSERT_FALSE(controller_->GetVendorCapabilities().a2dp_offload_v2_support_);
  }
  ASSERT_TRUE(controller_->IsSupported(OpCode::LE_MULTI_ADVT));
  ASSERT_TRUE(controller_->IsSupported(OpCode::CONTROLLER_DEBUG_INFO));
  ASSERT_TRUE(controller_->IsSupported(OpCode::CONTROLLER_A2DP_OPCODE));
  ASSERT_TRUE(controller_->IsSupported(OpCode::DYNAMIC_AUDIO_BUFFER));
  ASSERT_EQ(controller_->GetDabSupportedCodecs(), kDynamicAudioBufferSupport);
  for (size_t bit = 0; bit < 32; bit++) {
    if (kDynamicAudioBufferSupport & (1u << bit)) {
      ASSERT_GT(controller_->GetDabCodecCapabilities()[bit].maximum_time_ms_, 0) << " bit " << bit;
    } else {
      ASSERT_EQ(controller_->GetDabCodecCapabilities()[bit].maximum_time_ms_, 0);
      ASSERT_EQ(controller_->GetDabCodecCapabilities()[bit].minimum_time_ms_, 0);
      ASSERT_EQ(controller_->GetDabCodecCapabilities()[bit].default_time_ms_, 0);
    }
  }
}

std::promise<void> credits1_set;
std::promise<void> credits2_set;

+5 −0
Original line number Diff line number Diff line
@@ -5325,6 +5325,11 @@ test LeGetVendorCapabilitiesComplete103 {
  "\x0e\x1c\x01\x53\xfd\x00\x10\x01\x00\x28\x00\x01\x3e\x01\x03\x01\x14\x00\x01\x01\x00\x23\x00\x00\x00\x01\x23\x00\x00\x00",
}

packet LeGetVendorCapabilitiesComplete104 : LeGetVendorCapabilitiesComplete103 {
  a2dp_offload_v2_support : 8,
  _payload_,
}

enum SubOcf : 8 {
  SET_PARAM = 0x01,
  SET_DATA = 0x02,
Loading