Loading system/bta/ag/bta_ag_ci.cc +0 −22 Original line number Diff line number Diff line Loading @@ -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); } } system/bta/ag/bta_ag_int.h +0 −5 Original line number Diff line number Diff line Loading @@ -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 */ Loading Loading @@ -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 */ Loading Loading @@ -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); Loading system/bta/ag/bta_ag_main.cc +23 −44 Original line number Diff line number Diff line Loading @@ -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 }; Loading @@ -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 */ Loading Loading @@ -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] = { Loading Loading @@ -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] = { Loading Loading @@ -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] = { Loading Loading @@ -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]; Loading Loading @@ -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; } Loading Loading @@ -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; } Loading @@ -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)); } Loading @@ -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; Loading Loading @@ -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"; } Loading system/bta/ag/bta_ag_sco.cc +79 −135 Original line number Diff line number Diff line Loading @@ -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 */ Loading @@ -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 Loading Loading @@ -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()); Loading @@ -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; Loading @@ -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; Loading @@ -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(¶ms); /* 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(¶ms); } Loading @@ -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); } } Loading @@ -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); Loading @@ -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) Loading @@ -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, ¶ms); else BTM_EScoConnRsp(p_scb->sco_idx, HCI_ERR_HOST_REJECT_RESOURCES, ¶ms); } } Loading Loading @@ -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 Loading Loading @@ -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: Loading Loading @@ -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: Loading Loading @@ -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: Loading Loading @@ -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 */ Loading @@ -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", Loading Loading @@ -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); } } /******************************************************************************* Loading Loading @@ -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 Loading @@ -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 Loading Loading @@ -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, Loading @@ -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; Loading @@ -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); Loading Loading @@ -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 || Loading @@ -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); Loading @@ -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); } /******************************************************************************* Loading Loading @@ -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: Loading system/bta/include/bta_ag_api.h +0 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
system/bta/ag/bta_ag_ci.cc +0 −22 Original line number Diff line number Diff line Loading @@ -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); } }
system/bta/ag/bta_ag_int.h +0 −5 Original line number Diff line number Diff line Loading @@ -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 */ Loading Loading @@ -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 */ Loading Loading @@ -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); Loading
system/bta/ag/bta_ag_main.cc +23 −44 Original line number Diff line number Diff line Loading @@ -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 }; Loading @@ -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 */ Loading Loading @@ -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] = { Loading Loading @@ -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] = { Loading Loading @@ -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] = { Loading Loading @@ -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]; Loading Loading @@ -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; } Loading Loading @@ -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; } Loading @@ -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)); } Loading @@ -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; Loading Loading @@ -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"; } Loading
system/bta/ag/bta_ag_sco.cc +79 −135 Original line number Diff line number Diff line Loading @@ -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 */ Loading @@ -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 Loading Loading @@ -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()); Loading @@ -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; Loading @@ -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; Loading @@ -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(¶ms); /* 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(¶ms); } Loading @@ -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); } } Loading @@ -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); Loading @@ -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) Loading @@ -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, ¶ms); else BTM_EScoConnRsp(p_scb->sco_idx, HCI_ERR_HOST_REJECT_RESOURCES, ¶ms); } } Loading Loading @@ -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 Loading Loading @@ -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: Loading Loading @@ -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: Loading Loading @@ -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: Loading Loading @@ -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 */ Loading @@ -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", Loading Loading @@ -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); } } /******************************************************************************* Loading Loading @@ -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 Loading @@ -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 Loading Loading @@ -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, Loading @@ -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; Loading @@ -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); Loading Loading @@ -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 || Loading @@ -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); Loading @@ -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); } /******************************************************************************* Loading Loading @@ -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: Loading
system/bta/include/bta_ag_api.h +0 −1 Original line number Diff line number Diff line Loading @@ -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