Loading system/btif/Android.bp +4 −0 Original line number Diff line number Diff line Loading @@ -153,12 +153,14 @@ cc_library_static { "lib-bt-packets-base", "libaudio-a2dp-hw-utils", "libbluetooth-types", "libbluetooth_hci_pdl", "libbt-audio-hal-interface", "libbt-platform-protos-lite", "libbt-stack", "libbt-stack-core", "libbt_shim_bridge", "libbtif-core", "libflatbuffers-cpp", ], shared_libs: [ "android.hardware.bluetooth.audio@2.1", Loading Loading @@ -236,11 +238,13 @@ cc_library_static { "lib-bt-packets-base", "libaudio-a2dp-hw-utils", "libbluetooth_crypto_toolbox", "libbluetooth_hci_pdl", "libbt-audio-hal-interface", "libbt-jni-thread", "libbt-platform-protos-lite", "libbt-stack-core", "libbt_shim_bridge", "libflatbuffers-cpp", "libstatslog_bt", ], whole_static_libs: [ Loading system/btif/src/btif_core.cc +4 −50 Original line number Diff line number Diff line Loading @@ -49,8 +49,10 @@ #include "common/message_loop_thread.h" #include "device/include/controller.h" #include "device/include/device_iot_config.h" #include "hci/controller.h" #include "internal_include/bt_target.h" #include "internal_include/bt_trace.h" #include "main/shim/entry.h" #include "os/log.h" #include "osi/include/allocator.h" #include "osi/include/future.h" Loading Loading @@ -729,48 +731,6 @@ void btif_disable_service(tBTA_SERVICE_ID service_id) { } } void DynamicAudiobufferSizeCompleteCallback(tBTM_VSC_CMPL* p_vsc_cmpl_params) { LOG(INFO) << __func__; if (p_vsc_cmpl_params->param_len < 1) { LOG(ERROR) << __func__ << ": The length of returned parameters is less than 1"; return; } uint8_t* p_event_param_buf = p_vsc_cmpl_params->p_param_buf; uint8_t status = 0xff; uint8_t opcode = 0xff; uint16_t respond_buffer_time = 0xffff; // [Return Parameter] | [Size] | [Purpose] // Status | 1 octet | Command complete status // Dynamic_Audio_Buffer_opcode| 1 octet | 0x02 - Set buffer time // Audio_Codec_Buffer_Time | 2 octet | Current buffer time STREAM_TO_UINT8(status, p_event_param_buf); if (status != HCI_SUCCESS) { LOG(ERROR) << __func__ << ": Fail to configure DFTB. status: " << loghex(status); return; } if (p_vsc_cmpl_params->param_len != 4) { LOG(FATAL) << __func__ << ": The length of returned parameters is not equal to 4: " << std::to_string(p_vsc_cmpl_params->param_len); return; } STREAM_TO_UINT8(opcode, p_event_param_buf); LOG(INFO) << __func__ << ": opcode = " << loghex(opcode); if (opcode == 0x02) { STREAM_TO_UINT16(respond_buffer_time, p_event_param_buf); LOG(INFO) << __func__ << ": Succeed to configure Media Tx Buffer, used_buffer_time = " << loghex(respond_buffer_time); } } bt_status_t btif_set_dynamic_audio_buffer_size(int codec, int size) { LOG_VERBOSE("%s", __func__); Loading @@ -787,17 +747,11 @@ bt_status_t btif_set_dynamic_audio_buffer_size(int codec, int size) { if (cmn_vsc_cb.dynamic_audio_buffer_support != 0) { LOG_VERBOSE("%s Set buffer size (%d) for A2DP offload", __func__, size); uint16_t firmware_tx_buffer_length_byte; uint8_t param[3] = {0}; uint8_t* p_param = param; firmware_tx_buffer_length_byte = static_cast<uint16_t>(size); LOG(INFO) << __func__ << "firmware_tx_buffer_length_byte: " << firmware_tx_buffer_length_byte; UINT8_TO_STREAM(p_param, HCI_CONTROLLER_DAB_SET_BUFFER_TIME); UINT16_TO_STREAM(p_param, firmware_tx_buffer_length_byte); BTM_VendorSpecificCommand(HCI_CONTROLLER_DAB, p_param - param, param, DynamicAudiobufferSizeCompleteCallback); bluetooth::shim::GetController()->SetDabAudioBufferTime( firmware_tx_buffer_length_byte); } } Loading system/stack/btm/btm_ble_gap.cc +90 −3 Original line number Diff line number Diff line Loading @@ -40,8 +40,10 @@ #include "bta/include/bta_api.h" #include "common/time_util.h" #include "device/include/controller.h" #include "hci/controller.h" #include "include/check.h" #include "main/shim/acl_api.h" #include "main/shim/entry.h" #include "osi/include/allocator.h" #include "osi/include/osi.h" // UNUSED_ATTR #include "osi/include/properties.h" Loading Loading @@ -93,6 +95,8 @@ static void btm_ble_stop_scan(); static tBTM_STATUS btm_ble_stop_adv(void); static tBTM_STATUS btm_ble_start_adv(void); using bluetooth::shim::GetController; namespace { constexpr char kBtmLogTag[] = "SCAN"; Loading Loading @@ -821,10 +825,93 @@ void BTM_BleReadControllerFeatures(tBTM_BLE_CTRL_FEATURES_CBACK* p_vsc_cback) { LOG_VERBOSE("BTM_BleReadControllerFeatures"); if (IS_FLAG_ENABLED(report_vsc_data_from_the_gd_controller)) { btm_cb.cmn_ble_vsc_cb.values_read = true; bluetooth::hci::Controller::VendorCapabilities vendor_capabilities = GetController()->GetVendorCapabilities(); btm_cb.cmn_ble_vsc_cb.adv_inst_max = vendor_capabilities.max_advt_instances_; btm_cb.cmn_ble_vsc_cb.rpa_offloading = vendor_capabilities.offloaded_resolution_of_private_address_; btm_cb.cmn_ble_vsc_cb.tot_scan_results_strg = vendor_capabilities.total_scan_results_storage_; btm_cb.cmn_ble_vsc_cb.max_irk_list_sz = vendor_capabilities.max_irk_list_sz_; btm_cb.cmn_ble_vsc_cb.filter_support = vendor_capabilities.filtering_support_; btm_cb.cmn_ble_vsc_cb.max_filter = vendor_capabilities.max_filter_; btm_cb.cmn_ble_vsc_cb.energy_support = vendor_capabilities.activity_energy_info_support_; btm_cb.cmn_ble_vsc_cb.version_supported = vendor_capabilities.version_supported_; btm_cb.cmn_ble_vsc_cb.total_trackable_advertisers = vendor_capabilities.total_num_of_advt_tracked_; btm_cb.cmn_ble_vsc_cb.extended_scan_support = vendor_capabilities.extended_scan_support_; btm_cb.cmn_ble_vsc_cb.debug_logging_supported = vendor_capabilities.debug_logging_supported_; btm_cb.cmn_ble_vsc_cb.le_address_generation_offloading_support = vendor_capabilities.le_address_generation_offloading_support_; btm_cb.cmn_ble_vsc_cb.a2dp_source_offload_capability_mask = vendor_capabilities.a2dp_source_offload_capability_mask_; btm_cb.cmn_ble_vsc_cb.quality_report_support = vendor_capabilities.bluetooth_quality_report_support_; btm_cb.cmn_ble_vsc_cb.dynamic_audio_buffer_support = vendor_capabilities.dynamic_audio_buffer_support_; if (vendor_capabilities.dynamic_audio_buffer_support_) { std::array<bluetooth::hci::DynamicAudioBufferCodecCapability, BTM_CODEC_TYPE_MAX_RECORDS> capabilities = GetController()->GetDabCodecCapabilities(); for (size_t i = 0; i < capabilities.size(); i++) { btm_cb.dynamic_audio_buffer_cb[i].default_buffer_time = capabilities[i].default_time_ms_; btm_cb.dynamic_audio_buffer_cb[i].maximum_buffer_time = capabilities[i].maximum_time_ms_; btm_cb.dynamic_audio_buffer_cb[i].minimum_buffer_time = capabilities[i].minimum_time_ms_; } } if (btm_cb.cmn_ble_vsc_cb.filter_support == 1 && GetController()->GetLocalVersionInformation().manufacturer_name_ == LMP_COMPID_QTI) { // QTI controller, TDS data filter are supported by default. btm_cb.cmn_ble_vsc_cb.adv_filter_extended_features_mask = 0x01; } else { btm_cb.cmn_ble_vsc_cb.adv_filter_extended_features_mask = 0x00; } LOG_VERBOSE("irk=%d, ADV ins:%d, rpa=%d, ener=%d, ext_scan=%d", btm_cb.cmn_ble_vsc_cb.max_irk_list_sz, btm_cb.cmn_ble_vsc_cb.adv_inst_max, btm_cb.cmn_ble_vsc_cb.rpa_offloading, btm_cb.cmn_ble_vsc_cb.energy_support, btm_cb.cmn_ble_vsc_cb.extended_scan_support); if (btm_cb.cmn_ble_vsc_cb.max_filter > 0) btm_ble_adv_filter_init(); /* VS capability included and non-4.2 device */ if (GetController()->SupportsBle() && GetController()->SupportsBlePrivacy() && btm_cb.cmn_ble_vsc_cb.max_irk_list_sz > 0 && GetController()->GetLeResolvingListSize() == 0) { btm_ble_resolving_list_init(btm_cb.cmn_ble_vsc_cb.max_irk_list_sz); } if (p_vsc_cback != NULL) { p_vsc_cback(tHCI_STATUS::HCI_SUCCESS); } } else { p_ctrl_le_feature_rd_cmpl_cback = p_vsc_cback; BTM_VendorSpecificCommand(HCI_BLE_VENDOR_CAP, 0, NULL, btm_ble_vendor_capability_vsc_cmpl_cback); } } /******************************************************************************* * Loading system/test/mock/mock_btif_core.cc +0 −3 Original line number Diff line number Diff line Loading @@ -79,9 +79,6 @@ tBTA_SERVICE_MASK btif_get_enabled_services_mask(void) { inc_func_call_count(__func__); return 0; } void DynamicAudiobufferSizeCompleteCallback(tBTM_VSC_CMPL* p_vsc_cmpl_params) { inc_func_call_count(__func__); } void btif_adapter_properties_evt(bt_status_t status, uint32_t num_props, bt_property_t* p_props) { inc_func_call_count(__func__); Loading system/test/suite/Android.bp +4 −0 Original line number Diff line number Diff line Loading @@ -118,6 +118,7 @@ cc_test { static_libs: [ "libbluetooth_crypto_toolbox", "libbluetooth_gd", "libbluetooth_hci_pdl", "libbt-btu-main-thread", "libbt-jni-thread", "libbt-platform-protos-lite", Loading @@ -129,6 +130,9 @@ cc_test { shared_libs: [ "server_configurable_flags", ], generated_headers: [ "BluetoothGeneratedDumpsysDataSchema_h", ], target: { android: { static_libs: [ Loading Loading
system/btif/Android.bp +4 −0 Original line number Diff line number Diff line Loading @@ -153,12 +153,14 @@ cc_library_static { "lib-bt-packets-base", "libaudio-a2dp-hw-utils", "libbluetooth-types", "libbluetooth_hci_pdl", "libbt-audio-hal-interface", "libbt-platform-protos-lite", "libbt-stack", "libbt-stack-core", "libbt_shim_bridge", "libbtif-core", "libflatbuffers-cpp", ], shared_libs: [ "android.hardware.bluetooth.audio@2.1", Loading Loading @@ -236,11 +238,13 @@ cc_library_static { "lib-bt-packets-base", "libaudio-a2dp-hw-utils", "libbluetooth_crypto_toolbox", "libbluetooth_hci_pdl", "libbt-audio-hal-interface", "libbt-jni-thread", "libbt-platform-protos-lite", "libbt-stack-core", "libbt_shim_bridge", "libflatbuffers-cpp", "libstatslog_bt", ], whole_static_libs: [ Loading
system/btif/src/btif_core.cc +4 −50 Original line number Diff line number Diff line Loading @@ -49,8 +49,10 @@ #include "common/message_loop_thread.h" #include "device/include/controller.h" #include "device/include/device_iot_config.h" #include "hci/controller.h" #include "internal_include/bt_target.h" #include "internal_include/bt_trace.h" #include "main/shim/entry.h" #include "os/log.h" #include "osi/include/allocator.h" #include "osi/include/future.h" Loading Loading @@ -729,48 +731,6 @@ void btif_disable_service(tBTA_SERVICE_ID service_id) { } } void DynamicAudiobufferSizeCompleteCallback(tBTM_VSC_CMPL* p_vsc_cmpl_params) { LOG(INFO) << __func__; if (p_vsc_cmpl_params->param_len < 1) { LOG(ERROR) << __func__ << ": The length of returned parameters is less than 1"; return; } uint8_t* p_event_param_buf = p_vsc_cmpl_params->p_param_buf; uint8_t status = 0xff; uint8_t opcode = 0xff; uint16_t respond_buffer_time = 0xffff; // [Return Parameter] | [Size] | [Purpose] // Status | 1 octet | Command complete status // Dynamic_Audio_Buffer_opcode| 1 octet | 0x02 - Set buffer time // Audio_Codec_Buffer_Time | 2 octet | Current buffer time STREAM_TO_UINT8(status, p_event_param_buf); if (status != HCI_SUCCESS) { LOG(ERROR) << __func__ << ": Fail to configure DFTB. status: " << loghex(status); return; } if (p_vsc_cmpl_params->param_len != 4) { LOG(FATAL) << __func__ << ": The length of returned parameters is not equal to 4: " << std::to_string(p_vsc_cmpl_params->param_len); return; } STREAM_TO_UINT8(opcode, p_event_param_buf); LOG(INFO) << __func__ << ": opcode = " << loghex(opcode); if (opcode == 0x02) { STREAM_TO_UINT16(respond_buffer_time, p_event_param_buf); LOG(INFO) << __func__ << ": Succeed to configure Media Tx Buffer, used_buffer_time = " << loghex(respond_buffer_time); } } bt_status_t btif_set_dynamic_audio_buffer_size(int codec, int size) { LOG_VERBOSE("%s", __func__); Loading @@ -787,17 +747,11 @@ bt_status_t btif_set_dynamic_audio_buffer_size(int codec, int size) { if (cmn_vsc_cb.dynamic_audio_buffer_support != 0) { LOG_VERBOSE("%s Set buffer size (%d) for A2DP offload", __func__, size); uint16_t firmware_tx_buffer_length_byte; uint8_t param[3] = {0}; uint8_t* p_param = param; firmware_tx_buffer_length_byte = static_cast<uint16_t>(size); LOG(INFO) << __func__ << "firmware_tx_buffer_length_byte: " << firmware_tx_buffer_length_byte; UINT8_TO_STREAM(p_param, HCI_CONTROLLER_DAB_SET_BUFFER_TIME); UINT16_TO_STREAM(p_param, firmware_tx_buffer_length_byte); BTM_VendorSpecificCommand(HCI_CONTROLLER_DAB, p_param - param, param, DynamicAudiobufferSizeCompleteCallback); bluetooth::shim::GetController()->SetDabAudioBufferTime( firmware_tx_buffer_length_byte); } } Loading
system/stack/btm/btm_ble_gap.cc +90 −3 Original line number Diff line number Diff line Loading @@ -40,8 +40,10 @@ #include "bta/include/bta_api.h" #include "common/time_util.h" #include "device/include/controller.h" #include "hci/controller.h" #include "include/check.h" #include "main/shim/acl_api.h" #include "main/shim/entry.h" #include "osi/include/allocator.h" #include "osi/include/osi.h" // UNUSED_ATTR #include "osi/include/properties.h" Loading Loading @@ -93,6 +95,8 @@ static void btm_ble_stop_scan(); static tBTM_STATUS btm_ble_stop_adv(void); static tBTM_STATUS btm_ble_start_adv(void); using bluetooth::shim::GetController; namespace { constexpr char kBtmLogTag[] = "SCAN"; Loading Loading @@ -821,10 +825,93 @@ void BTM_BleReadControllerFeatures(tBTM_BLE_CTRL_FEATURES_CBACK* p_vsc_cback) { LOG_VERBOSE("BTM_BleReadControllerFeatures"); if (IS_FLAG_ENABLED(report_vsc_data_from_the_gd_controller)) { btm_cb.cmn_ble_vsc_cb.values_read = true; bluetooth::hci::Controller::VendorCapabilities vendor_capabilities = GetController()->GetVendorCapabilities(); btm_cb.cmn_ble_vsc_cb.adv_inst_max = vendor_capabilities.max_advt_instances_; btm_cb.cmn_ble_vsc_cb.rpa_offloading = vendor_capabilities.offloaded_resolution_of_private_address_; btm_cb.cmn_ble_vsc_cb.tot_scan_results_strg = vendor_capabilities.total_scan_results_storage_; btm_cb.cmn_ble_vsc_cb.max_irk_list_sz = vendor_capabilities.max_irk_list_sz_; btm_cb.cmn_ble_vsc_cb.filter_support = vendor_capabilities.filtering_support_; btm_cb.cmn_ble_vsc_cb.max_filter = vendor_capabilities.max_filter_; btm_cb.cmn_ble_vsc_cb.energy_support = vendor_capabilities.activity_energy_info_support_; btm_cb.cmn_ble_vsc_cb.version_supported = vendor_capabilities.version_supported_; btm_cb.cmn_ble_vsc_cb.total_trackable_advertisers = vendor_capabilities.total_num_of_advt_tracked_; btm_cb.cmn_ble_vsc_cb.extended_scan_support = vendor_capabilities.extended_scan_support_; btm_cb.cmn_ble_vsc_cb.debug_logging_supported = vendor_capabilities.debug_logging_supported_; btm_cb.cmn_ble_vsc_cb.le_address_generation_offloading_support = vendor_capabilities.le_address_generation_offloading_support_; btm_cb.cmn_ble_vsc_cb.a2dp_source_offload_capability_mask = vendor_capabilities.a2dp_source_offload_capability_mask_; btm_cb.cmn_ble_vsc_cb.quality_report_support = vendor_capabilities.bluetooth_quality_report_support_; btm_cb.cmn_ble_vsc_cb.dynamic_audio_buffer_support = vendor_capabilities.dynamic_audio_buffer_support_; if (vendor_capabilities.dynamic_audio_buffer_support_) { std::array<bluetooth::hci::DynamicAudioBufferCodecCapability, BTM_CODEC_TYPE_MAX_RECORDS> capabilities = GetController()->GetDabCodecCapabilities(); for (size_t i = 0; i < capabilities.size(); i++) { btm_cb.dynamic_audio_buffer_cb[i].default_buffer_time = capabilities[i].default_time_ms_; btm_cb.dynamic_audio_buffer_cb[i].maximum_buffer_time = capabilities[i].maximum_time_ms_; btm_cb.dynamic_audio_buffer_cb[i].minimum_buffer_time = capabilities[i].minimum_time_ms_; } } if (btm_cb.cmn_ble_vsc_cb.filter_support == 1 && GetController()->GetLocalVersionInformation().manufacturer_name_ == LMP_COMPID_QTI) { // QTI controller, TDS data filter are supported by default. btm_cb.cmn_ble_vsc_cb.adv_filter_extended_features_mask = 0x01; } else { btm_cb.cmn_ble_vsc_cb.adv_filter_extended_features_mask = 0x00; } LOG_VERBOSE("irk=%d, ADV ins:%d, rpa=%d, ener=%d, ext_scan=%d", btm_cb.cmn_ble_vsc_cb.max_irk_list_sz, btm_cb.cmn_ble_vsc_cb.adv_inst_max, btm_cb.cmn_ble_vsc_cb.rpa_offloading, btm_cb.cmn_ble_vsc_cb.energy_support, btm_cb.cmn_ble_vsc_cb.extended_scan_support); if (btm_cb.cmn_ble_vsc_cb.max_filter > 0) btm_ble_adv_filter_init(); /* VS capability included and non-4.2 device */ if (GetController()->SupportsBle() && GetController()->SupportsBlePrivacy() && btm_cb.cmn_ble_vsc_cb.max_irk_list_sz > 0 && GetController()->GetLeResolvingListSize() == 0) { btm_ble_resolving_list_init(btm_cb.cmn_ble_vsc_cb.max_irk_list_sz); } if (p_vsc_cback != NULL) { p_vsc_cback(tHCI_STATUS::HCI_SUCCESS); } } else { p_ctrl_le_feature_rd_cmpl_cback = p_vsc_cback; BTM_VendorSpecificCommand(HCI_BLE_VENDOR_CAP, 0, NULL, btm_ble_vendor_capability_vsc_cmpl_cback); } } /******************************************************************************* * Loading
system/test/mock/mock_btif_core.cc +0 −3 Original line number Diff line number Diff line Loading @@ -79,9 +79,6 @@ tBTA_SERVICE_MASK btif_get_enabled_services_mask(void) { inc_func_call_count(__func__); return 0; } void DynamicAudiobufferSizeCompleteCallback(tBTM_VSC_CMPL* p_vsc_cmpl_params) { inc_func_call_count(__func__); } void btif_adapter_properties_evt(bt_status_t status, uint32_t num_props, bt_property_t* p_props) { inc_func_call_count(__func__); Loading
system/test/suite/Android.bp +4 −0 Original line number Diff line number Diff line Loading @@ -118,6 +118,7 @@ cc_test { static_libs: [ "libbluetooth_crypto_toolbox", "libbluetooth_gd", "libbluetooth_hci_pdl", "libbt-btu-main-thread", "libbt-jni-thread", "libbt-platform-protos-lite", Loading @@ -129,6 +130,9 @@ cc_test { shared_libs: [ "server_configurable_flags", ], generated_headers: [ "BluetoothGeneratedDumpsysDataSchema_h", ], target: { android: { static_libs: [ Loading