From: Jack He Date: Mon, 8 May 2017 00:26:02 +0000 (-0700) Subject: eSCO: Additional fix to get eSCO working for HFP and HSP (3/5) X-Git-Tag: android-x86-9.0-r1~266^2^2~64^2~94^2 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=400ac497f4;p=android-x86%2Fsystem-bt.git eSCO: Additional fix to get eSCO working for HFP and HSP (3/5) * Removed vendor specific call after codec negotiation and before eSCO command is sent to Bluetooth chip * Removed vendor specific call after a SCO connection is requested by the peer * Removed vendor specific save audio state methods Bug: 19540029 Test: make, HFP PTS test, testplans/86884, testplans/87103 Change-Id: I899405a8eaa2f38ee0de04949c5288f9eefa74df --- diff --git a/bta/ag/bta_ag_ci.cc b/bta/ag/bta_ag_ci.cc index 1f577cc32..1fde9d84a 100644 --- a/bta/ag/bta_ag_ci.cc +++ b/bta/ag/bta_ag_ci.cc @@ -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); - } -} diff --git a/bta/ag/bta_ag_int.h b/bta/ag/bta_ag_int.h index 5996ede7e..eeee1b7d2 100644 --- a/bta/ag/bta_ag_int.h +++ b/bta/ag/bta_ag_int.h @@ -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); diff --git a/bta/ag/bta_ag_main.cc b/bta/ag/bta_ag_main.cc index c1aae15bc..30b59a714 100644 --- a/bta/ag/bta_ag_main.cc +++ b/bta/ag/bta_ag_main.cc @@ -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"; } diff --git a/bta/ag/bta_ag_sco.cc b/bta/ag/bta_ag_sco.cc index 4f5f9aab7..1c11a6b67 100644 --- a/bta/ag/bta_ag_sco.cc +++ b/bta/ag/bta_ag_sco.cc @@ -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!", - p_scb->sco_idx); + 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(¶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); } @@ -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,63 +485,53 @@ 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); - } else - params = esco_parameters_for_codec(ESCO_CODEC_MSBC_T1); - } 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; - } + 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 + params = esco_parameters_for_codec(ESCO_CODEC_MSBC_T1); + } 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; } + } - /* Bypass vendor specific and voice settings if enhanced eSCO supported */ - if (!(controller_get_interface() - ->supports_enhanced_setup_synchronous_connection())) { - if (esco_codec == BTA_AG_CODEC_MSBC) - BTM_WriteVoiceSettings(BTM_VOICE_SETTING_TRANS); - else - BTM_WriteVoiceSettings(BTM_VOICE_SETTING_CVSD); - } + /* 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) + BTM_WriteVoiceSettings(BTM_VOICE_SETTING_TRANS); + else + BTM_WriteVoiceSettings(BTM_VOICE_SETTING_CVSD); + } #if (BTM_SCO_HCI_INCLUDED == TRUE) - /* initialize SCO setup, no voice setting for AG, data rate <==> sample - * rate */ - BTM_ConfigScoPath(params.input_data_path, bta_ag_sco_read_cback, NULL, - TRUE); + /* initialize SCO setup, no voice setting for AG, data rate <==> sample + * rate */ + BTM_ConfigScoPath(params.input_data_path, bta_ag_sco_read_cback, NULL, + TRUE); #endif - tBTM_STATUS status = BTM_CreateSco( - 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); + tBTM_STATUS status = BTM_CreateSco( + 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 { + /* 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); + BTM_EScoConnRsp(p_scb->sco_idx, HCI_SUCCESS, ¶ms); } } @@ -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); - } } /******************************************************************************* @@ -1238,27 +1214,6 @@ void bta_ag_sco_open(tBTA_AG_SCB* p_scb, UNUSED_ATTR tBTA_AG_DATA* p_data) { /******************************************************************************* * - * 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 * * Description @@ -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: diff --git a/bta/include/bta_ag_api.h b/bta/include/bta_ag_api.h index c0ace8d5c..88f9d60d2 100644 --- a/bta/include/bta_ag_api.h +++ b/bta/include/bta_ag_api.h @@ -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 */ diff --git a/bta/include/bta_ag_ci.h b/bta/include/bta_ag_ci.h index 2597e8205..01e387030 100644 --- a/bta/include/bta_ag_ci.h +++ b/bta/include/bta_ag_ci.h @@ -67,18 +67,4 @@ extern void bta_ag_ci_slc_ready(uint16_t handle); *****************************************************************************/ extern void bta_ag_ci_wbs_command(uint16_t handle, char* p_data, uint16_t len); -/****************************************************************************** - * - * 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 - * - *****************************************************************************/ -extern void bta_ag_ci_audio_open_continue(uint16_t handle, uint8_t status); - #endif /* BTA_AG_CI_H */ diff --git a/bta/include/bta_ag_co.h b/bta/include/bta_ag_co.h index e1d13a441..aed7def66 100644 --- a/bta/include/bta_ag_co.h +++ b/bta/include/bta_ag_co.h @@ -25,7 +25,6 @@ #define BTA_AG_CO_H #include "bta_ag_api.h" -#include "hci/include/hci_audio.h" /******************************************************************************* * @@ -44,41 +43,6 @@ extern void bta_ag_co_init(void); /******************************************************************************* * - * Function bta_ag_co_audio_state - * - * Description This function is called by the AG before the audio - * connection - * is brought up, after it comes up, and after it goes down. - * - * Parameters handle - handle of the AG instance - * state - Audio state - * codec - if WBS support is compiled in, codec to going to be - * used is provided and when in SCO_STATE_SETUP, - * BTM_I2SPCMConfig() must be called with the correct - * platform parameters. In the other states, codec type - * should not be ignored - * - * Returns void - * - ******************************************************************************/ -extern void bta_ag_co_audio_state(uint16_t handle, uint8_t app_id, - uint8_t state, tBTA_AG_PEER_CODEC codec); - - -/******************************************************************************* - * - * Function bta_ag_co_set_audio_state_complete - * - * Description This function is called from Vendor module to update AG that - * the pre-SCO setup is done - * - * Returns void - * - ******************************************************************************/ -extern void bta_ag_co_set_audio_state_complete(uint8_t status); - -/******************************************************************************* - * * Function bta_ag_co_data_open * * Description This function is executed by AG when a service level diff --git a/btif/co/bta_ag_co.cc b/btif/co/bta_ag_co.cc index 42c1b9318..b27e57ef1 100644 --- a/btif/co/bta_ag_co.cc +++ b/btif/co/bta_ag_co.cc @@ -22,18 +22,8 @@ #include "bta/ag/bta_ag_int.h" #include "bta/include/bta_ag_api.h" #include "bta/include/bta_ag_ci.h" -#include "hci/include/hci_audio.h" #include "osi/include/osi.h" -typedef struct { - uint16_t handle; - sco_state_t sco_state; - bool in_use; -} tBTA_AG_CO_CB; - -/* Control block instance */ -static tBTA_AG_CO_CB bta_ag_co_cb[BTA_AG_NUM_SCB]; - /******************************************************************************* * * Function bta_ag_co_init @@ -51,97 +41,6 @@ void bta_ag_co_init(void) { BTM_WriteVoiceSettings(AG_VOICE_SETTINGS); } /******************************************************************************* * - * Function bta_ag_co_audio_state - * - * Description This function is called by the AG before the audio - * connection is brought up, after it comes up, and - * after it goes down. - * - * Parameters handle - handle of the AG instance - * state - Audio state - * codec - if WBS support is compiled in, codec to going to be - * used is provided and when in SCO_STATE_SETUP, - * BTM_I2SPCMConfig() must be called with the correct - * platform parameters. - * In the other states, codec type should not be ignored. - * - * Returns void - * - ******************************************************************************/ -void bta_ag_co_audio_state(uint16_t handle, uint8_t app_id, uint8_t state, - tBTA_AG_PEER_CODEC codec) -{ - BTIF_TRACE_DEBUG("bta_ag_co_audio_state: handle %d, state %d", handle, state); - - bool bFound = false; - uint8_t pos; - for (int i = 0; i < BTA_AG_NUM_SCB; i++) { - if (bta_ag_co_cb[i].in_use && bta_ag_co_cb[i].handle == handle) { - bta_ag_co_cb[i].sco_state = (sco_state_t)state; - bFound = true; - pos = i; - break; - } - } - if (!bFound) { - for (int i = 0; i < BTA_AG_NUM_SCB; i++) { - if (!(bta_ag_co_cb[i].in_use)) { - bta_ag_co_cb[i].handle = handle; - bta_ag_co_cb[i].sco_state = (sco_state_t)state; - bta_ag_co_cb[i].in_use = true; - break; - } - } - } - - switch (state) { - case SCO_STATE_OFF: - BTIF_TRACE_DEBUG( - "bta_ag_co_audio_state(handle %d)::Closed (OFF), codec: 0x%x", handle, - codec); - set_audio_state(handle, (sco_codec_t)codec, (sco_state_t)state); - break; - case SCO_STATE_OFF_TRANSFER: - BTIF_TRACE_DEBUG("bta_ag_co_audio_state(handle %d)::Closed (XFERRING)", - handle); - if (bFound) { - bta_ag_co_cb[pos].in_use = false; - } - break; - case SCO_STATE_SETUP: - set_audio_state(handle, (sco_codec_t)codec, (sco_state_t)state); - break; - default: - break; - } - APPL_TRACE_DEBUG( - "bta_ag_co_audio_state(handle %d, app_id: %d, state %d, codec: 0x%x)", - handle, app_id, state, codec); -} - -/******************************************************************************* - * - * Function bta_ag_co_set_audio_state_complete - * - * Description This function is called from Vendor module to update AG that - * the pre-SCO setup is done - * - * Returns void - * - ******************************************************************************/ -void bta_ag_co_set_audio_state_complete(uint8_t status) { - int idx = 0; - while (idx < BTA_AG_NUM_SCB) { - if (bta_ag_co_cb[idx].sco_state == SCO_STATE_SETUP) { - bta_ag_ci_audio_open_continue(bta_ag_co_cb[idx].handle, status); - break; - } - idx++; - } -} - -/******************************************************************************* - * * Function bta_ag_co_data_open * * Description This function is executed by AG when a service level diff --git a/device/include/esco_parameters.h b/device/include/esco_parameters.h index 8ba3af30b..f906c8d30 100644 --- a/device/include/esco_parameters.h +++ b/device/include/esco_parameters.h @@ -20,6 +20,15 @@ #include +/******************* + * SCO Codec Types + *******************/ +typedef enum { + SCO_CODEC_NONE = 0x0000, + SCO_CODEC_CVSD = 0x0001, + SCO_CODEC_MSBC = 0x0002, +} sco_codec_t; + typedef enum { ESCO_CODEC_CVSD = 0, ESCO_CODEC_MSBC_T1, @@ -122,10 +131,7 @@ typedef struct { esco_packet_types_t packet_types; /* Packet Types */ esco_retransmission_effort_t retransmission_effort; /* 0x00-0x02, 0xFF don't care */ -} enhanced_esco_parameters_t; - -typedef esco_coding_id_format_t esco_coding_id_format_t; -typedef enhanced_esco_parameters_t enh_esco_params_t; +} enh_esco_params_t; // Get the enhanced eSCO configuration parameters for the provided |codec| enh_esco_params_t esco_parameters_for_codec(esco_codec_t codec); diff --git a/hci/Android.bp b/hci/Android.bp index b508bec37..4edcfee1b 100644 --- a/hci/Android.bp +++ b/hci/Android.bp @@ -19,7 +19,6 @@ cc_library_static { "src/btsnoop_mem.cc", "src/btsnoop_net.cc", "src/buffer_allocator.cc", - "src/hci_audio.cc", "src/hci_inject.cc", "src/hci_layer.cc", "src/hci_layer_android.cc", diff --git a/hci/BUILD.gn b/hci/BUILD.gn index 38416cd18..ba381343b 100644 --- a/hci/BUILD.gn +++ b/hci/BUILD.gn @@ -20,7 +20,6 @@ static_library("hci") { "src/btsnoop_mem.cc", "src/btsnoop_net.cc", "src/buffer_allocator.cc", - "src/hci_audio.cc", "src/hci_inject.cc", "src/hci_layer.cc", "src/hci_layer_linux.cc", diff --git a/hci/include/hci_audio.h b/hci/include/hci_audio.h deleted file mode 100644 index 3ca019c7a..000000000 --- a/hci/include/hci_audio.h +++ /dev/null @@ -1,40 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2015 Google, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ - -#pragma once - -#include - -// Audio state definitions. -typedef enum { - SCO_STATE_OFF = 0, // Audio is off. - SCO_STATE_OFF_TRANSFER, // Closed pending final transfer of audio. - SCO_STATE_ON, // Audio is on. - SCO_STATE_SETUP, // Open pending completion of audio setup. -} sco_state_t; - -// Codec type definitions. -typedef enum { - SCO_CODEC_NONE = 0x0000, - SCO_CODEC_CVSD = 0x0001, - SCO_CODEC_MSBC = 0x0002, -} sco_codec_t; - -// Set the audio state on the controller for SCO (PCM, WBS, ...) using the -// vendor library. -void set_audio_state(uint16_t handle, sco_codec_t codec, sco_state_t state); diff --git a/hci/src/hci_audio.cc b/hci/src/hci_audio.cc deleted file mode 100644 index 30eb25961..000000000 --- a/hci/src/hci_audio.cc +++ /dev/null @@ -1,38 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2015 Google, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ - -#define LOG_TAG "bt_hci_audio" - -#include "hci/include/hci_audio.h" - -#include "hci/include/bt_vendor_lib.h" -#include "osi/include/log.h" - -void set_audio_state(uint16_t handle, sco_codec_t codec, sco_state_t state) { - /* - TODO(eisenbach): [HIDL] Re-implement using VSC - - bt_vendor_op_audio_state_t audio_state; - - audio_state.handle = handle; - audio_state.peer_codec = codec; - audio_state.state = state; - - vendor_get_interface()->send_command(VENDOR_SET_AUDIO_STATE, &audio_state); - */ -} diff --git a/stack/include/btm_api_types.h b/stack/include/btm_api_types.h index 7b07a4fac..efd2501ec 100644 --- a/stack/include/btm_api_types.h +++ b/stack/include/btm_api_types.h @@ -933,7 +933,6 @@ typedef uint8_t tBTM_SCO_TYPE; * SCO Codec Types *******************/ // TODO(google) This should use common definitions -// in hci/include/hci_audio.h #define BTM_SCO_CODEC_NONE 0x0000 #define BTM_SCO_CODEC_CVSD 0x0001 #define BTM_SCO_CODEC_MSBC 0x0002