Loading system/btif/src/btif_av.cc +2 −1 Original line number Diff line number Diff line Loading @@ -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); } Loading system/gd/hci/controller.cc +33 −8 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ #include "hci/controller.h" #include <android_bluetooth_flags.h> #include <future> #include <memory> #include <string> Loading Loading @@ -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(); Loading Loading @@ -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; Loading @@ -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) { Loading system/gd/hci/controller_interface.h +1 −0 Original line number Diff line number Diff line Loading @@ -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; Loading system/gd/hci/controller_test.cc +55 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ #include "hci/controller.h" #include <android_bluetooth_flags.h> #include <gtest/gtest.h> #include <unistd.h> Loading Loading @@ -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) { Loading Loading @@ -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)); Loading @@ -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; Loading system/pdl/hci/hci_packets.pdl +5 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
system/btif/src/btif_av.cc +2 −1 Original line number Diff line number Diff line Loading @@ -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); } Loading
system/gd/hci/controller.cc +33 −8 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ #include "hci/controller.h" #include <android_bluetooth_flags.h> #include <future> #include <memory> #include <string> Loading Loading @@ -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(); Loading Loading @@ -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; Loading @@ -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) { Loading
system/gd/hci/controller_interface.h +1 −0 Original line number Diff line number Diff line Loading @@ -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; Loading
system/gd/hci/controller_test.cc +55 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ #include "hci/controller.h" #include <android_bluetooth_flags.h> #include <gtest/gtest.h> #include <unistd.h> Loading Loading @@ -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) { Loading Loading @@ -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)); Loading @@ -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; Loading
system/pdl/hci/hci_packets.pdl +5 −0 Original line number Diff line number Diff line Loading @@ -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