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

Commit 07287fe8 authored by Josh Wu's avatar Josh Wu
Browse files

SCO: codec parameters refactor

* Split CVSD parameters into D1,S3,S4
* Avoid modifying SCO codec parameters after getting from table
* Add comment to SCO codec related code
* Rename HFP ESCO S4 feature flag

Bug: 177049952
Test: atest BluetoothInstrumentationTests
Tag: #refactor
Change-Id: I8c94b80332b73ea768c0618beb87928a12638aa7
parent aaff2a10
Loading
Loading
Loading
Loading
+33 −29
Original line number Diff line number Diff line
@@ -392,29 +392,24 @@ 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;
  }

  esco_codec_t codec_index = ESCO_CODEC_CVSD;
  /* 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 == BTA_AG_CODEC_MSBC) {
    if (p_scb->codec_msbc_settings == BTA_AG_SCO_MSBC_SETTINGS_T2) {
      codec_index = ESCO_CODEC_MSBC_T2;
      params = esco_parameters_for_codec(ESCO_CODEC_MSBC_T2);
    } else {
      codec_index = ESCO_CODEC_MSBC_T1;
    }
      params = esco_parameters_for_codec(ESCO_CODEC_MSBC_T1);
    }

  /* Initialize eSCO parameters */
  enh_esco_params_t params = esco_parameters_for_codec(codec_index);
  /* For CVSD */
  if (esco_codec == BTM_SCO_CODEC_CVSD) {
    /* Use the applicable packet types
      (3-EV3 not allowed due to errata 2363) */
    params.packet_types =
        p_bta_ag_cfg->sco_pkt_types | ESCO_PKT_TYPES_MASK_NO_3_EV3;
    if ((!(p_scb->features & BTA_AG_FEAT_ESCO)) ||
        (!(p_scb->peer_features & BTA_AG_PEER_FEAT_ESCO))) {
      params.max_latency_ms = 10;
      params.retransmission_effort = ESCO_RETRANSMISSION_POWER;
  } 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);
    } else {
      // HFP <=1.6 eSCO
      params = esco_parameters_for_codec(ESCO_CODEC_CVSD_S3);
    }
  }

@@ -472,14 +467,17 @@ static void bta_ag_create_pending_sco(tBTA_AG_SCB* p_scb, bool is_local) {
    if (esco_codec == BTA_AG_CODEC_MSBC) {
      if (p_scb->codec_msbc_settings == BTA_AG_SCO_MSBC_SETTINGS_T2) {
        params = esco_parameters_for_codec(ESCO_CODEC_MSBC_T2);
      } else
      } else {
        params = esco_parameters_for_codec(ESCO_CODEC_MSBC_T1);
      }
    } 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);
      } else {
      params = esco_parameters_for_codec(ESCO_CODEC_CVSD);
      if ((!(p_scb->features & BTA_AG_FEAT_ESCO)) ||
          (!(p_scb->peer_features & BTA_AG_PEER_FEAT_ESCO))) {
        params.max_latency_ms = 10;
        params.retransmission_effort = ESCO_RETRANSMISSION_POWER;
        // HFP <=1.6 eSCO
        params = esco_parameters_for_codec(ESCO_CODEC_CVSD_S3);
      }
    }

@@ -501,12 +499,18 @@ static void bta_ag_create_pending_sco(tBTA_AG_SCB* p_scb, bool is_local) {
    }
    APPL_TRACE_DEBUG("%s: initiated SCO connection", __func__);
  } else {
    /* Local device accepted SCO connection from peer */
    params = esco_parameters_for_codec(ESCO_CODEC_CVSD);
    if ((!(p_scb->features & BTA_AG_FEAT_ESCO)) ||
        (!(p_scb->peer_features & BTA_AG_PEER_FEAT_ESCO))) {
      params.max_latency_ms = 10;
      params.retransmission_effort = ESCO_RETRANSMISSION_POWER;
    // Local device accepted SCO connection from peer(HF)
    // Because HF devices usually do not send AT+BAC and +BCS command,
    // and there is no plan to implement corresponding command handlers,
    // so we only accept CVSD connection from HF no matter what's
    // requested.
    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);
    } else {
      // HFP <=1.6 eSCO
      params = esco_parameters_for_codec(ESCO_CODEC_CVSD_S3);
    }

    BTM_EScoConnRsp(p_scb->sco_idx, HCI_SUCCESS, &params);
+24 −8
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@
#include "bt_trace.h"
#include "bt_utils.h"
#include "bta_ag_api.h"
#include "bta_hf_client_api.h"
#include "bta_hf_client_int.h"
#include "device/include/esco_parameters.h"
#include "osi/include/osi.h"
@@ -110,14 +111,17 @@ 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) {
      resp = esco_parameters_for_codec(ESCO_CODEC_CVSD);
    } else {
      if (client_cb->negotiated_codec == BTA_AG_CODEC_MSBC) {
      // SCO
      resp = esco_parameters_for_codec(SCO_CODEC_CVSD_D1);
    } else if (client_cb->negotiated_codec == BTA_AG_CODEC_MSBC) {
      // eSCO mSBC
      resp = esco_parameters_for_codec(ESCO_CODEC_MSBC_T2);
    } 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);
    } else {
        // default codec
        resp = esco_parameters_for_codec(ESCO_CODEC_CVSD);
      }
      // eSCO CVSD, S3 is preferred by default(before HFP 1.7)
      resp = esco_parameters_for_codec(ESCO_CODEC_CVSD_S3);
    }

    /* tell sys to stop av if any */
@@ -234,7 +238,19 @@ static void bta_hf_client_sco_create(tBTA_HF_CLIENT_CB* client_cb,
    return;
  }

  enh_esco_params_t params = esco_parameters_for_codec(ESCO_CODEC_CVSD);
  // codec parameters
  enh_esco_params_t params;
  // Since HF device is not expected to receive AT+BAC send +BCS command,
  // codec support of the connected AG device will be unknown,
  // so HF device will always establish only CVSD connection.
  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);
  } else {
    // eSCO CVSD, S3 is preferred by default(before HFP 1.7)
    params = esco_parameters_for_codec(ESCO_CODEC_CVSD_S3);
  }

  /* if initiating set current scb and peer bd addr */
  if (is_orig) {
+2 −2
Original line number Diff line number Diff line
@@ -64,7 +64,7 @@

/* HFP 1.7+ */
#define BTA_AG_FEAT_HF_IND 0x00000400 /* HF Indicators */
#define BTA_AG_FEAT_ESCO 0x00000800   /* eSCO S4 (and T2) setting supported */
#define BTA_AG_FEAT_ESCO_S4 0x00000800 /* eSCO S4 setting supported */

/* Proprietary features: using 31 ~ 16 bits */
#define BTA_AG_FEAT_BTRH 0x00010000    /* CCAP incoming call hold */
@@ -185,7 +185,7 @@ inline std::string bta_ag_result_text(const tBTA_AG_RES& result) {
#define BTA_AG_PEER_FEAT_ECC 0x0040    /* Enhanced Call Control */
#define BTA_AG_PEER_FEAT_CODEC 0x0080  /* Codec Negotiation */
#define BTA_AG_PEER_FEAT_HF_IND 0x0100 /* HF Indicators */
#define BTA_AG_PEER_FEAT_ESCO 0x0200   /* eSCO S4 (and T2) setting supported */
#define BTA_AG_PEER_FEAT_ESCO_S4 0x0200 /* eSCO S4 setting supported */

/* Proprietary features: using bits after 12 */

+2 −2
Original line number Diff line number Diff line
@@ -49,7 +49,7 @@
#define BTA_HF_CLIENT_PEER_ECC 0x00000080 /* Enhanced Call Control */
#define BTA_HF_CLIENT_PEER_EXTERR 0x00000100 /* Extended error codes */
#define BTA_HF_CLIENT_PEER_CODEC 0x00000200  /* Codec Negotiation */
#define BTA_HF_CLIENT_PEER_S4    0x00000800  /* ESCO S4 link setting */
#define BTA_HF_CLIENT_PEER_ESCO_S4 0x00000800 /* ESCO S4 link setting */

typedef uint16_t tBTA_HF_CLIENT_PEER_FEAT;

@@ -65,7 +65,7 @@ typedef uint16_t tBTA_HF_CLIENT_PEER_FEAT;
#define BTA_HF_CLIENT_FEAT_ECS 0x00000020   /* Enhanced Call Status */
#define BTA_HF_CLIENT_FEAT_ECC 0x00000040   /* Enhanced Call Control */
#define BTA_HF_CLIENT_FEAT_CODEC 0x00000080 /* Codec Negotiation */
#define BTA_HF_CLIENT_FEAT_S4  0x00000200   /* ESCO S4 link setting */
#define BTA_HF_CLIENT_FEAT_ESCO_S4 0x00000200 /* ESCO S4 link setting */

/* HFP HF extended call handling - masks not related to any spec */
#define BTA_HF_CLIENT_CHLD_REL \
+4 −4
Original line number Diff line number Diff line
@@ -79,7 +79,7 @@ namespace headset {
#define BTIF_HF_FEATURES                                          \
  (BTA_AG_FEAT_3WAY | BTA_AG_FEAT_ECNR | BTA_AG_FEAT_REJECT |     \
   BTA_AG_FEAT_ECS | BTA_AG_FEAT_EXTERR | BTA_AG_FEAT_VREC |      \
   BTA_AG_FEAT_CODEC | BTA_AG_FEAT_HF_IND | BTA_AG_FEAT_ESCO | \
   BTA_AG_FEAT_CODEC | BTA_AG_FEAT_HF_IND | BTA_AG_FEAT_ESCO_S4 | \
   BTA_AG_FEAT_UNAT)
#endif

Loading