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

Commit e009a108 authored by Jack He's avatar Jack He Committed by android-build-merger
Browse files

eSCO: Additional fix to get eSCO working for HFP and HSP (3/5) am: 4c76d370

am: e43d33ba

Change-Id: Id6089050ae0f8170c1461f61f24ea2ed2369d87e
parents 99790249 e43d33ba
Loading
Loading
Loading
Loading
+0 −22
Original line number Diff line number Diff line
@@ -86,25 +86,3 @@ void bta_ag_ci_slc_ready(uint16_t handle) {

  bta_sys_sendmsg(p_buf);
}

/******************************************************************************
 *
 * Function         bta_ag_ci_audio_open_continue
 *
 * Description      This function is called to notify AG that pre-SCO vendor
 *                  setup is finished and the AG can move on and
 *                  send the rest of HCI commands meant to be sent to
 *                  create/accept a SCO connection with the peer device.
 *
 * Returns          void
 *
 *****************************************************************************/
void bta_ag_ci_audio_open_continue(uint16_t handle, uint8_t status) {
  tBTA_AG_DATA* p_buf;
  if ((p_buf = (tBTA_AG_DATA*)osi_malloc(sizeof(tBTA_AG_DATA))) != NULL) {
    p_buf->api_result.hdr.event = BTA_AG_CI_AUDIO_OPEN_CONTINUE_EVT;
    p_buf->api_result.hdr.layer_specific = handle;
    p_buf->api_result.result = status;
    bta_sys_sendmsg(p_buf);
  }
}
+0 −5
Original line number Diff line number Diff line
@@ -95,7 +95,6 @@ enum {
  BTA_AG_SVC_TIMEOUT_EVT,
  BTA_AG_CI_SCO_DATA_EVT,
  BTA_AG_CI_SLC_READY_EVT,
  BTA_AG_CI_AUDIO_OPEN_CONTINUE_EVT,
  BTA_AG_MAX_EVT,

  /* these events are handled outside of the state machine */
@@ -282,8 +281,6 @@ typedef struct {
  uint16_t cur_idx;         /* SCO handle */
  uint8_t state;            /* SCO state variable */
  bool is_local;            /* SCO connection initiated locally or remotely */
  uint8_t set_audio_status; /* SCO variable for storing the status of the
                           pre-SCO vendor setup (set_audio_state)*/
} tBTA_AG_SCO_CB;

/* type for AG control block */
@@ -382,8 +379,6 @@ extern void bta_ag_rfc_acp_open(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);
extern void bta_ag_rfc_data(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);
extern void bta_ag_sco_listen(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);
extern void bta_ag_sco_open(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);
extern void bta_ag_ci_sco_open_continue(tBTA_AG_SCB* p_scb,
                                        tBTA_AG_DATA* p_data);
extern void bta_ag_sco_close(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);
extern void bta_ag_sco_codec_nego(tBTA_AG_SCB* p_scb, bool result);
extern void bta_ag_codec_negotiate(tBTA_AG_SCB* p_scb);
+23 −44
Original line number Diff line number Diff line
@@ -81,7 +81,6 @@ enum {
  BTA_AG_SEND_RING,
  BTA_AG_CI_SCO_DATA,
  BTA_AG_CI_RX_DATA,
  BTA_AG_CI_SCO_OPEN_CONTINUE,
  BTA_AG_RCVD_SLC_READY,
  BTA_AG_NUM_ACTIONS
};
@@ -93,23 +92,17 @@ typedef void (*tBTA_AG_ACTION)(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);

/* action functions */
const tBTA_AG_ACTION bta_ag_action[] = {
    bta_ag_register,       bta_ag_deregister,
    bta_ag_start_open,     bta_ag_rfc_do_open,
    bta_ag_rfc_do_close,   bta_ag_start_dereg,
    bta_ag_start_close,    bta_ag_rfc_open,
    bta_ag_open_fail,      bta_ag_rfc_acp_open,
    bta_ag_rfc_close,      bta_ag_rfc_fail,
    bta_ag_rfc_data,       bta_ag_disc_int_res,
    bta_ag_disc_fail,      bta_ag_disc_acp_res,
    bta_ag_free_db,        bta_ag_sco_conn_open,
    bta_ag_sco_conn_close, bta_ag_sco_listen,
    bta_ag_sco_open,       bta_ag_sco_close,
    bta_ag_sco_shutdown,   bta_ag_post_sco_open,
    bta_ag_post_sco_close, bta_ag_svc_conn_open,
    bta_ag_result,         bta_ag_setcodec,
    bta_ag_send_ring,      bta_ag_ci_sco_data,
    bta_ag_ci_rx_data,     bta_ag_ci_sco_open_continue,
    bta_ag_rcvd_slc_ready};
    bta_ag_register,       bta_ag_deregister,    bta_ag_start_open,
    bta_ag_rfc_do_open,    bta_ag_rfc_do_close,  bta_ag_start_dereg,
    bta_ag_start_close,    bta_ag_rfc_open,      bta_ag_open_fail,
    bta_ag_rfc_acp_open,   bta_ag_rfc_close,     bta_ag_rfc_fail,
    bta_ag_rfc_data,       bta_ag_disc_int_res,  bta_ag_disc_fail,
    bta_ag_disc_acp_res,   bta_ag_free_db,       bta_ag_sco_conn_open,
    bta_ag_sco_conn_close, bta_ag_sco_listen,    bta_ag_sco_open,
    bta_ag_sco_close,      bta_ag_sco_shutdown,  bta_ag_post_sco_open,
    bta_ag_post_sco_close, bta_ag_svc_conn_open, bta_ag_result,
    bta_ag_setcodec,       bta_ag_send_ring,     bta_ag_ci_sco_data,
    bta_ag_ci_rx_data,     bta_ag_rcvd_slc_ready};

/* state table information */
#define BTA_AG_ACTIONS 2    /* number of actions */
@@ -141,9 +134,7 @@ const uint8_t bta_ag_st_init[][BTA_AG_NUM_COLS] = {
    /* RING_TOUT_EVT */ {BTA_AG_IGNORE, BTA_AG_IGNORE, BTA_AG_INIT_ST},
    /* SVC_TOUT_EVT */ {BTA_AG_IGNORE, BTA_AG_IGNORE, BTA_AG_INIT_ST},
    /* CI_SCO_DATA_EVT */ {BTA_AG_IGNORE, BTA_AG_IGNORE, BTA_AG_INIT_ST},
    /* CI_SLC_READY_EVT */ {BTA_AG_IGNORE, BTA_AG_IGNORE, BTA_AG_INIT_ST},
    /* CI_AUDIO_OPEN_CONTINUE_EVT */
    {BTA_AG_IGNORE, BTA_AG_IGNORE, BTA_AG_INIT_ST}};
    /* CI_SLC_READY_EVT */ {BTA_AG_IGNORE, BTA_AG_IGNORE, BTA_AG_INIT_ST}};

/* state table for opening state */
const uint8_t bta_ag_st_opening[][BTA_AG_NUM_COLS] = {
@@ -173,9 +164,7 @@ const uint8_t bta_ag_st_opening[][BTA_AG_NUM_COLS] = {
    /* RING_TOUT_EVT */ {BTA_AG_IGNORE, BTA_AG_IGNORE, BTA_AG_OPENING_ST},
    /* SVC_TOUT_EVT */ {BTA_AG_IGNORE, BTA_AG_IGNORE, BTA_AG_OPENING_ST},
    /* CI_SCO_DATA_EVT */ {BTA_AG_IGNORE, BTA_AG_IGNORE, BTA_AG_OPENING_ST},
    /* CI_SLC_READY_EVT */ {BTA_AG_IGNORE, BTA_AG_IGNORE, BTA_AG_OPENING_ST},
    /* CI_AUDIO_OPEN_CONTINUE_EVT */
    {BTA_AG_IGNORE, BTA_AG_IGNORE, BTA_AG_OPENING_ST}};
    /* CI_SLC_READY_EVT */ {BTA_AG_IGNORE, BTA_AG_IGNORE, BTA_AG_OPENING_ST}};

/* state table for open state */
const uint8_t bta_ag_st_open[][BTA_AG_NUM_COLS] = {
@@ -206,9 +195,7 @@ const uint8_t bta_ag_st_open[][BTA_AG_NUM_COLS] = {
    /* SVC_TOUT_EVT */ {BTA_AG_START_CLOSE, BTA_AG_IGNORE, BTA_AG_CLOSING_ST},
    /* CI_SCO_DATA_EVT */ {BTA_AG_CI_SCO_DATA, BTA_AG_IGNORE, BTA_AG_OPEN_ST},
    /* CI_SLC_READY_EVT */
    {BTA_AG_RCVD_SLC_READY, BTA_AG_IGNORE, BTA_AG_OPEN_ST},
    /* CI_AUDIO_OPEN_CONTINUE_EVT */
    {BTA_AG_CI_SCO_OPEN_CONTINUE, BTA_AG_IGNORE, BTA_AG_OPEN_ST}};
    {BTA_AG_RCVD_SLC_READY, BTA_AG_IGNORE, BTA_AG_OPEN_ST}};

/* state table for closing state */
const uint8_t bta_ag_st_closing[][BTA_AG_NUM_COLS] = {
@@ -237,9 +224,7 @@ const uint8_t bta_ag_st_closing[][BTA_AG_NUM_COLS] = {
    /* RING_TOUT_EVT */ {BTA_AG_IGNORE, BTA_AG_IGNORE, BTA_AG_CLOSING_ST},
    /* SVC_TOUT_EVT */ {BTA_AG_IGNORE, BTA_AG_IGNORE, BTA_AG_CLOSING_ST},
    /* CI_SCO_DATA_EVT */ {BTA_AG_IGNORE, BTA_AG_IGNORE, BTA_AG_CLOSING_ST},
    /* CI_SLC_READY_EVT */ {BTA_AG_IGNORE, BTA_AG_IGNORE, BTA_AG_CLOSING_ST},
    /* CI_AUDIO_OPEN_CONTINUE_EVT */
    {BTA_AG_IGNORE, BTA_AG_IGNORE, BTA_AG_CLOSING_ST}};
    /* CI_SLC_READY_EVT */ {BTA_AG_IGNORE, BTA_AG_IGNORE, BTA_AG_CLOSING_ST}};

/* type for state table */
typedef const uint8_t (*tBTA_AG_ST_TBL)[BTA_AG_NUM_COLS];
@@ -292,7 +277,7 @@ static tBTA_AG_SCB* bta_ag_scb_alloc(void) {
  if (i == BTA_AG_NUM_SCB) {
    /* out of scbs */
    p_scb = NULL;
    APPL_TRACE_WARNING("Out of ag scbs");
    APPL_TRACE_WARNING("%s: Out of scbs", __func__);
  }
  return p_scb;
}
@@ -739,21 +724,21 @@ void bta_ag_sm_execute(tBTA_AG_SCB* p_scb, uint16_t event,
  if ((previous_event != BTA_AG_API_RESULT_EVT ||
       p_scb->state == BTA_AG_OPEN_ST) &&
      event != BTA_AG_CI_SCO_DATA_EVT) {
    APPL_TRACE_EVENT("AG evt (hdl 0x%04x): State %d (%s), Event 0x%04x (%s)",
                     bta_ag_scb_to_idx(p_scb), p_scb->state,
    APPL_TRACE_EVENT("%s: Handle 0x%04x, State %d (%s), Event 0x%04x (%s)",
                     __func__, bta_ag_scb_to_idx(p_scb), p_scb->state,
                     bta_ag_state_str(p_scb->state), event,
                     bta_ag_evt_str(event, p_data->api_result.result));
  }
#else
  if (event != BTA_AG_CI_SCO_DATA_EVT) {
    APPL_TRACE_EVENT("%s: AG evt (hdl 0x%04x): State %d, Event 0x%04x",
                     __func__, bta_ag_scb_to_idx(p_scb), p_scb->state, event);
    APPL_TRACE_EVENT("%s: Handle 0x%04x, State %d, Event 0x%04x", __func__,
                     bta_ag_scb_to_idx(p_scb), p_scb->state, event);
  }
#endif

  event &= 0x00FF;
  if (event >= (BTA_AG_MAX_EVT & 0x00FF)) {
    APPL_TRACE_ERROR("AG evt out of range, ignoring...");
    APPL_TRACE_ERROR("%s: event out of range, ignored", __func__);
    return;
  }

@@ -774,8 +759,8 @@ void bta_ag_sm_execute(tBTA_AG_SCB* p_scb, uint16_t event,
  }
#if (BTA_AG_DEBUG == TRUE)
  if (p_scb->state != previous_state) {
    APPL_TRACE_EVENT("BTA AG State Change: [%s] -> [%s] after Event [%s]",
                     bta_ag_state_str(previous_state),
    APPL_TRACE_EVENT("%s: State Change: [%s] -> [%s] after Event [%s]",
                     __func__, bta_ag_state_str(previous_state),
                     bta_ag_state_str(p_scb->state),
                     bta_ag_evt_str(previous_event, p_data->api_result.result));
  }
@@ -797,22 +782,18 @@ bool bta_ag_hdl_event(BT_HDR* p_msg) {

  APPL_TRACE_DEBUG("bta_ag_hdl_event: Event 0x%04x ", p_msg->event);
  switch (p_msg->event) {
    /* handle enable event */
    case BTA_AG_API_ENABLE_EVT:
      bta_ag_api_enable((tBTA_AG_DATA*)p_msg);
      break;

    /* handle disable event */
    case BTA_AG_API_DISABLE_EVT:
      bta_ag_api_disable((tBTA_AG_DATA*)p_msg);
      break;

    /* handle register event */
    case BTA_AG_API_REGISTER_EVT:
      bta_ag_api_register((tBTA_AG_DATA*)p_msg);
      break;

    /* handle result event */
    case BTA_AG_API_RESULT_EVT:
      bta_ag_api_result((tBTA_AG_DATA*)p_msg);
      break;
@@ -925,8 +906,6 @@ static char* bta_ag_evt_str(uint16_t event, tBTA_AG_RES result) {
      return "SCO data Callin";
    case BTA_AG_CI_SLC_READY_EVT:
      return "SLC Ready Callin";
    case BTA_AG_CI_AUDIO_OPEN_CONTINUE_EVT:
      return "Pre-SCO setup done. Continue Audio Open";
    default:
      return "Unknown AG Event";
  }
+79 −135
Original line number Diff line number Diff line
@@ -62,7 +62,6 @@ static char* bta_ag_sco_state_str(uint8_t state);
enum {
  BTA_AG_SCO_LISTEN_E,       /* listen request */
  BTA_AG_SCO_OPEN_E,         /* open request */
  BTA_AG_SCO_OPEN_PENDING_E, /* Pending operations in open request */
  BTA_AG_SCO_XFER_E,         /* transfer request */
  BTA_AG_SCO_CN_DONE_E, /* codec negotiation done */
  BTA_AG_SCO_REOPEN_E,  /* Retry with other codec when failed */
@@ -73,6 +72,8 @@ enum {
  BTA_AG_SCO_CI_DATA_E     /* SCO data ready */
};

static void bta_ag_create_pending_sco(tBTA_AG_SCB* p_scb, bool is_local);

/*******************************************************************************
 *
 * Function         bta_ag_sco_conn_cback
@@ -352,25 +353,24 @@ static void bta_ag_cback_sco(tBTA_AG_SCB* p_scb, uint8_t event) {
 *
 * Function         bta_ag_create_sco
 *
 * Description
 *
 * Description      Create a SCO connection for a given control block
 *                  p_scb : Pointer to the target AG control block
 *                  is_orig : Whether to initiate or listen for SCO connection
 *
 * Returns          void
 *
 ******************************************************************************/
static void bta_ag_create_sco(tBTA_AG_SCB* p_scb, bool is_orig) {
  uint8_t* p_bd_addr = NULL;
  enh_esco_params_t params;
  tBTA_AG_PEER_CODEC esco_codec = BTA_AG_CODEC_CVSD;

  /* Make sure this sco handle is not already in use */
  /* Make sure this SCO handle is not already in use */
  if (p_scb->sco_idx != BTM_INVALID_SCO_INDEX) {
    APPL_TRACE_WARNING("bta_ag_create_sco: Index 0x%04x Already In Use!",
    APPL_TRACE_ERROR("%s: Index 0x%04x already in use!", __func__,
                     p_scb->sco_idx);
    return;
  }

  APPL_TRACE_DEBUG("%s: Using enhanced sco %d)", __func__,
  APPL_TRACE_DEBUG("%s: Using enhanced SCO setup command %d", __func__,
                   controller_get_interface()
                       ->supports_enhanced_setup_synchronous_connection());

@@ -380,15 +380,13 @@ static void bta_ag_create_sco(tBTA_AG_SCB* p_scb, bool is_orig) {

  if (p_scb->codec_fallback) {
    p_scb->codec_fallback = false;

    /* Force AG to send +BCS for the next audio connection. */
    p_scb->codec_updated = true;
  }

  esco_codec_t codec_index = ESCO_CODEC_CVSD;
  /* 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 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;
@@ -397,14 +395,14 @@ static void bta_ag_create_sco(tBTA_AG_SCB* p_scb, bool is_orig) {
    }
  }

  params = esco_parameters_for_codec(codec_index);
  if (esco_codec == BTM_SCO_CODEC_CVSD) /* For CVSD */
  {
    /* Use the applicable packet types (3-EV3 is not allowed according to
     * errata 2363) */
  /* 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;
@@ -412,32 +410,30 @@ static void bta_ag_create_sco(tBTA_AG_SCB* p_scb, bool is_orig) {
    }
  }

  /* if initiating set current scb and peer bd addr */
  /* If initiating, setup parameters to start SCO/eSCO connection */
  if (is_orig) {
    bta_ag_cb.sco.is_local = true;
    /* Attempt to use eSCO if remote host supports HFP >= 1.5 */
    /* Need to find out from SIG if HSP can use eSCO; for now use SCO */
    /* HSP does not prohibit eSCO, but no official support, CVSD only */
    if (p_scb->conn_service == BTA_AG_HFP &&
        p_scb->peer_version >= HFP_VERSION_1_5 && !p_scb->retry_with_sco_only) {
      BTM_SetEScoMode(&params);
      /* If ESCO or EDR ESCO, retry with SCO only in case of failure */
      /* If eSCO or EDR eSCO, retry with SCO only in case of failure */
      if ((params.packet_types & BTM_ESCO_LINK_ONLY_MASK) ||
          !((params.packet_types &
             ~(BTM_ESCO_LINK_ONLY_MASK | BTM_SCO_LINK_ONLY_MASK)) ^
            BTA_AG_NO_EDR_ESCO)) {
        /* However, do not retry with SCO when using mSBC */
        if (esco_codec != BTA_AG_CODEC_MSBC) {
          p_scb->retry_with_sco_only = true;
          APPL_TRACE_API("Setting retry_with_sco_only to TRUE");
        } else /* Do not use SCO when using mSBC */
        {
          p_scb->retry_with_sco_only = false;
          APPL_TRACE_API("Setting retry_with_sco_only to FALSE");
        }
        APPL_TRACE_API("%s: eSCO supported, retry_with_sco_only=%d", __func__,
                       p_scb->retry_with_sco_only);
      }
    } else {
      if (p_scb->retry_with_sco_only) APPL_TRACE_API("retrying with SCO only");
      APPL_TRACE_API("%s: eSCO not supported, retry_with_sco_only=%d", __func__,
                     p_scb->retry_with_sco_only);
      p_scb->retry_with_sco_only = false;

      BTM_SetEScoMode(&params);
    }

@@ -449,25 +445,23 @@ static 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);

    /* Allow any platform specific pre-SCO set up to take place After the
       pre-SCO Vendor Specific commands are sent,bta_ag_ci_audio_open_continue
       call-in needs to be called by the app to continue with SCO connection
       creation */
    bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id,
                          SCO_STATE_SETUP, esco_codec);
    /* Send pending commands to create SCO connection to peer */
    bta_ag_create_pending_sco(p_scb, bta_ag_cb.sco.is_local);
  } else {
    /* Not initiating, go to listen mode */
    uint8_t* p_bd_addr = NULL;
    p_scb->retry_with_sco_only = false;
    p_bd_addr = p_scb->peer_addr;

    tBTM_STATUS status =
        BTM_CreateSco(p_bd_addr, is_orig, params.packet_types, &p_scb->sco_idx,
        BTM_CreateSco(p_bd_addr, false, params.packet_types, &p_scb->sco_idx,
                      bta_ag_sco_conn_cback, bta_ag_sco_disc_cback);
    if (status == BTM_CMD_STARTED)
      BTM_RegForEScoEvts(p_scb->sco_idx, bta_ag_esco_connreq_cback);

    APPL_TRACE_API(
        "ag create sco: orig %d, inx 0x%04x, status 0x%x, pkt types 0x%04x",
        is_orig, p_scb->sco_idx, status, params.packet_types);
    APPL_TRACE_API("%s: orig %d, inx 0x%04x, status 0x%x, pkt types 0x%04x",
                   __func__, is_orig, p_scb->sco_idx, status,
                   params.packet_types);
  }
}

@@ -491,7 +485,6 @@ static void bta_ag_create_pending_sco(tBTA_AG_SCB* p_scb, bool is_local) {

  /* Local device requested SCO connection to peer */
  if (is_local) {
    if (bta_ag_cb.sco.set_audio_status == BTA_AG_SUCCESS) {
    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);
@@ -506,7 +499,7 @@ static void bta_ag_create_pending_sco(tBTA_AG_SCB* p_scb, bool is_local) {
      }
    }

      /* Bypass vendor specific and voice settings if enhanced eSCO supported */
    /* Bypass voice settings if enhanced SCO setup command is supported */
    if (!(controller_get_interface()
              ->supports_enhanced_setup_synchronous_connection())) {
      if (esco_codec == BTA_AG_CODEC_MSBC)
@@ -523,31 +516,22 @@ static void bta_ag_create_pending_sco(tBTA_AG_SCB* p_scb, bool is_local) {
#endif

    tBTM_STATUS status = BTM_CreateSco(
          p_scb->peer_addr, TRUE, params.packet_types, &p_scb->sco_idx,
        p_scb->peer_addr, true, params.packet_types, &p_scb->sco_idx,
        bta_ag_sco_conn_cback, bta_ag_sco_disc_cback);
    if (status == BTM_CMD_STARTED) {
      /* Initiating the connection, set the current sco handle */
      bta_ag_cb.sco.cur_idx = p_scb->sco_idx;
    }
  } else {
      /* Pre-SCO Vendor setup failed Go back to Listening state */
      bta_ag_cb.sco.state = BTA_AG_SCO_LISTEN_ST;
      bta_ag_create_sco(p_scb, false);
    }
  } 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)))

    {
        (!(p_scb->peer_features & BTA_AG_PEER_FEAT_ESCO))) {
      params.max_latency_ms = 10;
      params.retransmission_effort = ESCO_RETRANSMISSION_POWER;
    }

    if (bta_ag_cb.sco.set_audio_status == BTA_AG_SUCCESS)
    BTM_EScoConnRsp(p_scb->sco_idx, HCI_SUCCESS, &params);
    else
      BTM_EScoConnRsp(p_scb->sco_idx, HCI_ERR_HOST_REJECT_RESOURCES, &params);
  }
}

@@ -636,7 +620,6 @@ void bta_ag_codec_negotiate(tBTA_AG_SCB* p_scb) {
 ******************************************************************************/
static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) {
  tBTA_AG_SCO_CB* p_sco = &bta_ag_cb.sco;
  tBTA_AG_SCB* p_cn_scb = NULL; /* For codec negotiation */
#if (BTM_SCO_HCI_INCLUDED == TRUE)
  BT_HDR* p_buf;
#endif
@@ -704,7 +687,7 @@ static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) {

          /* start codec negotiation */
          p_sco->state = BTA_AG_SCO_CODEC_ST;
          p_cn_scb = p_scb;
          bta_ag_codec_negotiate(p_scb);
          break;

        case BTA_AG_SCO_SHUTDOWN_E:
@@ -802,12 +785,7 @@ static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) {
        case BTA_AG_SCO_REOPEN_E:
          /* start codec negotiation */
          p_sco->state = BTA_AG_SCO_CODEC_ST;
          p_cn_scb = p_scb;
          break;

        case BTA_AG_SCO_OPEN_PENDING_E:
          /* Send pending commands to create SCO connection to peer */
          bta_ag_create_pending_sco(p_scb, p_sco->is_local);
          bta_ag_codec_negotiate(p_scb);
          break;

        case BTA_AG_SCO_XFER_E:
@@ -1033,7 +1011,7 @@ static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) {
        case BTA_AG_SCO_CONN_CLOSE_E:
          /* start codec negotiation */
          p_sco->state = BTA_AG_SCO_CODEC_ST;
          p_cn_scb = p_scb;
          bta_ag_codec_negotiate(p_scb);
          break;

        case BTA_AG_SCO_LISTEN_E:
@@ -1072,7 +1050,7 @@ static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) {
          p_sco->state = BTA_AG_SCO_SHUTTING_ST;
          break;

        case BTA_AG_SCO_CONN_CLOSE_E:
        case BTA_AG_SCO_CONN_CLOSE_E: {
          /* closed sco; place old sco in listen mode,
             take current sco out of listen, and
             create originating sco for current */
@@ -1081,9 +1059,11 @@ static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) {

          /* start codec negotiation */
          p_sco->state = BTA_AG_SCO_CODEC_ST;
          p_cn_scb = p_sco->p_xfer_scb;
          tBTA_AG_SCB* p_cn_scb = p_sco->p_xfer_scb;
          p_sco->p_xfer_scb = NULL;
          bta_ag_codec_negotiate(p_cn_scb);
          break;
        }

        default:
          APPL_TRACE_WARNING("%s: BTA_AG_SCO_CLOSE_XFER_ST: Ignoring event %d",
@@ -1160,10 +1140,6 @@ static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) {
                     bta_ag_sco_evt_str(event));
  }
#endif

  if (p_cn_scb) {
    bta_ag_codec_negotiate(p_cn_scb);
  }
}

/*******************************************************************************
@@ -1236,27 +1212,6 @@ void bta_ag_sco_open(tBTA_AG_SCB* p_scb, UNUSED_ATTR tBTA_AG_DATA* p_data) {
  bta_ag_sco_event(p_scb, event);
}

/*******************************************************************************
 *
 * Function         bta_ag_ci_sco_open_continue
 *
 * Description      This is called by the API_AUDIO_OPEN_CONTINUE_EVT from the
 *                  BTA AG state machine and is used to send the pending HCI
 *                  commands for SCO Connection after the pre-SCO setup is done
 *
 *
 * Returns          void
 *
 ******************************************************************************/

void bta_ag_ci_sco_open_continue(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data) {
  uint8_t p_status = p_data->api_result.result;
  bta_ag_cb.sco.set_audio_status = p_status;

  APPL_TRACE_DEBUG("%s: Handle %d", __func__, p_status);
  bta_ag_sco_event(p_scb, BTA_AG_SCO_OPEN_PENDING_E);
}

/*******************************************************************************
 *
 * Function         bta_ag_sco_close
@@ -1283,7 +1238,7 @@ void bta_ag_sco_close(tBTA_AG_SCB* p_scb, UNUSED_ATTR tBTA_AG_DATA* p_data) {
 *
 * Function         bta_ag_sco_codec_nego
 *
 * Description
 * Description      Handles result of eSCO codec negotiation
 *
 *
 * Returns          void
@@ -1329,9 +1284,6 @@ void bta_ag_sco_conn_open(tBTA_AG_SCB* p_scb,

  bta_sys_sco_open(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr);

  bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, SCO_STATE_ON,
                        p_scb->inuse_codec);

#if (BTM_SCO_HCI_INCLUDED == TRUE)
  /* open SCO codec if SCO is routed through transport */
  bta_dm_sco_co_open(bta_ag_scb_to_idx(p_scb), BTA_SCO_OUT_PKT_SIZE,
@@ -1358,8 +1310,6 @@ void bta_ag_sco_conn_open(tBTA_AG_SCB* p_scb,
 ******************************************************************************/
void bta_ag_sco_conn_close(tBTA_AG_SCB* p_scb,
                           UNUSED_ATTR tBTA_AG_DATA* p_data) {
  uint16_t handle = bta_ag_scb_to_idx(p_scb);

  /* clear current scb */
  bta_ag_cb.sco.p_curr_scb = NULL;
  p_scb->sco_idx = BTM_INVALID_SCO_INDEX;
@@ -1376,10 +1326,7 @@ void bta_ag_sco_conn_close(tBTA_AG_SCB* p_scb,
    bta_ag_create_sco(p_scb, true);
  }
  else {
    sco_state_t sco_state =
        bta_ag_cb.sco.p_xfer_scb ? SCO_STATE_OFF_TRANSFER : SCO_STATE_OFF;
    /* Indicate if the closing of audio is because of transfer */
    bta_ag_co_audio_state(handle, p_scb->app_id, sco_state, p_scb->inuse_codec);
    bta_ag_sco_event(p_scb, BTA_AG_SCO_CONN_CLOSE_E);

    bta_sys_sco_close(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr);
@@ -1413,9 +1360,10 @@ void bta_ag_sco_conn_rsp(tBTA_AG_SCB* p_scb,
                         tBTM_ESCO_CONN_REQ_EVT_DATA* p_data) {
  bta_ag_cb.sco.is_local = false;

  APPL_TRACE_DEBUG("%s: using enhanced sco %d)", __func__,
  APPL_TRACE_DEBUG("%s: eSCO %d, state %d", __func__,
                   controller_get_interface()
                       ->supports_enhanced_setup_synchronous_connection());
                       ->supports_enhanced_setup_synchronous_connection(),
                   bta_ag_cb.sco.state);

  if (bta_ag_cb.sco.state == BTA_AG_SCO_LISTEN_ST ||
      bta_ag_cb.sco.state == BTA_AG_SCO_CLOSE_XFER_ST ||
@@ -1423,10 +1371,6 @@ void bta_ag_sco_conn_rsp(tBTA_AG_SCB* p_scb,
    /* tell sys to stop av if any */
    bta_sys_sco_use(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr);
    /* When HS initiated SCO, it cannot be WBS. */
    /* Allow any platform specific pre-SCO set up to take place */
    bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id,
                          SCO_STATE_SETUP, BTA_AG_CODEC_CVSD);

#if (BTM_SCO_HCI_INCLUDED == TRUE)
    /* Configure the transport being used */
    BTM_ConfigScoPath(resp.input_data_path, bta_ag_sco_read_cback, NULL, TRUE);
@@ -1435,6 +1379,8 @@ 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 = BTA_AG_CODEC_NONE;
  /* Send pending commands to create SCO connection to peer */
  bta_ag_create_pending_sco(p_scb, bta_ag_cb.sco.is_local);
}

/*******************************************************************************
@@ -1465,8 +1411,6 @@ static char* bta_ag_sco_evt_str(uint8_t event) {
      return "Listen Request";
    case BTA_AG_SCO_OPEN_E:
      return "Open Request";
    case BTA_AG_SCO_OPEN_PENDING_E:
      return "Open pending request";
    case BTA_AG_SCO_XFER_E:
      return "Transfer Request";
    case BTA_AG_SCO_CN_DONE_E:
+0 −1
Original line number Diff line number Diff line
@@ -165,7 +165,6 @@ typedef uint16_t tBTA_AG_PEER_FEAT;

/* HFP peer supported codec masks */
// TODO(google) This should use common definitions
// in hci/include/hci_audio.h
#define BTA_AG_CODEC_NONE BTM_SCO_CODEC_NONE
#define BTA_AG_CODEC_CVSD BTM_SCO_CODEC_CVSD /* CVSD */
#define BTA_AG_CODEC_MSBC BTM_SCO_CODEC_MSBC /* mSBC */
Loading