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

Commit 8cd0e542 authored by Josh Wu's avatar Josh Wu Committed by Gerrit Code Review
Browse files

Merge changes I8c94b803,Ie96668df

* changes:
  SCO: codec parameters refactor
  HFP: Refactor HFP version flags
parents 6d39414a 07287fe8
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);
+0 −4
Original line number Diff line number Diff line
@@ -25,10 +25,6 @@
/*****************************************************************************
 *  Constants
 ****************************************************************************/
#define HFP_VERSION_1_1 0x0101
#define HFP_VERSION_1_5 0x0105
#define HFP_VERSION_1_6 0x0106
#define HFP_VERSION_1_7 0x0107

/* RFCOMM MTU SIZE */
#define BTA_HF_CLIENT_MTU 256
+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) {
+1 −4
Original line number Diff line number Diff line
@@ -124,10 +124,7 @@ bool bta_hf_client_add_record(const char* p_service_name, uint8_t scn,

  /* add profile descriptor list */
  profile_uuid = UUID_SERVCLASS_HF_HANDSFREE;
  version = HFP_VERSION_1_6;

  if (osi_property_get_bool("persist.bluetooth.hfpclient.sco_s4_supported", false))
    version = HFP_VERSION_1_7;
  version = BTA_HFP_VERSION;

  result &= SDP_AddProfileDescriptorList(sdp_handle, profile_uuid, version);

+5 −22
Original line number Diff line number Diff line
@@ -25,7 +25,9 @@
#ifndef BTA_AG_API_H
#define BTA_AG_API_H

#include <cstdint>
#include "bta_api.h"
#include "bta_hfp_api.h"

#include <string>
#include <vector>

@@ -39,25 +41,6 @@
/* Number of SCBs (AG service instances that can be registered) */
#define BTA_AG_MAX_NUM_CLIENTS 6

#define HFP_HSP_VERSION_UNKNOWN 0x0000
#define HFP_VERSION_1_1 0x0101
#define HFP_VERSION_1_5 0x0105
#define HFP_VERSION_1_6 0x0106
#define HFP_VERSION_1_7 0x0107

#define HSP_VERSION_1_0 0x0100
#define HSP_VERSION_1_2 0x0102

#define HFP_VERSION_CONFIG_KEY "HfpVersion"
#define HFP_SDP_FEATURES_CONFIG_KEY "HfpSdpFeatures"

/* Note, if you change the default version here, please also change the one in
 * bta_hs_api.h, they are meant to be the same.
 */
#ifndef BTA_HFP_VERSION
#define BTA_HFP_VERSION HFP_VERSION_1_7
#endif

/* AG feature masks */
#define BTA_AG_FEAT_3WAY 0x00000001   /* Three-way calling */
#define BTA_AG_FEAT_ECNR 0x00000002   /* Echo cancellation/noise reduction */
@@ -81,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 */
@@ -202,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 */

Loading