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

Commit f587bbb5 authored by Yuyang Huang's avatar Yuyang Huang Committed by Gerrit Code Review
Browse files

Merge "merge bta_ag_create_pending_sco into bta_ag_create_sco and bta_ag_sco_conn_rsp" into main

parents 75f52229 9887d086
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -422,7 +422,6 @@ bool bta_ag_sco_is_opening(tBTA_AG_SCB* p_scb);
void bta_ag_sco_conn_rsp(tBTA_AG_SCB* p_scb, tBTM_ESCO_CONN_REQ_EVT_DATA* data);
// Testonly
void bta_ag_create_sco(tBTA_AG_SCB* p_scb, bool is_orig);
void bta_ag_create_pending_sco(tBTA_AG_SCB* p_scb, bool is_local);

/* AT command functions */
void bta_ag_at_hsp_cback(tBTA_AG_SCB* p_scb, uint16_t cmd, uint8_t arg_type,
+58 −120
Original line number Diff line number Diff line
@@ -507,12 +507,6 @@ void bta_ag_create_sco(tBTA_AG_SCB* p_scb, bool is_orig) {
    } else {
      params = esco_parameters_for_codec(ESCO_CODEC_LC3_T1, offload);
    }
  } else if (esco_codec == UUID_CODEC_MSBC) {
    if (p_scb->codec_msbc_settings == BTA_AG_SCO_MSBC_SETTINGS_T2) {
      params = esco_parameters_for_codec(ESCO_CODEC_MSBC_T2, offload);
    } else {
      params = esco_parameters_for_codec(ESCO_CODEC_MSBC_T1, offload);
    }
  } else if (is_hfp_aptx_voice_enabled() &&
             (p_scb->is_aptx_swb_codec == true && !p_scb->codec_updated)) {
    if (p_scb->codec_aptx_settings == BTA_AG_SCO_APTX_SWB_SETTINGS_Q3) {
@@ -524,6 +518,12 @@ void bta_ag_create_sco(tBTA_AG_SCB* p_scb, bool is_orig) {
    } else if (p_scb->codec_aptx_settings == BTA_AG_SCO_APTX_SWB_SETTINGS_Q0) {
      params = esco_parameters_for_codec(ESCO_CODEC_SWB_Q0, true);
    }
  } else if (esco_codec == UUID_CODEC_MSBC) {
    if (p_scb->codec_msbc_settings == BTA_AG_SCO_MSBC_SETTINGS_T2) {
      params = esco_parameters_for_codec(ESCO_CODEC_MSBC_T2, offload);
    } else {
      params = esco_parameters_for_codec(ESCO_CODEC_MSBC_T1, offload);
    }
  } else {
    if (com::android::bluetooth::flags::fix_hfp_qual_1_9() &&
        p_scb->codec_cvsd_settings == BTA_AG_SCO_CVSD_SETTINGS_S1) {
@@ -569,8 +569,28 @@ void bta_ag_create_sco(tBTA_AG_SCB* p_scb, bool is_orig) {
    /* tell sys to stop av if any */
    bta_sys_sco_use(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr);

    /* Send pending commands to create SCO connection to peer */
    bta_ag_create_pending_sco(p_scb, bta_ag_cb.sco.is_local);
    bta_ag_cb.sco.cur_idx = p_scb->sco_idx;

    /* Bypass voice settings if enhanced SCO setup command is supported */
    if (!(bluetooth::shim::GetController()->IsSupported(
            bluetooth::hci::OpCode::ENHANCED_SETUP_SYNCHRONOUS_CONNECTION))) {
      if (esco_codec == UUID_CODEC_MSBC || esco_codec == UUID_CODEC_LC3) {
        BTM_WriteVoiceSettings(BTM_VOICE_SETTING_TRANS);
      } else {
        BTM_WriteVoiceSettings(BTM_VOICE_SETTING_CVSD);
      }
    }

    if (BTM_CreateSco(&p_scb->peer_addr, true, params.packet_types,
                      &p_scb->sco_idx, bta_ag_sco_conn_cback,
                      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);
      log::verbose("initiated SCO connection");
    }

    log::debug("Initiating AG SCO inx 0x{:04x}, pkt types 0x{:04x}",
               p_scb->sco_idx, params.packet_types);
  } else {
@@ -614,117 +634,6 @@ void updateCodecParametersFromProviderInfo(tBTA_AG_PEER_CODEC esco_codec,
  }
}

/*******************************************************************************
 *
 * Function         bta_ag_create_pending_sco
 *
 * Description      This Function is called after the pre-SCO vendor setup is
 *                  done for the BTA to continue and send the HCI Commands for
 *                  creating/accepting SCO connection with peer based on the
 *                  is_local parameter.
 *
 * Returns          void
 *
 ******************************************************************************/
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;

  /* Local device requested SCO connection to peer */
  if (is_local) {
    if (esco_codec == UUID_CODEC_LC3) {
      if (p_scb->codec_lc3_settings == BTA_AG_SCO_LC3_SETTINGS_T2) {
        params = esco_parameters_for_codec(ESCO_CODEC_LC3_T2, offload);
      } else {
        params = esco_parameters_for_codec(ESCO_CODEC_LC3_T1, offload);
      }
    } else if (is_hfp_aptx_voice_enabled() &&
               (p_scb->is_aptx_swb_codec == true && !p_scb->codec_updated)) {
      if (p_scb->codec_aptx_settings == BTA_AG_SCO_APTX_SWB_SETTINGS_Q3) {
        params = esco_parameters_for_codec(ESCO_CODEC_SWB_Q3, true);
      } else if (p_scb->codec_aptx_settings ==
                 BTA_AG_SCO_APTX_SWB_SETTINGS_Q2) {
        params = esco_parameters_for_codec(ESCO_CODEC_SWB_Q2, true);
      } else if (p_scb->codec_aptx_settings ==
                 BTA_AG_SCO_APTX_SWB_SETTINGS_Q1) {
        params = esco_parameters_for_codec(ESCO_CODEC_SWB_Q1, true);
      } else if (p_scb->codec_aptx_settings ==
                 BTA_AG_SCO_APTX_SWB_SETTINGS_Q0) {
        params = esco_parameters_for_codec(ESCO_CODEC_SWB_Q0, true);
      }
    } else if (esco_codec == UUID_CODEC_MSBC) {
      if (p_scb->codec_msbc_settings == BTA_AG_SCO_MSBC_SETTINGS_T2) {
        params = esco_parameters_for_codec(ESCO_CODEC_MSBC_T2, offload);
      } else {
        params = esco_parameters_for_codec(ESCO_CODEC_MSBC_T1, offload);
      }
    } else {
      if (com::android::bluetooth::flags::fix_hfp_qual_1_9() &&
          p_scb->codec_cvsd_settings == BTA_AG_SCO_CVSD_SETTINGS_S1) {
        params = esco_parameters_for_codec(ESCO_CODEC_CVSD_S1, offload);
      } else {
        if ((p_scb->features & BTA_AG_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, offload);
        } else {
          // HFP <=1.6 eSCO
          params = esco_parameters_for_codec(ESCO_CODEC_CVSD_S3, offload);
        }
      }
    }

    /* Bypass voice settings if enhanced SCO setup command is supported */
    if (!(bluetooth::shim::GetController()->IsSupported(
            bluetooth::hci::OpCode::ENHANCED_SETUP_SYNCHRONOUS_CONNECTION))) {
      if (esco_codec == UUID_CODEC_MSBC || esco_codec == UUID_CODEC_LC3) {
        BTM_WriteVoiceSettings(BTM_VOICE_SETTING_TRANS);
      } else {
        BTM_WriteVoiceSettings(BTM_VOICE_SETTING_CVSD);
      }
    }

    if (BTM_CreateSco(&p_scb->peer_addr, true, params.packet_types,
                      &p_scb->sco_idx, bta_ag_sco_conn_cback,
                      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);
    }
    log::verbose("initiated SCO connection");
  } else {
    // 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_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, offload);
    } else {
      // HFP <=1.6 eSCO
      params = esco_parameters_for_codec(ESCO_CODEC_CVSD_S3, offload);
    }

    // HFP v1.8 5.7.3 CVSD coding
    tSCO_CONN* p_sco = NULL;
    if (p_scb->sco_idx < BTM_MAX_SCO_LINKS)
      p_sco = &btm_cb.sco_cb.sco_db[p_scb->sco_idx];
    if (p_sco && (p_sco->esco.data.link_type == BTM_LINK_TYPE_SCO ||
                  !btm_peer_supports_esco_ev3(p_sco->esco.data.bd_addr))) {
      params = esco_parameters_for_codec(SCO_CODEC_CVSD_D1, offload);
    }

    BTM_EScoConnRsp(p_scb->sco_idx, HCI_SUCCESS, &params);
    log::verbose("listening for SCO connection");
  }
}

/*******************************************************************************
 *
 * Function         bta_ag_codec_negotiation_timer_cback
@@ -1631,7 +1540,36 @@ void bta_ag_sco_conn_rsp(tBTA_AG_SCB* p_scb,
  /* If SCO open was initiated from HS, it must be CVSD */
  p_scb->inuse_codec = BTM_SCO_CODEC_NONE;
  /* Send pending commands to create SCO connection to peer */
  bta_ag_create_pending_sco(p_scb, bta_ag_cb.sco.is_local);
  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;

  // 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_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, offload);
  } else {
    // HFP <=1.6 eSCO
    params = esco_parameters_for_codec(ESCO_CODEC_CVSD_S3, offload);
  }

  // HFP v1.8 5.7.3 CVSD coding
  tSCO_CONN* p_sco = NULL;
  if (p_scb->sco_idx < BTM_MAX_SCO_LINKS)
    p_sco = &btm_cb.sco_cb.sco_db[p_scb->sco_idx];
  if (p_sco && (p_sco->esco.data.link_type == BTM_LINK_TYPE_SCO ||
                !btm_peer_supports_esco_ev3(p_sco->esco.data.bd_addr))) {
    params = esco_parameters_for_codec(SCO_CODEC_CVSD_D1, offload);
  }

  BTM_EScoConnRsp(p_scb->sco_idx, HCI_SUCCESS, &params);
  log::verbose("listening for SCO connection");
}

bool bta_ag_get_sco_offload_enabled() {
+7 −1
Original line number Diff line number Diff line
@@ -89,7 +89,13 @@ TEST_P(BtaAgScoParameterSelectionTest, create_pending_sco_cvsd) {
  };

  this->codec = ESCO_CODEC_UNKNOWN;
  bta_ag_create_pending_sco(&scb, is_local);
  if (is_local) {
    bta_ag_create_sco(&scb, true);
  } else {
    // empty data, not used in the function
    tBTM_ESCO_CONN_REQ_EVT_DATA data;
    bta_ag_sco_conn_rsp(&scb, &data);
  }
  if ((scb.features & BTA_AG_FEAT_ESCO_S4) &&
      (scb.peer_features & BTA_AG_PEER_FEAT_ESCO_S4)) {
    ASSERT_EQ(this->codec, ESCO_CODEC_CVSD_S4);
+2 −2
Original line number Diff line number Diff line
@@ -310,7 +310,7 @@ TEST_F_WITH_FLAGS(BtaAgCmdTest, at_hfp_cback__qcs_ev_codec_q0_enabled,
                      BTA_AG_SCO_APTX_SWB_SETTINGS_Q0);

  ASSERT_EQ(1, get_func_call_count("alarm_cancel"));
  ASSERT_EQ(2, get_func_call_count("esco_parameters_for_codec"));
  ASSERT_EQ(1, get_func_call_count("esco_parameters_for_codec"));
  ASSERT_EQ(BT_STATUS_SUCCESS, enable_aptx_swb_codec(true, &addr));
  ASSERT_EQ(1, get_func_call_count("BTM_SetEScoMode"));
  ASSERT_EQ(1, get_func_call_count("BTM_CreateSco"));
@@ -341,7 +341,7 @@ TEST_F_WITH_FLAGS(BtaAgCmdTest,
                      BTA_AG_SCO_APTX_SWB_SETTINGS_Q1);

  ASSERT_EQ(1, get_func_call_count("alarm_cancel"));
  ASSERT_EQ(2, get_func_call_count("esco_parameters_for_codec"));
  ASSERT_EQ(1, get_func_call_count("esco_parameters_for_codec"));
  ASSERT_EQ(BT_STATUS_SUCCESS, enable_aptx_swb_codec(true, &addr));
  ASSERT_EQ(1, get_func_call_count("BTM_SetEScoMode"));
  ASSERT_EQ(1, get_func_call_count("BTM_CreateSco"));