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

Commit 3edeca84 authored by En-Shuo Hsu's avatar En-Shuo Hsu Committed by En-Shuo Hsu
Browse files

floss: Add non-offload esco params

Currently, we rely on a compile time defined constant to determine which
data path to use for SCO.

The define statement is at system/stack/btm/btm_sco.h as

 #ifndef ESCO_DATA_PATH
 #ifdef OS_ANDROID
 #define ESCO_DATA_PATH ESCO_DATA_PATH_PCM
 #else
 #define ESCO_DATA_PATH ESCO_DATA_PATH_HCI
 #endif
 #endif

We later use the defined path in btm_sco.cc when setting up the SCO
connection by overriding the esco parameter as:
p_setup->input_data_path = p_setup->output_data_path = ESCO_DATA_PATH;

We have this implementation as there was no requirement for the stack to
support the data path configuration on running time. Also, there was no
corresponding codes for the non-offload path.

Adding an optional argument to get esco parameters for non-offload path.
This also prepares us to refine the existing implementation by removing
the definition of ESCO_DATA_PATH.

Bug: 225055249
Tag: #floss
Test: emerge-zork floss
Change-Id: I89ebbc7aea965606cad52d728d8badde334d7cbb
parent 27da261f
Loading
Loading
Loading
Loading
+15 −11
Original line number Diff line number Diff line
@@ -24,11 +24,11 @@

#include <base/bind.h>
#include <base/logging.h>

#include <cstdint>

#include "bt_target.h"  // Must be first to define build configuration
#include "bt_trace.h"   // Legacy trace logging

#include "bta/ag/bta_ag_int.h"
#include "device/include/controller.h"
#include "main/shim/dumpsys.h"
@@ -385,24 +385,25 @@ static void bta_ag_create_sco(tBTA_AG_SCB* p_scb, bool is_orig) {
    p_scb->codec_msbc_settings = BTA_AG_SCO_MSBC_SETTINGS_T2;
  }

  bool offload = hfp_hal_interface::get_offload_enabled();
  /* Initialize eSCO parameters */
  enh_esco_params_t params = {};
  /* If WBS included, use CVSD by default, index is 0 for CVSD by
   * initialization. If eSCO codec is mSBC, index is T2 or T1 */
  if (esco_codec == BTM_SCO_CODEC_MSBC) {
    if (p_scb->codec_msbc_settings == BTA_AG_SCO_MSBC_SETTINGS_T2) {
      params = esco_parameters_for_codec(ESCO_CODEC_MSBC_T2);
      params = esco_parameters_for_codec(ESCO_CODEC_MSBC_T2, offload);
    } else {
      params = esco_parameters_for_codec(ESCO_CODEC_MSBC_T1);
      params = esco_parameters_for_codec(ESCO_CODEC_MSBC_T1, offload);
    }
  } else {
    if (p_scb->features & BTA_AG_PEER_FEAT_ESCO_S4 &&
        (p_scb->peer_features & BTA_AG_PEER_FEAT_ESCO_S4)) {
      // HFP >=1.7 eSCO
      params = esco_parameters_for_codec(ESCO_CODEC_CVSD_S4);
      params = esco_parameters_for_codec(ESCO_CODEC_CVSD_S4, offload);
    } else {
      // HFP <=1.6 eSCO
      params = esco_parameters_for_codec(ESCO_CODEC_CVSD_S3);
      params = esco_parameters_for_codec(ESCO_CODEC_CVSD_S3, offload);
    }
  }

@@ -452,6 +453,7 @@ static void bta_ag_create_sco(tBTA_AG_SCB* p_scb, bool is_orig) {
static void bta_ag_create_pending_sco(tBTA_AG_SCB* p_scb, bool is_local) {
  tBTA_AG_PEER_CODEC esco_codec = p_scb->inuse_codec;
  enh_esco_params_t params = {};
  bool offload = hfp_hal_interface::get_offload_enabled();
  bta_ag_cb.sco.p_curr_scb = p_scb;
  bta_ag_cb.sco.cur_idx = p_scb->sco_idx;

@@ -459,18 +461,18 @@ static void bta_ag_create_pending_sco(tBTA_AG_SCB* p_scb, bool is_local) {
  if (is_local) {
    if (esco_codec == BTM_SCO_CODEC_MSBC) {
      if (p_scb->codec_msbc_settings == BTA_AG_SCO_MSBC_SETTINGS_T2) {
        params = esco_parameters_for_codec(ESCO_CODEC_MSBC_T2);
        params = esco_parameters_for_codec(ESCO_CODEC_MSBC_T2, offload);
      } else {
        params = esco_parameters_for_codec(ESCO_CODEC_MSBC_T1);
        params = esco_parameters_for_codec(ESCO_CODEC_MSBC_T1, offload);
      }
    } else {
      if (p_scb->features & BTA_AG_PEER_FEAT_ESCO_S4 &&
          (p_scb->peer_features & BTA_AG_PEER_FEAT_ESCO_S4)) {
        // HFP >=1.7 eSCO
        params = esco_parameters_for_codec(ESCO_CODEC_CVSD_S4);
        params = esco_parameters_for_codec(ESCO_CODEC_CVSD_S4, offload);
      } else {
        // HFP <=1.6 eSCO
        params = esco_parameters_for_codec(ESCO_CODEC_CVSD_S3);
        params = esco_parameters_for_codec(ESCO_CODEC_CVSD_S3, offload);
      }
    }

@@ -489,6 +491,8 @@ static void bta_ag_create_pending_sco(tBTA_AG_SCB* p_scb, bool is_local) {
                      bta_ag_sco_disc_cback) == BTM_CMD_STARTED) {
      /* Initiating the connection, set the current sco handle */
      bta_ag_cb.sco.cur_idx = p_scb->sco_idx;
      /* Configure input/output data. */
      hfp_hal_interface::set_codec_datapath(esco_codec);
    }
    APPL_TRACE_DEBUG("%s: initiated SCO connection", __func__);
  } else {
@@ -500,10 +504,10 @@ static void bta_ag_create_pending_sco(tBTA_AG_SCB* p_scb, bool is_local) {
    if (p_scb->features & BTA_AG_PEER_FEAT_ESCO_S4 &&
        (p_scb->peer_features & BTA_AG_PEER_FEAT_ESCO_S4)) {
      // HFP >=1.7 eSCO
      params = esco_parameters_for_codec(ESCO_CODEC_CVSD_S4);
      params = esco_parameters_for_codec(ESCO_CODEC_CVSD_S4, offload);
    } else {
      // HFP <=1.6 eSCO
      params = esco_parameters_for_codec(ESCO_CODEC_CVSD_S3);
      params = esco_parameters_for_codec(ESCO_CODEC_CVSD_S3, offload);
    }

    BTM_EScoConnRsp(p_scb->sco_idx, HCI_SUCCESS, &params);
+6 −6
Original line number Diff line number Diff line
@@ -110,16 +110,16 @@ static void bta_hf_client_sco_conn_rsp(tBTA_HF_CLIENT_CB* client_cb,
  if (client_cb->sco_state == BTA_HF_CLIENT_SCO_LISTEN_ST) {
    if (p_data->link_type == BTM_LINK_TYPE_SCO) {
      // SCO
      resp = esco_parameters_for_codec(SCO_CODEC_CVSD_D1);
      resp = esco_parameters_for_codec(SCO_CODEC_CVSD_D1, true);
    } else if (client_cb->negotiated_codec == BTM_SCO_CODEC_MSBC) {
      // eSCO mSBC
      resp = esco_parameters_for_codec(ESCO_CODEC_MSBC_T2);
      resp = esco_parameters_for_codec(ESCO_CODEC_MSBC_T2, true);
    } else if (bta_hf_client_cb_arr.features & BTA_HF_CLIENT_FEAT_ESCO_S4) {
      // eSCO CVSD, HFP 1.7 requires S4
      resp = esco_parameters_for_codec(ESCO_CODEC_CVSD_S4);
      resp = esco_parameters_for_codec(ESCO_CODEC_CVSD_S4, true);
    } else {
      // eSCO CVSD, S3 is preferred by default(before HFP 1.7)
      resp = esco_parameters_for_codec(ESCO_CODEC_CVSD_S3);
      resp = esco_parameters_for_codec(ESCO_CODEC_CVSD_S3, true);
    }

    /* tell sys to stop av if any */
@@ -244,10 +244,10 @@ static void bta_hf_client_sco_create(tBTA_HF_CLIENT_CB* client_cb,
  if ((bta_hf_client_cb_arr.features & BTA_HF_CLIENT_FEAT_ESCO_S4) &&
      (client_cb->peer_features & BTA_HF_CLIENT_PEER_ESCO_S4)) {
    // eSCO CVSD, HFP 1.7 requires S4
    params = esco_parameters_for_codec(ESCO_CODEC_CVSD_S4);
    params = esco_parameters_for_codec(ESCO_CODEC_CVSD_S4, true);
  } else {
    // eSCO CVSD, S3 is preferred by default(before HFP 1.7)
    params = esco_parameters_for_codec(ESCO_CODEC_CVSD_S3);
    params = esco_parameters_for_codec(ESCO_CODEC_CVSD_S3, true);
  }

  /* if initiating set current scb and peer bd addr */
+2 −2
Original line number Diff line number Diff line
@@ -85,7 +85,7 @@ bt_status_t btsock_sco_init(thread_t* thread_) {
  if (!sco_sockets) return BT_STATUS_FAIL;

  thread = thread_;
  enh_esco_params_t params = esco_parameters_for_codec(SCO_CODEC_CVSD_D1);
  enh_esco_params_t params = esco_parameters_for_codec(SCO_CODEC_CVSD_D1, true);
  BTM_SetEScoMode(&params);

  return BT_STATUS_SUCCESS;
@@ -144,7 +144,7 @@ static sco_socket_t* sco_socket_establish_locked(bool is_listening,
    goto error;
  }

  params = esco_parameters_for_codec(SCO_CODEC_CVSD_D1);
  params = esco_parameters_for_codec(SCO_CODEC_CVSD_D1, true);
  status = BTM_CreateSco(bd_addr, !is_listening, params.packet_types,
                         &sco_socket->sco_handle, connect_completed_cb,
                         disconnect_completed_cb);
+1 −1
Original line number Diff line number Diff line
@@ -71,6 +71,6 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
      interopFeature,
      mFuzzedDataProvider.ConsumeRandomLengthString(kMaxStringLength).c_str());
  esco_codec_t escoCodec = mFuzzedDataProvider.PickValueInArray(kEscoCodec);
  esco_parameters_for_codec(escoCodec);
  esco_parameters_for_codec(escoCodec, true);
  return 0;
}
+1 −1
Original line number Diff line number Diff line
@@ -135,4 +135,4 @@ typedef struct {
} enh_esco_params_t;

// Get the enhanced eSCO configuration parameters for the provided |codec|
enh_esco_params_t esco_parameters_for_codec(esco_codec_t codec);
enh_esco_params_t esco_parameters_for_codec(esco_codec_t codec, bool offload);
Loading