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);
- }
-}
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 */
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 */
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);
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
};
/* 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 */
/* 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] = {
/* 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] = {
/* 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] = {
/* 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];
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;
}
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;
}
}
#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));
}
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;
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";
}
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 */
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
*
* 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());
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;
}
}
- 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;
}
}
- /* 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);
}
/* 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);
}
}
/* 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);
}
}
******************************************************************************/
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
/* 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:
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:
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:
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 */
/* 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",
bta_ag_sco_evt_str(event));
}
#endif
-
- if (p_cn_scb) {
- bta_ag_codec_negotiate(p_cn_scb);
- }
}
/*******************************************************************************
/*******************************************************************************
*
- * 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
*
* Function bta_ag_sco_codec_nego
*
- * Description
+ * Description Handles result of eSCO codec negotiation
*
*
* Returns void
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,
******************************************************************************/
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;
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);
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 ||
/* 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);
/* 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);
}
/*******************************************************************************
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:
/* 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 */
*****************************************************************************/
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 */
#define BTA_AG_CO_H
#include "bta_ag_api.h"
-#include "hci/include/hci_audio.h"
/*******************************************************************************
*
/*******************************************************************************
*
- * 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
#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
/*******************************************************************************
*
- * 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
#include <stdint.h>
+/*******************
+ * 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,
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);
"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",
"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",
+++ /dev/null
-/******************************************************************************
- *
- * 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 <stdint.h>
-
-// 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);
+++ /dev/null
-/******************************************************************************
- *
- * 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);
- */
-}
* 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