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

Commit a39a774a authored by More Kuo's avatar More Kuo
Browse files

Fix race condition for dynamic audio buffer capabilities

When getting the dynamic audio buffer capabilities at
btif_enable_bluetooth_evt(), the HCI event of dynamic audio buffer
from the Controller may not be received yet. Move it to
btif_get_adapter_property().

Bug: 178679411
Test: Run dynamic audio buffer test
Change-Id: I93540915bc21675f8719362ec8577aff1aef8d0a
parent 102c0085
Loading
Loading
Loading
Loading
+38 −52
Original line number Diff line number Diff line
@@ -262,55 +262,6 @@ static bool btif_is_a2dp_offload_enabled() {
  return a2dp_offload_enabled_;
}

void btif_dynamic_audio_buffer_init() {
  LOG_INFO("%s entered", __func__);

  char buf[512];
  bt_property_t prop;
  prop.type = BT_PROPERTY_DYNAMIC_AUDIO_BUFFER;
  prop.val = (void*)buf;

  bt_dynamic_audio_buffer_item_t dynamic_audio_buffer_item;
  prop.len = sizeof(bt_dynamic_audio_buffer_item_t);
  LOG_DEBUG("%s prop.len = %d", __func__, prop.len);

  tBTM_BLE_VSC_CB cmn_vsc_cb;
  BTM_BleGetVendorCapabilities(&cmn_vsc_cb);

  if (btif_is_a2dp_offload_enabled() == false) {
    BTIF_TRACE_DEBUG("%s Get buffer time for A2DP software encoding", __func__);
    for (int i = 0; i < CODEC_TYPE_NUMBER; i++) {
      dynamic_audio_buffer_item.dab_item[i] = {
          .default_buffer_time = DEFAULT_BUFFER_TIME,
          .maximum_buffer_time = MAXIMUM_BUFFER_TIME,
          .minimum_buffer_time = MINIMUM_BUFFER_TIME};
    }
    memcpy(prop.val, &dynamic_audio_buffer_item, prop.len);
    invoke_adapter_properties_cb(BT_STATUS_SUCCESS, 1, &prop);
  } else {
    if (cmn_vsc_cb.dynamic_audio_buffer_support != 0) {
      BTIF_TRACE_DEBUG("%s Get buffer time for A2DP Offload", __func__);
      tBTM_BT_DYNAMIC_AUDIO_BUFFER_CB
          bt_dynamic_audio_buffer_cb[CODEC_TYPE_NUMBER];
      BTM_BleGetDynamicAudioBuffer(bt_dynamic_audio_buffer_cb);

      for (int i = 0; i < CODEC_TYPE_NUMBER; i++) {
        dynamic_audio_buffer_item.dab_item[i] = {
            .default_buffer_time =
                bt_dynamic_audio_buffer_cb[i].default_buffer_time,
            .maximum_buffer_time =
                bt_dynamic_audio_buffer_cb[i].maximum_buffer_time,
            .minimum_buffer_time =
                bt_dynamic_audio_buffer_cb[i].minimum_buffer_time};
      }
      memcpy(prop.val, &dynamic_audio_buffer_item, prop.len);
      invoke_adapter_properties_cb(BT_STATUS_SUCCESS, 1, &prop);
    } else {
      BTIF_TRACE_DEBUG("%s Don't support Dynamic Audio Buffer", __func__);
    }
  }
}

/*******************************************************************************
 *
 * Function         btif_enable_bluetooth_evt
@@ -357,9 +308,6 @@ void btif_enable_bluetooth_evt() {
  /* init pan */
  btif_pan_init();

  /* init dynamic audio buffer */
  btif_dynamic_audio_buffer_init();

  /* load did configuration */
  bte_load_did_conf(BTE_DID_CONF_FILE);

@@ -647,6 +595,44 @@ void btif_get_adapter_property(bt_property_type_t type) {
    local_le_features.debug_logging_supported =
        cmn_vsc_cb.debug_logging_supported > 0;
    memcpy(prop.val, &local_le_features, prop.len);
  } else if (prop.type == BT_PROPERTY_DYNAMIC_AUDIO_BUFFER) {
    tBTM_BLE_VSC_CB cmn_vsc_cb;
    bt_dynamic_audio_buffer_item_t dynamic_audio_buffer_item;

    BTM_BleGetVendorCapabilities(&cmn_vsc_cb);

    prop.len = sizeof(bt_dynamic_audio_buffer_item_t);
    if (btif_is_a2dp_offload_enabled() == false) {
      BTIF_TRACE_DEBUG("%s Get buffer millis for A2DP software encoding",
                       __func__);
      for (int i = 0; i < CODEC_TYPE_NUMBER; i++) {
        dynamic_audio_buffer_item.dab_item[i] = {
            .default_buffer_time = DEFAULT_BUFFER_TIME,
            .maximum_buffer_time = MAXIMUM_BUFFER_TIME,
            .minimum_buffer_time = MINIMUM_BUFFER_TIME};
      }
      memcpy(prop.val, &dynamic_audio_buffer_item, prop.len);
    } else {
      if (cmn_vsc_cb.dynamic_audio_buffer_support != 0) {
        BTIF_TRACE_DEBUG("%s Get buffer millis for A2DP Offload", __func__);
        tBTM_BT_DYNAMIC_AUDIO_BUFFER_CB
            bt_dynamic_audio_buffer_cb[CODEC_TYPE_NUMBER];
        BTM_BleGetDynamicAudioBuffer(bt_dynamic_audio_buffer_cb);

        for (int i = 0; i < CODEC_TYPE_NUMBER; i++) {
          dynamic_audio_buffer_item.dab_item[i] = {
              .default_buffer_time =
                  bt_dynamic_audio_buffer_cb[i].default_buffer_time,
              .maximum_buffer_time =
                  bt_dynamic_audio_buffer_cb[i].maximum_buffer_time,
              .minimum_buffer_time =
                  bt_dynamic_audio_buffer_cb[i].minimum_buffer_time};
        }
        memcpy(prop.val, &dynamic_audio_buffer_item, prop.len);
      } else {
        BTIF_TRACE_DEBUG("%s Don't support Dynamic Audio Buffer", __func__);
      }
    }
  } else {
    status = btif_storage_get_adapter_property(&prop);
  }