system/bt
Revision | 6559d817d39875fb6d075f260fa53afb02900a6a (tree) |
---|---|
Zeit | 2017-05-24 23:23:37 |
Autor | android-build-team Robot <android-build-team-robot@goog...> |
Commiter | android-build-team Robot |
release-request-aaaef485-cf88-426c-8186-1f3903a60dd5-for-git_oc-release-4038872 snap-temp-L67700000067294126
Change-Id: Ia631f45c953fe4e417c127b35d821a27f5297b59
@@ -341,10 +341,8 @@ void bta_ag_rfc_fail(tBTA_AG_SCB* p_scb, UNUSED_ATTR tBTA_AG_DATA* p_data) { | ||
341 | 341 | p_scb->conn_handle = 0; |
342 | 342 | p_scb->conn_service = 0; |
343 | 343 | p_scb->peer_features = 0; |
344 | -#if (BTM_WBS_INCLUDED == TRUE) | |
345 | 344 | p_scb->peer_codecs = BTA_AG_CODEC_CVSD; |
346 | 345 | p_scb->sco_codec = BTA_AG_CODEC_CVSD; |
347 | -#endif | |
348 | 346 | p_scb->role = 0; |
349 | 347 | p_scb->svc_conn = false; |
350 | 348 | p_scb->hsp_version = HSP_VERSION_1_2; |
@@ -376,14 +374,12 @@ void bta_ag_rfc_close(tBTA_AG_SCB* p_scb, UNUSED_ATTR tBTA_AG_DATA* p_data) { | ||
376 | 374 | /* reinitialize stuff */ |
377 | 375 | p_scb->conn_service = 0; |
378 | 376 | p_scb->peer_features = 0; |
379 | -#if (BTM_WBS_INCLUDED == TRUE) | |
380 | 377 | p_scb->peer_codecs = BTA_AG_CODEC_CVSD; |
381 | 378 | p_scb->sco_codec = BTA_AG_CODEC_CVSD; |
382 | 379 | /* Clear these flags upon SLC teardown */ |
383 | 380 | p_scb->codec_updated = false; |
384 | 381 | p_scb->codec_fallback = false; |
385 | 382 | p_scb->codec_msbc_settings = BTA_AG_SCO_MSBC_SETTINGS_T2; |
386 | -#endif | |
387 | 383 | p_scb->role = 0; |
388 | 384 | p_scb->post_sco = BTA_AG_POST_SCO_NONE; |
389 | 385 | p_scb->svc_conn = false; |
@@ -395,9 +391,7 @@ void bta_ag_rfc_close(tBTA_AG_SCB* p_scb, UNUSED_ATTR tBTA_AG_DATA* p_data) { | ||
395 | 391 | |
396 | 392 | /* stop timers */ |
397 | 393 | alarm_cancel(p_scb->ring_timer); |
398 | -#if (BTM_WBS_INCLUDED == TRUE) | |
399 | 394 | alarm_cancel(p_scb->codec_negotiation_timer); |
400 | -#endif | |
401 | 395 | |
402 | 396 | close.hdr.handle = bta_ag_scb_to_idx(p_scb); |
403 | 397 | close.hdr.app_id = p_scb->app_id; |
@@ -762,9 +756,7 @@ void bta_ag_svc_conn_open(tBTA_AG_SCB* p_scb, | ||
762 | 756 | evt.hdr.app_id = p_scb->app_id; |
763 | 757 | evt.peer_feat = p_scb->peer_features; |
764 | 758 | bdcpy(evt.bd_addr, p_scb->peer_addr); |
765 | -#if (BTM_WBS_INCLUDED == TRUE) | |
766 | 759 | evt.peer_codec = p_scb->peer_codecs; |
767 | -#endif | |
768 | 760 | |
769 | 761 | if ((p_scb->call_ind != BTA_AG_CALL_INACTIVE) || |
770 | 762 | (p_scb->callsetup_ind != BTA_AG_CALLSETUP_NONE)) { |
@@ -834,7 +826,6 @@ void bta_ag_rcvd_slc_ready(tBTA_AG_SCB* p_scb, | ||
834 | 826 | * |
835 | 827 | ******************************************************************************/ |
836 | 828 | void bta_ag_setcodec(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data) { |
837 | -#if (BTM_WBS_INCLUDED == TRUE) | |
838 | 829 | tBTA_AG_PEER_CODEC codec_type = p_data->api_setcodec.codec; |
839 | 830 | tBTA_AG_VAL val; |
840 | 831 |
@@ -864,5 +855,4 @@ void bta_ag_setcodec(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data) { | ||
864 | 855 | } |
865 | 856 | |
866 | 857 | (*bta_ag_cb.p_cback)(BTA_AG_WBS_EVT, (tBTA_AG*)&val); |
867 | -#endif | |
868 | 858 | } |
@@ -49,10 +49,10 @@ | ||
49 | 49 | |
50 | 50 | #ifndef BTA_AG_SCO_PKT_TYPES |
51 | 51 | /* S1 packet type setting from HFP 1.5 spec */ |
52 | -#define BTA_AG_SCO_PKT_TYPES /* BTM_SCO_LINK_ALL_PKT_MASK */ \ | |
53 | - (BTM_SCO_LINK_ONLY_MASK | BTM_SCO_PKT_TYPES_MASK_EV3 | \ | |
54 | - BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 | BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | \ | |
55 | - BTM_SCO_PKT_TYPES_MASK_NO_3_EV5) | |
52 | +#define BTA_AG_SCO_PKT_TYPES /* BTM_SCO_LINK_ALL_PKT_MASK */ \ | |
53 | + (BTM_SCO_LINK_ONLY_MASK | ESCO_PKT_TYPES_MASK_EV3 | \ | |
54 | + ESCO_PKT_TYPES_MASK_NO_3_EV3 | ESCO_PKT_TYPES_MASK_NO_2_EV5 | \ | |
55 | + ESCO_PKT_TYPES_MASK_NO_3_EV5) | |
56 | 56 | #endif |
57 | 57 | |
58 | 58 | #ifndef BTA_AG_BIND_INFO |
@@ -443,7 +443,6 @@ static uint8_t bta_ag_parse_chld(UNUSED_ATTR tBTA_AG_SCB* p_scb, char* p_s) { | ||
443 | 443 | return (retval); |
444 | 444 | } |
445 | 445 | |
446 | -#if (BTM_WBS_INCLUDED == TRUE) | |
447 | 446 | /******************************************************************************* |
448 | 447 | * |
449 | 448 | * Function bta_ag_parse_bac |
@@ -492,7 +491,6 @@ static tBTA_AG_PEER_CODEC bta_ag_parse_bac(tBTA_AG_SCB* p_scb, char* p_s) { | ||
492 | 491 | |
493 | 492 | return (retval); |
494 | 493 | } |
495 | -#endif | |
496 | 494 | |
497 | 495 | /******************************************************************************* |
498 | 496 | * |
@@ -830,17 +828,14 @@ void bta_ag_at_hfp_cback(tBTA_AG_SCB* p_scb, uint16_t cmd, uint8_t arg_type, | ||
830 | 828 | tBTA_AG_SCB* ag_scb; |
831 | 829 | uint32_t i, ind_id; |
832 | 830 | uint32_t bia_masked_out; |
833 | -#if (BTM_WBS_INCLUDED == TRUE) | |
834 | - tBTA_AG_PEER_CODEC codec_type, codec_sent; | |
835 | -#endif | |
836 | 831 | if (p_arg == NULL) { |
837 | 832 | APPL_TRACE_ERROR("%s: p_arg is null, send error and return", __func__); |
838 | 833 | bta_ag_send_error(p_scb, BTA_AG_ERR_INV_CHAR_IN_TSTR); |
839 | 834 | return; |
840 | 835 | } |
841 | 836 | |
842 | - APPL_TRACE_DEBUG("HFP AT cmd:%d arg_type:%d arg:%d arg:%s", cmd, arg_type, | |
843 | - int_arg, p_arg); | |
837 | + APPL_TRACE_DEBUG("%s: AT command %d, arg_type %d, int_arg %d, arg %s", | |
838 | + __func__, cmd, arg_type, int_arg, p_arg); | |
844 | 839 | |
845 | 840 | memset(&val, 0, sizeof(tBTA_AG_VAL)); |
846 | 841 | val.hdr.handle = bta_ag_scb_to_idx(p_scb); |
@@ -1173,7 +1168,6 @@ void bta_ag_at_hfp_cback(tBTA_AG_SCB* p_scb, uint16_t cmd, uint8_t arg_type, | ||
1173 | 1168 | } |
1174 | 1169 | break; |
1175 | 1170 | |
1176 | -#if (BTM_WBS_INCLUDED == TRUE) | |
1177 | 1171 | case BTA_AG_AT_BAC_EVT: |
1178 | 1172 | bta_ag_send_ok(p_scb); |
1179 | 1173 |
@@ -1209,7 +1203,8 @@ void bta_ag_at_hfp_cback(tBTA_AG_SCB* p_scb, uint16_t cmd, uint8_t arg_type, | ||
1209 | 1203 | } |
1210 | 1204 | break; |
1211 | 1205 | |
1212 | - case BTA_AG_AT_BCS_EVT: | |
1206 | + case BTA_AG_AT_BCS_EVT: { | |
1207 | + tBTA_AG_PEER_CODEC codec_type, codec_sent; | |
1213 | 1208 | bta_ag_send_ok(p_scb); |
1214 | 1209 | alarm_cancel(p_scb->codec_negotiation_timer); |
1215 | 1210 |
@@ -1239,12 +1234,11 @@ void bta_ag_at_hfp_cback(tBTA_AG_SCB* p_scb, uint16_t cmd, uint8_t arg_type, | ||
1239 | 1234 | /* send final codec info to callback */ |
1240 | 1235 | val.num = codec_sent; |
1241 | 1236 | break; |
1242 | - | |
1237 | + } | |
1243 | 1238 | case BTA_AG_LOCAL_EVT_BCC: |
1244 | 1239 | bta_ag_send_ok(p_scb); |
1245 | 1240 | bta_ag_sco_open(p_scb, NULL); |
1246 | 1241 | break; |
1247 | -#endif | |
1248 | 1242 | |
1249 | 1243 | default: |
1250 | 1244 | bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED); |
@@ -1684,7 +1678,6 @@ void bta_ag_result(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data) { | ||
1684 | 1678 | } |
1685 | 1679 | } |
1686 | 1680 | |
1687 | -#if (BTM_WBS_INCLUDED == TRUE) | |
1688 | 1681 | /******************************************************************************* |
1689 | 1682 | * |
1690 | 1683 | * Function bta_ag_send_bcs |
@@ -1722,7 +1715,6 @@ void bta_ag_send_bcs(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data) { | ||
1722 | 1715 | APPL_TRACE_DEBUG("send +BCS codec is %d", codec_uuid); |
1723 | 1716 | bta_ag_send_result(p_scb, BTA_AG_LOCAL_RES_BCS, NULL, codec_uuid); |
1724 | 1717 | } |
1725 | -#endif | |
1726 | 1718 | |
1727 | 1719 | /******************************************************************************* |
1728 | 1720 | * |
@@ -116,11 +116,9 @@ enum { | ||
116 | 116 | |
117 | 117 | /* sco states */ |
118 | 118 | enum { |
119 | - BTA_AG_SCO_SHUTDOWN_ST, /* no sco listening, all sco connections closed */ | |
120 | - BTA_AG_SCO_LISTEN_ST, /* sco listening */ | |
121 | -#if (BTM_WBS_INCLUDED == TRUE) | |
122 | - BTA_AG_SCO_CODEC_ST, /* sco codec negotiation */ | |
123 | -#endif | |
119 | + BTA_AG_SCO_SHUTDOWN_ST, /* no sco listening, all sco connections closed */ | |
120 | + BTA_AG_SCO_LISTEN_ST, /* sco listening */ | |
121 | + BTA_AG_SCO_CODEC_ST, /* sco codec negotiation */ | |
124 | 122 | BTA_AG_SCO_OPENING_ST, /* sco connection opening */ |
125 | 123 | BTA_AG_SCO_OPEN_CL_ST, /* opening sco connection being closed */ |
126 | 124 | BTA_AG_SCO_OPEN_XFER_ST, /* opening sco connection being transferred */ |
@@ -198,9 +196,7 @@ typedef union { | ||
198 | 196 | tBTA_AG_API_REGISTER api_register; |
199 | 197 | tBTA_AG_API_OPEN api_open; |
200 | 198 | tBTA_AG_API_RESULT api_result; |
201 | -#if (BTM_WBS_INCLUDED == TRUE) | |
202 | 199 | tBTA_AG_API_SETCODEC api_setcodec; |
203 | -#endif | |
204 | 200 | tBTA_AG_DISC_RESULT disc_result; |
205 | 201 | tBTA_AG_RFC rfc; |
206 | 202 | tBTA_AG_CI_RX_WRITE ci_rx_write; |
@@ -212,12 +208,10 @@ typedef struct { | ||
212 | 208 | uint8_t scn; |
213 | 209 | } tBTA_AG_PROFILE; |
214 | 210 | |
215 | -#if (BTM_WBS_INCLUDED == TRUE) | |
216 | 211 | typedef enum { |
217 | 212 | BTA_AG_SCO_MSBC_SETTINGS_T2 = 0, /* preferred/default when codec is mSBC */ |
218 | 213 | BTA_AG_SCO_MSBC_SETTINGS_T1, |
219 | 214 | } tBTA_AG_SCO_MSBC_SETTINGS; |
220 | -#endif | |
221 | 215 | |
222 | 216 | /* type for each service control block */ |
223 | 217 | typedef struct { |
@@ -261,7 +255,6 @@ typedef struct { | ||
261 | 255 | uint32_t bia_masked_out; /* indicators HF does not want us to send */ |
262 | 256 | alarm_t* collision_timer; |
263 | 257 | alarm_t* ring_timer; |
264 | -#if (BTM_WBS_INCLUDED == TRUE) | |
265 | 258 | alarm_t* codec_negotiation_timer; |
266 | 259 | tBTA_AG_PEER_CODEC peer_codecs; /* codecs for eSCO supported by the peer */ |
267 | 260 | tBTA_AG_PEER_CODEC sco_codec; /* codec to be used for eSCO connection */ |
@@ -271,7 +264,6 @@ typedef struct { | ||
271 | 264 | bool codec_fallback; /* If sco nego fails for mSBC, fallback to CVSD */ |
272 | 265 | tBTA_AG_SCO_MSBC_SETTINGS |
273 | 266 | codec_msbc_settings; /* settings to be used for the impending eSCO */ |
274 | -#endif | |
275 | 267 | |
276 | 268 | tBTA_AG_HF_IND |
277 | 269 | peer_hf_indicators[BTA_AG_MAX_NUM_PEER_HF_IND]; /* Peer supported |
@@ -284,12 +276,11 @@ typedef struct { | ||
284 | 276 | /* type for sco data */ |
285 | 277 | typedef struct { |
286 | 278 | tBTM_ESCO_CONN_REQ_EVT_DATA conn_data; /* SCO data for pending conn request */ |
287 | - tBTA_AG_SCB* p_curr_scb; /* SCB associated with SCO connection */ | |
288 | - tBTA_AG_SCB* p_xfer_scb; /* SCB associated with SCO transfer */ | |
289 | - uint16_t cur_idx; /* SCO handle */ | |
290 | - uint8_t state; /* SCO state variable */ | |
291 | - bool param_updated; /* if params were updated to non-default */ | |
292 | - tBTM_ESCO_PARAMS params; /* ESCO parameters */ | |
279 | + tBTA_AG_SCB* p_curr_scb; /* SCB associated with SCO connection */ | |
280 | + tBTA_AG_SCB* p_xfer_scb; /* SCB associated with SCO transfer */ | |
281 | + uint16_t cur_idx; /* SCO handle */ | |
282 | + uint8_t state; /* SCO state variable */ | |
283 | + bool is_local; /* SCO connection initiated locally or remotely */ | |
293 | 284 | } tBTA_AG_SCO_CB; |
294 | 285 | |
295 | 286 | /* type for AG control block */ |
@@ -389,10 +380,8 @@ extern void bta_ag_rfc_data(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data); | ||
389 | 380 | extern void bta_ag_sco_listen(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data); |
390 | 381 | extern void bta_ag_sco_open(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data); |
391 | 382 | extern void bta_ag_sco_close(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data); |
392 | -#if (BTM_WBS_INCLUDED == TRUE) | |
393 | 383 | extern void bta_ag_sco_codec_nego(tBTA_AG_SCB* p_scb, bool result); |
394 | 384 | extern void bta_ag_codec_negotiate(tBTA_AG_SCB* p_scb); |
395 | -#endif | |
396 | 385 | extern void bta_ag_sco_shutdown(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data); |
397 | 386 | extern void bta_ag_sco_conn_open(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data); |
398 | 387 | extern void bta_ag_sco_conn_close(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data); |
@@ -401,12 +390,9 @@ extern void bta_ag_post_sco_close(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data); | ||
401 | 390 | extern void bta_ag_svc_conn_open(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data); |
402 | 391 | extern void bta_ag_result(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data); |
403 | 392 | extern void bta_ag_setcodec(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data); |
404 | -#if (BTM_WBS_INCLUDED == TRUE) | |
405 | 393 | extern void bta_ag_send_bcs(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data); |
406 | -#endif | |
407 | 394 | extern void bta_ag_send_ring(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data); |
408 | 395 | extern void bta_ag_ci_sco_data(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data); |
409 | -extern void bta_ag_set_esco_param(bool set_reset, tBTM_ESCO_PARAMS* param); | |
410 | 396 | extern void bta_ag_ci_rx_data(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data); |
411 | 397 | extern void bta_ag_rcvd_slc_ready(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data); |
412 | 398 |
@@ -194,8 +194,8 @@ const uint8_t bta_ag_st_open[][BTA_AG_NUM_COLS] = { | ||
194 | 194 | /* RING_TOUT_EVT */ {BTA_AG_SEND_RING, BTA_AG_IGNORE, BTA_AG_OPEN_ST}, |
195 | 195 | /* SVC_TOUT_EVT */ {BTA_AG_START_CLOSE, BTA_AG_IGNORE, BTA_AG_CLOSING_ST}, |
196 | 196 | /* CI_SCO_DATA_EVT */ {BTA_AG_CI_SCO_DATA, BTA_AG_IGNORE, BTA_AG_OPEN_ST}, |
197 | - /* CI_SLC_READY_EVT */ {BTA_AG_RCVD_SLC_READY, BTA_AG_IGNORE, | |
198 | - BTA_AG_OPEN_ST}}; | |
197 | + /* CI_SLC_READY_EVT */ | |
198 | + {BTA_AG_RCVD_SLC_READY, BTA_AG_IGNORE, BTA_AG_OPEN_ST}}; | |
199 | 199 | |
200 | 200 | /* state table for closing state */ |
201 | 201 | const uint8_t bta_ag_st_closing[][BTA_AG_NUM_COLS] = { |
@@ -259,20 +259,16 @@ static tBTA_AG_SCB* bta_ag_scb_alloc(void) { | ||
259 | 259 | /* initialize variables */ |
260 | 260 | p_scb->in_use = true; |
261 | 261 | p_scb->sco_idx = BTM_INVALID_SCO_INDEX; |
262 | -#if (BTM_WBS_INCLUDED == TRUE) | |
263 | 262 | p_scb->codec_updated = false; |
264 | 263 | p_scb->peer_codecs = BTA_AG_CODEC_CVSD; |
265 | 264 | p_scb->sco_codec = BTA_AG_CODEC_CVSD; |
266 | -#endif | |
267 | 265 | /* set up timers */ |
268 | 266 | p_scb->ring_timer = alarm_new("bta_ag.scb_ring_timer"); |
269 | 267 | p_scb->collision_timer = alarm_new("bta_ag.scb_collision_timer"); |
270 | -#if (BTM_WBS_INCLUDED == TRUE) | |
271 | 268 | p_scb->codec_negotiation_timer = |
272 | 269 | alarm_new("bta_ag.scb_codec_negotiation_timer"); |
273 | 270 | /* set eSCO mSBC setting to T2 as the preferred */ |
274 | 271 | p_scb->codec_msbc_settings = BTA_AG_SCO_MSBC_SETTINGS_T2; |
275 | -#endif | |
276 | 272 | APPL_TRACE_DEBUG("bta_ag_scb_alloc %d", bta_ag_scb_to_idx(p_scb)); |
277 | 273 | break; |
278 | 274 | } |
@@ -281,7 +277,7 @@ static tBTA_AG_SCB* bta_ag_scb_alloc(void) { | ||
281 | 277 | if (i == BTA_AG_NUM_SCB) { |
282 | 278 | /* out of scbs */ |
283 | 279 | p_scb = NULL; |
284 | - APPL_TRACE_WARNING("Out of ag scbs"); | |
280 | + APPL_TRACE_WARNING("%s: Out of scbs", __func__); | |
285 | 281 | } |
286 | 282 | return p_scb; |
287 | 283 | } |
@@ -304,9 +300,7 @@ void bta_ag_scb_dealloc(tBTA_AG_SCB* p_scb) { | ||
304 | 300 | |
305 | 301 | /* stop and free timers */ |
306 | 302 | alarm_free(p_scb->ring_timer); |
307 | -#if (BTM_WBS_INCLUDED == TRUE) | |
308 | 303 | alarm_free(p_scb->codec_negotiation_timer); |
309 | -#endif | |
310 | 304 | alarm_free(p_scb->collision_timer); |
311 | 305 | |
312 | 306 | /* initialize control block */ |
@@ -594,9 +588,7 @@ static void bta_ag_api_enable(tBTA_AG_DATA* p_data) { | ||
594 | 588 | /* initialize control block */ |
595 | 589 | for (size_t i = 0; i < BTA_AG_NUM_SCB; i++) { |
596 | 590 | alarm_free(bta_ag_cb.scb[i].ring_timer); |
597 | -#if (BTM_WBS_INCLUDED == TRUE) | |
598 | 591 | alarm_free(bta_ag_cb.scb[i].codec_negotiation_timer); |
599 | -#endif | |
600 | 592 | alarm_free(bta_ag_cb.scb[i].collision_timer); |
601 | 593 | } |
602 | 594 | memset(&bta_ag_cb, 0, sizeof(tBTA_AG_CB)); |
@@ -723,27 +715,30 @@ void bta_ag_sm_execute(tBTA_AG_SCB* p_scb, uint16_t event, | ||
723 | 715 | tBTA_AG_ST_TBL state_table; |
724 | 716 | uint8_t action; |
725 | 717 | int i; |
726 | - | |
727 | 718 | #if (BTA_AG_DEBUG == TRUE) |
728 | - uint16_t in_event = event; | |
729 | - uint8_t in_state = p_scb->state; | |
719 | + uint16_t previous_event = event; | |
720 | + uint8_t previous_state = p_scb->state; | |
730 | 721 | |
731 | 722 | /* Ignore displaying of AT results when not connected (Ignored in state |
732 | 723 | * machine) */ |
733 | - if (in_event != BTA_AG_API_RESULT_EVT || p_scb->state == BTA_AG_OPEN_ST) { | |
734 | - APPL_TRACE_EVENT("AG evt (hdl 0x%04x): State %d (%s), Event 0x%04x (%s)", | |
735 | - bta_ag_scb_to_idx(p_scb), p_scb->state, | |
724 | + if ((previous_event != BTA_AG_API_RESULT_EVT || | |
725 | + p_scb->state == BTA_AG_OPEN_ST) && | |
726 | + event != BTA_AG_CI_SCO_DATA_EVT) { | |
727 | + APPL_TRACE_EVENT("%s: Handle 0x%04x, State %d (%s), Event 0x%04x (%s)", | |
728 | + __func__, bta_ag_scb_to_idx(p_scb), p_scb->state, | |
736 | 729 | bta_ag_state_str(p_scb->state), event, |
737 | 730 | bta_ag_evt_str(event, p_data->api_result.result)); |
738 | 731 | } |
739 | 732 | #else |
740 | - APPL_TRACE_EVENT("AG evt (hdl 0x%04x): State %d, Event 0x%04x", | |
741 | - bta_ag_scb_to_idx(p_scb), p_scb->state, event); | |
733 | + if (event != BTA_AG_CI_SCO_DATA_EVT) { | |
734 | + APPL_TRACE_EVENT("%s: Handle 0x%04x, State %d, Event 0x%04x", __func__, | |
735 | + bta_ag_scb_to_idx(p_scb), p_scb->state, event); | |
736 | + } | |
742 | 737 | #endif |
743 | 738 | |
744 | 739 | event &= 0x00FF; |
745 | 740 | if (event >= (BTA_AG_MAX_EVT & 0x00FF)) { |
746 | - APPL_TRACE_ERROR("AG evt out of range, ignoring..."); | |
741 | + APPL_TRACE_ERROR("%s: event out of range, ignored", __func__); | |
747 | 742 | return; |
748 | 743 | } |
749 | 744 |
@@ -763,10 +758,11 @@ void bta_ag_sm_execute(tBTA_AG_SCB* p_scb, uint16_t event, | ||
763 | 758 | } |
764 | 759 | } |
765 | 760 | #if (BTA_AG_DEBUG == TRUE) |
766 | - if (p_scb->state != in_state) { | |
767 | - APPL_TRACE_EVENT("BTA AG State Change: [%s] -> [%s] after Event [%s]", | |
768 | - bta_ag_state_str(in_state), bta_ag_state_str(p_scb->state), | |
769 | - bta_ag_evt_str(in_event, p_data->api_result.result)); | |
761 | + if (p_scb->state != previous_state) { | |
762 | + APPL_TRACE_EVENT("%s: State Change: [%s] -> [%s] after Event [%s]", | |
763 | + __func__, bta_ag_state_str(previous_state), | |
764 | + bta_ag_state_str(p_scb->state), | |
765 | + bta_ag_evt_str(previous_event, p_data->api_result.result)); | |
770 | 766 | } |
771 | 767 | #endif |
772 | 768 | } |
@@ -786,22 +782,18 @@ bool bta_ag_hdl_event(BT_HDR* p_msg) { | ||
786 | 782 | |
787 | 783 | APPL_TRACE_DEBUG("bta_ag_hdl_event: Event 0x%04x ", p_msg->event); |
788 | 784 | switch (p_msg->event) { |
789 | - /* handle enable event */ | |
790 | 785 | case BTA_AG_API_ENABLE_EVT: |
791 | 786 | bta_ag_api_enable((tBTA_AG_DATA*)p_msg); |
792 | 787 | break; |
793 | 788 | |
794 | - /* handle disable event */ | |
795 | 789 | case BTA_AG_API_DISABLE_EVT: |
796 | 790 | bta_ag_api_disable((tBTA_AG_DATA*)p_msg); |
797 | 791 | break; |
798 | 792 | |
799 | - /* handle register event */ | |
800 | 793 | case BTA_AG_API_REGISTER_EVT: |
801 | 794 | bta_ag_api_register((tBTA_AG_DATA*)p_msg); |
802 | 795 | break; |
803 | 796 | |
804 | - /* handle result event */ | |
805 | 797 | case BTA_AG_API_RESULT_EVT: |
806 | 798 | bta_ag_api_result((tBTA_AG_DATA*)p_msg); |
807 | 799 | break; |
@@ -24,15 +24,17 @@ | ||
24 | 24 | |
25 | 25 | #include <stddef.h> |
26 | 26 | |
27 | +#include "bt_common.h" | |
27 | 28 | #include "bta_ag_api.h" |
28 | 29 | #include "bta_ag_co.h" |
30 | +#include "bta_ag_int.h" | |
29 | 31 | #include "bta_api.h" |
30 | 32 | #if (BTM_SCO_HCI_INCLUDED == TRUE) |
31 | 33 | #include "bta_dm_co.h" |
32 | 34 | #endif |
33 | -#include "bt_common.h" | |
34 | -#include "bta_ag_int.h" | |
35 | 35 | #include "btm_api.h" |
36 | +#include "device/include/controller.h" | |
37 | +#include "device/include/esco_parameters.h" | |
36 | 38 | #include "osi/include/osi.h" |
37 | 39 | #include "utl.h" |
38 | 40 |
@@ -52,19 +54,17 @@ static char* bta_ag_sco_evt_str(uint8_t event); | ||
52 | 54 | static char* bta_ag_sco_state_str(uint8_t state); |
53 | 55 | #endif |
54 | 56 | |
55 | -#define BTA_AG_NO_EDR_ESCO \ | |
56 | - (BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 | BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 | \ | |
57 | - BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | BTM_SCO_PKT_TYPES_MASK_NO_3_EV5) | |
57 | +#define BTA_AG_NO_EDR_ESCO \ | |
58 | + (ESCO_PKT_TYPES_MASK_NO_2_EV3 | ESCO_PKT_TYPES_MASK_NO_3_EV3 | \ | |
59 | + ESCO_PKT_TYPES_MASK_NO_2_EV5 | ESCO_PKT_TYPES_MASK_NO_3_EV5) | |
58 | 60 | |
59 | 61 | /* sco events */ |
60 | 62 | enum { |
61 | - BTA_AG_SCO_LISTEN_E, /* listen request */ | |
62 | - BTA_AG_SCO_OPEN_E, /* open request */ | |
63 | - BTA_AG_SCO_XFER_E, /* transfer request */ | |
64 | -#if (BTM_WBS_INCLUDED == TRUE) | |
63 | + BTA_AG_SCO_LISTEN_E, /* listen request */ | |
64 | + BTA_AG_SCO_OPEN_E, /* open request */ | |
65 | + BTA_AG_SCO_XFER_E, /* transfer request */ | |
65 | 66 | BTA_AG_SCO_CN_DONE_E, /* codec negotiation done */ |
66 | 67 | BTA_AG_SCO_REOPEN_E, /* Retry with other codec when failed */ |
67 | -#endif | |
68 | 68 | BTA_AG_SCO_CLOSE_E, /* close request */ |
69 | 69 | BTA_AG_SCO_SHUTDOWN_E, /* shutdown request */ |
70 | 70 | BTA_AG_SCO_CONN_OPEN_E, /* sco open */ |
@@ -72,63 +72,7 @@ enum { | ||
72 | 72 | BTA_AG_SCO_CI_DATA_E /* SCO data ready */ |
73 | 73 | }; |
74 | 74 | |
75 | -#if (BTM_WBS_INCLUDED == TRUE) | |
76 | -#define BTA_AG_NUM_CODECS 3 | |
77 | -#define BTA_AG_ESCO_SETTING_IDX_CVSD 0 /* eSCO setting for CVSD */ | |
78 | -#define BTA_AG_ESCO_SETTING_IDX_T1 1 /* eSCO setting for mSBC T1 */ | |
79 | -#define BTA_AG_ESCO_SETTING_IDX_T2 2 /* eSCO setting for mSBC T2 */ | |
80 | - | |
81 | -static const tBTM_ESCO_PARAMS bta_ag_esco_params[BTA_AG_NUM_CODECS] = { | |
82 | - /* CVSD */ | |
83 | - { | |
84 | - BTM_64KBITS_RATE, /* TX Bandwidth (64 kbits/sec) */ | |
85 | - BTM_64KBITS_RATE, /* RX Bandwidth (64 kbits/sec) */ | |
86 | - 0x000c, /* 12 ms (HS/HF can use EV3, 2-EV3, 3-EV3) */ | |
87 | - BTM_VOICE_SETTING_CVSD, /* Inp Linear, Air CVSD, 2s Comp, 16bit */ | |
88 | - (BTM_SCO_PKT_TYPES_MASK_HV1 + /* Packet Types */ | |
89 | - BTM_SCO_PKT_TYPES_MASK_HV2 + BTM_SCO_PKT_TYPES_MASK_HV3 + | |
90 | - BTM_SCO_PKT_TYPES_MASK_EV3 + BTM_SCO_PKT_TYPES_MASK_EV4 + | |
91 | - BTM_SCO_PKT_TYPES_MASK_EV5 + BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 + | |
92 | - BTM_SCO_PKT_TYPES_MASK_NO_3_EV5), | |
93 | - BTM_ESCO_RETRANS_QUALITY /* Retransmission effort */ | |
94 | - }, | |
95 | - /* mSBC T1 */ | |
96 | - { | |
97 | - BTM_64KBITS_RATE, /* TX Bandwidth (64 kbits/sec), 8000 */ | |
98 | - BTM_64KBITS_RATE, /* RX Bandwidth (64 kbits/sec), 8000 */ | |
99 | - 8, /* 8 ms */ | |
100 | - BTM_VOICE_SETTING_TRANS, /* Inp Linear, Transparent, 2s Comp, 16bit */ | |
101 | - (BTM_SCO_PKT_TYPES_MASK_EV3 | /* Packet Types : EV3 + NO_2_EV3 */ | |
102 | - BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 | BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | | |
103 | - BTM_SCO_PKT_TYPES_MASK_NO_3_EV5 | BTM_SCO_PKT_TYPES_MASK_NO_2_EV3), | |
104 | - BTM_ESCO_RETRANS_QUALITY /* Retransmission effort */ | |
105 | - }, | |
106 | - /* mSBC T2*/ | |
107 | - { | |
108 | - BTM_64KBITS_RATE, /* TX Bandwidth (64 kbits/sec), 8000 */ | |
109 | - BTM_64KBITS_RATE, /* RX Bandwidth (64 kbits/sec), 8000 */ | |
110 | - 13, /* 13 ms */ | |
111 | - BTM_VOICE_SETTING_TRANS, /* Inp Linear, Transparent, 2s Comp, 16bit */ | |
112 | - (BTM_SCO_PKT_TYPES_MASK_EV3 | /* Packet Types : EV3 + 2-EV3 */ | |
113 | - BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 | BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | | |
114 | - BTM_SCO_PKT_TYPES_MASK_NO_3_EV5), | |
115 | - BTM_ESCO_RETRANS_QUALITY /* Retransmission effort */ | |
116 | - }}; | |
117 | -#else | |
118 | -/* WBS not included, CVSD by default */ | |
119 | -static const tBTM_ESCO_PARAMS bta_ag_esco_params = { | |
120 | - BTM_64KBITS_RATE, /* TX Bandwidth (64 kbits/sec) */ | |
121 | - BTM_64KBITS_RATE, /* RX Bandwidth (64 kbits/sec) */ | |
122 | - 0x000a, /* 10 ms (HS/HF can use EV3, 2-EV3, 3-EV3) */ | |
123 | - 0x0060, /* Inp Linear, Air CVSD, 2s Comp, 16bit */ | |
124 | - (BTM_SCO_PKT_TYPES_MASK_HV1 + /* Packet Types */ | |
125 | - BTM_SCO_PKT_TYPES_MASK_HV2 + BTM_SCO_PKT_TYPES_MASK_HV3 + | |
126 | - BTM_SCO_PKT_TYPES_MASK_EV3 + BTM_SCO_PKT_TYPES_MASK_EV4 + | |
127 | - BTM_SCO_PKT_TYPES_MASK_EV5 + BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 + | |
128 | - BTM_SCO_PKT_TYPES_MASK_NO_3_EV5), | |
129 | - BTM_ESCO_RETRANS_POWER /* Retransmission effort */ | |
130 | -}; | |
131 | -#endif | |
75 | +static void bta_ag_create_pending_sco(tBTA_AG_SCB* p_scb, bool is_local); | |
132 | 76 | |
133 | 77 | /******************************************************************************* |
134 | 78 | * |
@@ -209,37 +153,39 @@ static void bta_ag_sco_disc_cback(uint16_t sco_idx) { | ||
209 | 153 | |
210 | 154 | if (handle != 0) { |
211 | 155 | #if (BTM_SCO_HCI_INCLUDED == TRUE) |
212 | - tBTM_STATUS status = BTM_ConfigScoPath(BTM_SCO_ROUTE_PCM, NULL, NULL, true); | |
213 | - APPL_TRACE_DEBUG("bta_ag_sco_disc_cback sco close config status = %d", | |
214 | - status); | |
156 | + | |
157 | + tBTM_STATUS status = | |
158 | + BTM_ConfigScoPath(ESCO_DATA_PATH_PCM, NULL, NULL, true); | |
159 | + APPL_TRACE_DEBUG("%s: sco close config status = %d", __func__, status); | |
215 | 160 | /* SCO clean up here */ |
216 | 161 | bta_dm_sco_co_close(); |
217 | 162 | #endif |
218 | 163 | |
219 | -#if (BTM_WBS_INCLUDED == TRUE) | |
220 | 164 | /* Restore settings */ |
221 | 165 | if (bta_ag_cb.sco.p_curr_scb->inuse_codec == BTA_AG_CODEC_MSBC) { |
222 | - /* set_sco_codec(BTM_SCO_CODEC_NONE); we should get a close */ | |
223 | - BTM_WriteVoiceSettings(BTM_VOICE_SETTING_CVSD); | |
166 | + /* Bypass vendor specific and voice settings if enhanced eSCO supported */ | |
167 | + if (!(controller_get_interface() | |
168 | + ->supports_enhanced_setup_synchronous_connection())) { | |
169 | + BTM_WriteVoiceSettings(BTM_VOICE_SETTING_CVSD); | |
170 | + } | |
224 | 171 | |
225 | - /* If SCO open was initiated by AG and failed for mSBC, then attempt | |
226 | - mSBC with T1 settings i.e. 'Safe Settings'. If this fails, then switch to | |
227 | - CVSD */ | |
172 | + /* If SCO open was initiated by AG and failed for mSBC T2, try mSBC T1 | |
173 | + * 'Safe setting' first. If T1 also fails, try CVSD */ | |
228 | 174 | if (bta_ag_sco_is_opening(bta_ag_cb.sco.p_curr_scb)) { |
175 | + bta_ag_cb.sco.p_curr_scb->state = BTA_AG_SCO_CODEC_ST; | |
229 | 176 | if (bta_ag_cb.sco.p_curr_scb->codec_msbc_settings == |
230 | 177 | BTA_AG_SCO_MSBC_SETTINGS_T2) { |
231 | - APPL_TRACE_DEBUG("Fallback to mSBC T1 settings"); | |
178 | + APPL_TRACE_DEBUG("%s: Fallback to mSBC T1 settings", __func__); | |
232 | 179 | bta_ag_cb.sco.p_curr_scb->codec_msbc_settings = |
233 | 180 | BTA_AG_SCO_MSBC_SETTINGS_T1; |
234 | 181 | } else { |
235 | - APPL_TRACE_DEBUG("Fallback to CVSD settings"); | |
182 | + APPL_TRACE_DEBUG("%s: Fallback to CVSD", __func__); | |
236 | 183 | bta_ag_cb.sco.p_curr_scb->codec_fallback = true; |
237 | 184 | } |
238 | 185 | } |
239 | 186 | } |
240 | 187 | |
241 | 188 | bta_ag_cb.sco.p_curr_scb->inuse_codec = BTA_AG_CODEC_NONE; |
242 | -#endif | |
243 | 189 | |
244 | 190 | BT_HDR* p_buf = (BT_HDR*)osi_malloc(sizeof(BT_HDR)); |
245 | 191 | p_buf->event = BTA_AG_SCO_CLOSE_EVT; |
@@ -271,7 +217,7 @@ static void bta_ag_sco_disc_cback(uint16_t sco_idx) { | ||
271 | 217 | static void bta_ag_sco_read_cback(uint16_t sco_inx, BT_HDR* p_data, |
272 | 218 | tBTM_SCO_DATA_FLAG status) { |
273 | 219 | if (status != BTM_SCO_DATA_CORRECT) { |
274 | - APPL_TRACE_DEBUG("bta_ag_sco_read_cback: status(%d)", status); | |
220 | + APPL_TRACE_DEBUG("%s: status %d", __func__, status); | |
275 | 221 | } |
276 | 222 | |
277 | 223 | /* Callout function must free the data. */ |
@@ -286,33 +232,26 @@ static void bta_ag_sco_read_cback(uint16_t sco_inx, BT_HDR* p_data, | ||
286 | 232 | * If only_active is true, then SCO is only removed if |
287 | 233 | * connected |
288 | 234 | * |
289 | - * Returns bool - true if Sco removal was started | |
235 | + * Returns bool - true if SCO removal was started | |
290 | 236 | * |
291 | 237 | ******************************************************************************/ |
292 | 238 | static bool bta_ag_remove_sco(tBTA_AG_SCB* p_scb, bool only_active) { |
293 | - bool removed_started = false; | |
294 | - tBTM_STATUS status; | |
295 | - | |
296 | 239 | if (p_scb->sco_idx != BTM_INVALID_SCO_INDEX) { |
297 | 240 | if (!only_active || p_scb->sco_idx == bta_ag_cb.sco.cur_idx) { |
298 | - status = BTM_RemoveSco(p_scb->sco_idx); | |
299 | - | |
300 | - APPL_TRACE_DEBUG("ag remove sco: inx 0x%04x, status:0x%x", p_scb->sco_idx, | |
301 | - status); | |
302 | - | |
241 | + tBTM_STATUS status = BTM_RemoveSco(p_scb->sco_idx); | |
242 | + APPL_TRACE_DEBUG("%s: SCO index 0x%04x, status %d", __func__, | |
243 | + p_scb->sco_idx, status); | |
303 | 244 | if (status == BTM_CMD_STARTED) { |
304 | - /* Sco is connected; set current control block */ | |
245 | + /* SCO is connected; set current control block */ | |
305 | 246 | bta_ag_cb.sco.p_curr_scb = p_scb; |
306 | - | |
307 | - removed_started = true; | |
308 | - } | |
309 | - /* If no connection reset the sco handle */ | |
310 | - else if ((status == BTM_SUCCESS) || (status == BTM_UNKNOWN_ADDR)) { | |
247 | + return true; | |
248 | + } else if ((status == BTM_SUCCESS) || (status == BTM_UNKNOWN_ADDR)) { | |
249 | + /* If no connection reset the SCO handle */ | |
311 | 250 | p_scb->sco_idx = BTM_INVALID_SCO_INDEX; |
312 | 251 | } |
313 | 252 | } |
314 | 253 | } |
315 | - return removed_started; | |
254 | + return false; | |
316 | 255 | } |
317 | 256 | |
318 | 257 | /******************************************************************************* |
@@ -339,16 +278,15 @@ static void bta_ag_esco_connreq_cback(tBTM_ESCO_EVT event, | ||
339 | 278 | |
340 | 279 | /* If no other SCO active, allow this one */ |
341 | 280 | if (!bta_ag_cb.sco.p_curr_scb) { |
342 | - APPL_TRACE_EVENT( | |
343 | - "bta_ag_esco_connreq_cback: Accept Conn Request (sco_inx 0x%04x)", | |
344 | - sco_inx); | |
281 | + APPL_TRACE_EVENT("%s: Accept Conn Request (sco_inx 0x%04x)", __func__, | |
282 | + sco_inx); | |
345 | 283 | bta_ag_sco_conn_rsp(p_scb, &p_data->conn_evt); |
346 | 284 | |
347 | 285 | bta_ag_cb.sco.state = BTA_AG_SCO_OPENING_ST; |
348 | 286 | bta_ag_cb.sco.p_curr_scb = p_scb; |
349 | 287 | bta_ag_cb.sco.cur_idx = p_scb->sco_idx; |
350 | - } else /* Begin a transfer: Close current SCO before responding */ | |
351 | - { | |
288 | + } else { | |
289 | + /* Begin a transfer: Close current SCO before responding */ | |
352 | 290 | APPL_TRACE_DEBUG("bta_ag_esco_connreq_cback: Begin XFER"); |
353 | 291 | bta_ag_cb.sco.p_xfer_scb = p_scb; |
354 | 292 | bta_ag_cb.sco.conn_data = p_data->conn_evt; |
@@ -356,29 +294,27 @@ static void bta_ag_esco_connreq_cback(tBTM_ESCO_EVT event, | ||
356 | 294 | |
357 | 295 | if (!bta_ag_remove_sco(bta_ag_cb.sco.p_curr_scb, true)) { |
358 | 296 | APPL_TRACE_ERROR( |
359 | - "bta_ag_esco_connreq_cback: Nothing to remove so accept Conn " | |
360 | - "Request (sco_inx 0x%04x)", | |
361 | - sco_inx); | |
297 | + "%s: Nothing to remove,so accept Conn Request(sco_inx 0x%04x)", | |
298 | + __func__, sco_inx); | |
362 | 299 | bta_ag_cb.sco.p_xfer_scb = NULL; |
363 | 300 | bta_ag_cb.sco.state = BTA_AG_SCO_LISTEN_ST; |
364 | 301 | |
365 | 302 | bta_ag_sco_conn_rsp(p_scb, &p_data->conn_evt); |
366 | 303 | } |
367 | 304 | } |
368 | - } | |
369 | - /* If error occurred send reject response immediately */ | |
370 | - else { | |
305 | + } else { | |
306 | + /* If error occurred send reject response immediately */ | |
371 | 307 | APPL_TRACE_WARNING( |
372 | 308 | "no scb for bta_ag_esco_connreq_cback or no resources"); |
373 | 309 | BTM_EScoConnRsp(p_data->conn_evt.sco_inx, HCI_ERR_HOST_REJECT_RESOURCES, |
374 | - NULL); | |
310 | + (enh_esco_params_t*)NULL); | |
375 | 311 | } |
376 | - } | |
377 | - /* Received a change in the esco link */ | |
378 | - else if (event == BTM_ESCO_CHG_EVT) { | |
312 | + } else if (event == BTM_ESCO_CHG_EVT) { | |
313 | + /* Received a change in the esco link */ | |
379 | 314 | APPL_TRACE_EVENT( |
380 | - "eSCO change event (inx %d): rtrans %d, rxlen %d, txlen %d, txint %d", | |
381 | - p_data->chg_evt.sco_inx, p_data->chg_evt.retrans_window, | |
315 | + "%s: eSCO change event (inx %d): rtrans %d, " | |
316 | + "rxlen %d, txlen %d, txint %d", | |
317 | + __func__, p_data->chg_evt.sco_inx, p_data->chg_evt.retrans_window, | |
382 | 318 | p_data->chg_evt.rx_pkt_len, p_data->chg_evt.tx_pkt_len, |
383 | 319 | p_data->chg_evt.tx_interval); |
384 | 320 | } |
@@ -408,176 +344,188 @@ static void bta_ag_cback_sco(tBTA_AG_SCB* p_scb, uint8_t event) { | ||
408 | 344 | * |
409 | 345 | * Function bta_ag_create_sco |
410 | 346 | * |
411 | - * Description | |
412 | - * | |
347 | + * Description Create a SCO connection for a given control block | |
348 | + * p_scb : Pointer to the target AG control block | |
349 | + * is_orig : Whether to initiate or listen for SCO connection | |
413 | 350 | * |
414 | 351 | * Returns void |
415 | 352 | * |
416 | 353 | ******************************************************************************/ |
417 | 354 | static void bta_ag_create_sco(tBTA_AG_SCB* p_scb, bool is_orig) { |
418 | - tBTM_STATUS status; | |
419 | - uint8_t* p_bd_addr = NULL; | |
420 | - tBTM_ESCO_PARAMS params; | |
421 | -#if (BTM_WBS_INCLUDED == TRUE) | |
422 | - tBTA_AG_PEER_CODEC esco_codec = BTM_SCO_CODEC_CVSD; | |
423 | - int codec_index = 0; | |
424 | -#endif | |
425 | -#if (BTM_SCO_HCI_INCLUDED == TRUE) | |
426 | - tBTM_SCO_ROUTE_TYPE sco_route; | |
427 | - tBTA_CODEC_INFO codec_info = {BTA_SCO_CODEC_PCM}; | |
428 | - uint32_t pcm_sample_rate; | |
429 | -#endif | |
355 | + tBTA_AG_PEER_CODEC esco_codec = BTA_AG_CODEC_CVSD; | |
430 | 356 | |
431 | - /* Make sure this sco handle is not already in use */ | |
357 | + /* Make sure this SCO handle is not already in use */ | |
432 | 358 | if (p_scb->sco_idx != BTM_INVALID_SCO_INDEX) { |
433 | - APPL_TRACE_WARNING("bta_ag_create_sco: Index 0x%04x Already In Use!", | |
434 | - p_scb->sco_idx); | |
359 | + APPL_TRACE_ERROR("%s: Index 0x%04x already in use!", __func__, | |
360 | + p_scb->sco_idx); | |
435 | 361 | return; |
436 | 362 | } |
437 | 363 | |
438 | -#if (BTM_WBS_INCLUDED == TRUE) | |
439 | - if ((p_scb->sco_codec == BTM_SCO_CODEC_MSBC) && !p_scb->codec_fallback && | |
364 | + APPL_TRACE_DEBUG("%s: Using enhanced SCO setup command %d", __func__, | |
365 | + controller_get_interface() | |
366 | + ->supports_enhanced_setup_synchronous_connection()); | |
367 | + | |
368 | + if ((p_scb->sco_codec == BTA_AG_CODEC_MSBC) && !p_scb->codec_fallback && | |
440 | 369 | !p_scb->retry_with_sco_only) |
441 | - esco_codec = BTM_SCO_CODEC_MSBC; | |
370 | + esco_codec = BTA_AG_CODEC_MSBC; | |
442 | 371 | |
443 | 372 | if (p_scb->codec_fallback) { |
444 | 373 | p_scb->codec_fallback = false; |
445 | - | |
446 | 374 | /* Force AG to send +BCS for the next audio connection. */ |
447 | 375 | p_scb->codec_updated = true; |
448 | 376 | } |
449 | 377 | |
450 | - /* If WBS included, use CVSD by default, index is 0 for CVSD by initialization | |
451 | - */ | |
452 | - /* If eSCO codec is mSBC, index is T2 or T1 */ | |
453 | - if (esco_codec == BTM_SCO_CODEC_MSBC) { | |
378 | + esco_codec_t codec_index = ESCO_CODEC_CVSD; | |
379 | + /* If WBS included, use CVSD by default, index is 0 for CVSD by | |
380 | + * initialization. If eSCO codec is mSBC, index is T2 or T1 */ | |
381 | + if (esco_codec == BTA_AG_CODEC_MSBC) { | |
454 | 382 | if (p_scb->codec_msbc_settings == BTA_AG_SCO_MSBC_SETTINGS_T2) { |
455 | - codec_index = BTA_AG_ESCO_SETTING_IDX_T2; | |
383 | + codec_index = ESCO_CODEC_MSBC_T2; | |
456 | 384 | } else { |
457 | - codec_index = BTA_AG_ESCO_SETTING_IDX_T1; | |
385 | + codec_index = ESCO_CODEC_MSBC_T1; | |
458 | 386 | } |
459 | 387 | } |
460 | 388 | |
461 | - params = bta_ag_esco_params[codec_index]; | |
462 | -#else | |
463 | - /* When WBS is not included, use CVSD by default */ | |
464 | - params = bta_ag_esco_params; | |
465 | -#endif | |
466 | - | |
467 | - if (bta_ag_cb.sco.param_updated) /* If we do not use the default parameters */ | |
468 | - params = bta_ag_cb.sco.params; | |
469 | - | |
470 | - if (!bta_ag_cb.sco.param_updated) { | |
471 | -#if (BTM_WBS_INCLUDED == TRUE) | |
472 | - if (esco_codec == BTM_SCO_CODEC_CVSD) /* For CVSD */ | |
473 | -#endif | |
474 | - { | |
475 | - /* Use the application packet types (5 slot EV packets not allowed) */ | |
476 | - params.packet_types = p_bta_ag_cfg->sco_pkt_types | | |
477 | - BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | | |
478 | - BTM_SCO_PKT_TYPES_MASK_NO_3_EV5; | |
389 | + /* Initialize eSCO parameters */ | |
390 | + enh_esco_params_t params = esco_parameters_for_codec(codec_index); | |
391 | + /* For CVSD */ | |
392 | + if (esco_codec == BTM_SCO_CODEC_CVSD) { | |
393 | + /* Use the applicable packet types | |
394 | + (3-EV3 not allowed due to errata 2363) */ | |
395 | + params.packet_types = | |
396 | + p_bta_ag_cfg->sco_pkt_types | ESCO_PKT_TYPES_MASK_NO_3_EV3; | |
397 | + if ((!(p_scb->features & BTA_AG_FEAT_ESCO)) || | |
398 | + (!(p_scb->peer_features & BTA_AG_PEER_FEAT_ESCO))) { | |
399 | + params.max_latency_ms = 10; | |
400 | + params.retransmission_effort = ESCO_RETRANSMISSION_POWER; | |
479 | 401 | } |
480 | 402 | } |
481 | 403 | |
482 | - /* if initiating set current scb and peer bd addr */ | |
404 | + /* If initiating, setup parameters to start SCO/eSCO connection */ | |
483 | 405 | if (is_orig) { |
406 | + bta_ag_cb.sco.is_local = true; | |
484 | 407 | /* Attempt to use eSCO if remote host supports HFP >= 1.5 */ |
485 | - /* Need to find out from SIG if HSP can use eSCO; for now use SCO */ | |
408 | + /* HSP does not prohibit eSCO, but no official support, CVSD only */ | |
486 | 409 | if (p_scb->conn_service == BTA_AG_HFP && |
487 | 410 | p_scb->peer_version >= HFP_VERSION_1_5 && !p_scb->retry_with_sco_only) { |
488 | - BTM_SetEScoMode(BTM_LINK_TYPE_ESCO, ¶ms); | |
489 | - /* If ESCO or EDR ESCO, retry with SCO only in case of failure */ | |
411 | + BTM_SetEScoMode(¶ms); | |
412 | + /* If eSCO or EDR eSCO, retry with SCO only in case of failure */ | |
490 | 413 | if ((params.packet_types & BTM_ESCO_LINK_ONLY_MASK) || |
491 | 414 | !((params.packet_types & |
492 | 415 | ~(BTM_ESCO_LINK_ONLY_MASK | BTM_SCO_LINK_ONLY_MASK)) ^ |
493 | 416 | BTA_AG_NO_EDR_ESCO)) { |
494 | -#if (BTM_WBS_INCLUDED == TRUE) | |
417 | + /* However, do not retry with SCO when using mSBC */ | |
495 | 418 | if (esco_codec != BTA_AG_CODEC_MSBC) { |
496 | 419 | p_scb->retry_with_sco_only = true; |
497 | - APPL_TRACE_API("Setting retry_with_sco_only to true"); | |
498 | - } else /* Do not use SCO when using mSBC */ | |
499 | - { | |
500 | - p_scb->retry_with_sco_only = false; | |
501 | - APPL_TRACE_API("Setting retry_with_sco_only to false"); | |
502 | 420 | } |
503 | -#else | |
504 | - p_scb->retry_with_sco_only = true; | |
505 | - APPL_TRACE_API("Setting retry_with_sco_only to true"); | |
506 | -#endif | |
421 | + APPL_TRACE_API("%s: eSCO supported, retry_with_sco_only=%d", __func__, | |
422 | + p_scb->retry_with_sco_only); | |
507 | 423 | } |
508 | 424 | } else { |
509 | - if (p_scb->retry_with_sco_only) APPL_TRACE_API("retrying with SCO only"); | |
425 | + APPL_TRACE_API("%s: eSCO not supported, retry_with_sco_only=%d", __func__, | |
426 | + p_scb->retry_with_sco_only); | |
510 | 427 | p_scb->retry_with_sco_only = false; |
511 | - | |
512 | - BTM_SetEScoMode(BTM_LINK_TYPE_SCO, ¶ms); | |
428 | + BTM_SetEScoMode(¶ms); | |
513 | 429 | } |
514 | 430 | |
515 | 431 | bta_ag_cb.sco.p_curr_scb = p_scb; |
516 | 432 | |
433 | + /* save the current codec as sco_codec can be updated while SCO is open. */ | |
434 | + p_scb->inuse_codec = esco_codec; | |
435 | + | |
517 | 436 | /* tell sys to stop av if any */ |
518 | 437 | bta_sys_sco_use(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr); |
519 | 438 | |
520 | -#if (BTM_WBS_INCLUDED == TRUE) | |
521 | - /* Allow any platform specific pre-SCO set up to take place */ | |
522 | - bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, | |
523 | - SCO_STATE_SETUP, esco_codec); | |
524 | - | |
525 | - /* This setting may not be necessary */ | |
526 | - /* To be verified with stable 2049 boards */ | |
527 | - if (esco_codec == BTA_AG_CODEC_MSBC) | |
528 | - BTM_WriteVoiceSettings(BTM_VOICE_SETTING_TRANS); | |
529 | - else | |
530 | - BTM_WriteVoiceSettings(BTM_VOICE_SETTING_CVSD); | |
531 | - /* save the current codec because sco_codec can be updated while SCO is | |
532 | - * open. */ | |
533 | - p_scb->inuse_codec = esco_codec; | |
534 | -#else | |
535 | - /* Allow any platform specific pre-SCO set up to take place */ | |
536 | - bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, | |
537 | - SCO_STATE_SETUP); | |
538 | -#endif | |
439 | + /* Send pending commands to create SCO connection to peer */ | |
440 | + bta_ag_create_pending_sco(p_scb, bta_ag_cb.sco.is_local); | |
441 | + } else { | |
442 | + /* Not initiating, go to listen mode */ | |
443 | + uint8_t* p_bd_addr = NULL; | |
444 | + p_scb->retry_with_sco_only = false; | |
445 | + p_bd_addr = p_scb->peer_addr; | |
539 | 446 | |
540 | -#if (BTM_SCO_HCI_INCLUDED == TRUE) | |
541 | -#if (BTM_WBS_INCLUDED == TRUE) | |
542 | - if (esco_codec == BTA_AG_CODEC_MSBC) | |
543 | - pcm_sample_rate = BTA_DM_SCO_SAMP_RATE_16K; | |
544 | - else | |
545 | -#endif | |
546 | - pcm_sample_rate = BTA_DM_SCO_SAMP_RATE_8K; | |
447 | + tBTM_STATUS status = | |
448 | + BTM_CreateSco(p_bd_addr, false, params.packet_types, &p_scb->sco_idx, | |
449 | + bta_ag_sco_conn_cback, bta_ag_sco_disc_cback); | |
450 | + if (status == BTM_CMD_STARTED) | |
451 | + BTM_RegForEScoEvts(p_scb->sco_idx, bta_ag_esco_connreq_cback); | |
547 | 452 | |
548 | - sco_route = bta_dm_sco_co_init(pcm_sample_rate, pcm_sample_rate, | |
549 | - &codec_info, p_scb->app_id); | |
550 | -#endif | |
453 | + APPL_TRACE_API("%s: orig %d, inx 0x%04x, status 0x%x, pkt types 0x%04x", | |
454 | + __func__, is_orig, p_scb->sco_idx, status, | |
455 | + params.packet_types); | |
456 | + } | |
457 | +} | |
458 | + | |
459 | +/******************************************************************************* | |
460 | + * | |
461 | + * Function bta_ag_create_pending_sco | |
462 | + * | |
463 | + * Description This Function is called after the pre-SCO vendor setup is | |
464 | + * done for the BTA to continue and send the HCI Commands for | |
465 | + * creating/accepting SCO connection with peer based on the | |
466 | + * is_local parameter. | |
467 | + * | |
468 | + * Returns void | |
469 | + * | |
470 | + ******************************************************************************/ | |
471 | +static void bta_ag_create_pending_sco(tBTA_AG_SCB* p_scb, bool is_local) { | |
472 | + tBTA_AG_PEER_CODEC esco_codec = p_scb->inuse_codec; | |
473 | + enh_esco_params_t params; | |
474 | + bta_ag_cb.sco.p_curr_scb = p_scb; | |
475 | + bta_ag_cb.sco.cur_idx = p_scb->sco_idx; | |
476 | + | |
477 | + /* Local device requested SCO connection to peer */ | |
478 | + if (is_local) { | |
479 | + if (esco_codec == BTA_AG_CODEC_MSBC) { | |
480 | + if (p_scb->codec_msbc_settings == BTA_AG_SCO_MSBC_SETTINGS_T2) { | |
481 | + params = esco_parameters_for_codec(ESCO_CODEC_MSBC_T2); | |
482 | + } else | |
483 | + params = esco_parameters_for_codec(ESCO_CODEC_MSBC_T1); | |
484 | + } else { | |
485 | + params = esco_parameters_for_codec(ESCO_CODEC_CVSD); | |
486 | + if ((!(p_scb->features & BTA_AG_FEAT_ESCO)) || | |
487 | + (!(p_scb->peer_features & BTA_AG_PEER_FEAT_ESCO))) { | |
488 | + params.max_latency_ms = 10; | |
489 | + params.retransmission_effort = ESCO_RETRANSMISSION_POWER; | |
490 | + } | |
491 | + } | |
492 | + | |
493 | + /* Bypass voice settings if enhanced SCO setup command is supported */ | |
494 | + if (!(controller_get_interface() | |
495 | + ->supports_enhanced_setup_synchronous_connection())) { | |
496 | + if (esco_codec == BTA_AG_CODEC_MSBC) | |
497 | + BTM_WriteVoiceSettings(BTM_VOICE_SETTING_TRANS); | |
498 | + else | |
499 | + BTM_WriteVoiceSettings(BTM_VOICE_SETTING_CVSD); | |
500 | + } | |
551 | 501 | |
552 | 502 | #if (BTM_SCO_HCI_INCLUDED == TRUE) |
553 | - /* initialize SCO setup, no voice setting for AG, data rate <==> sample rate | |
554 | - */ | |
555 | - BTM_ConfigScoPath(sco_route, bta_ag_sco_read_cback, NULL, true); | |
503 | + /* initialize SCO setup, no voice setting for AG, data rate <==> sample | |
504 | + * rate */ | |
505 | + BTM_ConfigScoPath(params.input_data_path, bta_ag_sco_read_cback, NULL, | |
506 | + TRUE); | |
556 | 507 | #endif |
557 | - bta_ag_cb.sco.cur_idx = p_scb->sco_idx; | |
558 | - } else | |
559 | - p_scb->retry_with_sco_only = false; | |
560 | - | |
561 | - p_bd_addr = p_scb->peer_addr; | |
562 | 508 | |
563 | - status = | |
564 | - BTM_CreateSco(p_bd_addr, is_orig, params.packet_types, &p_scb->sco_idx, | |
565 | - bta_ag_sco_conn_cback, bta_ag_sco_disc_cback); | |
566 | - if (status == BTM_CMD_STARTED) { | |
567 | - if (!is_orig) { | |
568 | - BTM_RegForEScoEvts(p_scb->sco_idx, bta_ag_esco_connreq_cback); | |
569 | - } else /* Initiating the connection, set the current sco handle */ | |
570 | - { | |
509 | + tBTM_STATUS status = BTM_CreateSco( | |
510 | + p_scb->peer_addr, true, params.packet_types, &p_scb->sco_idx, | |
511 | + bta_ag_sco_conn_cback, bta_ag_sco_disc_cback); | |
512 | + if (status == BTM_CMD_STARTED) { | |
513 | + /* Initiating the connection, set the current sco handle */ | |
571 | 514 | bta_ag_cb.sco.cur_idx = p_scb->sco_idx; |
572 | 515 | } |
573 | - } | |
516 | + } else { | |
517 | + /* Local device accepted SCO connection from peer */ | |
518 | + params = esco_parameters_for_codec(ESCO_CODEC_CVSD); | |
519 | + if ((!(p_scb->features & BTA_AG_FEAT_ESCO)) || | |
520 | + (!(p_scb->peer_features & BTA_AG_PEER_FEAT_ESCO))) { | |
521 | + params.max_latency_ms = 10; | |
522 | + params.retransmission_effort = ESCO_RETRANSMISSION_POWER; | |
523 | + } | |
574 | 524 | |
575 | - APPL_TRACE_API( | |
576 | - "ag create sco: orig %d, inx 0x%04x, status 0x%x, pkt types 0x%04x", | |
577 | - is_orig, p_scb->sco_idx, status, params.packet_types); | |
525 | + BTM_EScoConnRsp(p_scb->sco_idx, HCI_SUCCESS, ¶ms); | |
526 | + } | |
578 | 527 | } |
579 | 528 | |
580 | -#if (BTM_WBS_INCLUDED == TRUE) | |
581 | 529 | /******************************************************************************* |
582 | 530 | * |
583 | 531 | * Function bta_ag_attempt_msbc_safe_settings |
@@ -608,6 +556,7 @@ bool bta_ag_attempt_msbc_safe_settings(tBTA_AG_SCB* p_scb) { | ||
608 | 556 | * |
609 | 557 | ******************************************************************************/ |
610 | 558 | static void bta_ag_codec_negotiation_timer_cback(void* data) { |
559 | + APPL_TRACE_DEBUG("%s", __func__); | |
611 | 560 | tBTA_AG_SCB* p_scb = (tBTA_AG_SCB*)data; |
612 | 561 | |
613 | 562 | /* Announce that codec negotiation failed. */ |
@@ -628,12 +577,12 @@ static void bta_ag_codec_negotiation_timer_cback(void* data) { | ||
628 | 577 | * |
629 | 578 | ******************************************************************************/ |
630 | 579 | void bta_ag_codec_negotiate(tBTA_AG_SCB* p_scb) { |
580 | + APPL_TRACE_DEBUG("%s", __func__); | |
631 | 581 | bta_ag_cb.sco.p_curr_scb = p_scb; |
632 | 582 | |
633 | - if ((p_scb->codec_updated || p_scb->codec_fallback || | |
634 | - bta_ag_attempt_msbc_safe_settings(p_scb)) && | |
583 | + if ((p_scb->codec_updated || p_scb->codec_fallback) && | |
635 | 584 | (p_scb->peer_features & BTA_AG_PEER_FEAT_CODEC)) { |
636 | - /* Change the power mode to Active until sco open is completed. */ | |
585 | + /* Change the power mode to Active until SCO open is completed. */ | |
637 | 586 | bta_sys_busy(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr); |
638 | 587 | |
639 | 588 | /* Send +BCS to the peer */ |
@@ -651,7 +600,6 @@ void bta_ag_codec_negotiate(tBTA_AG_SCB* p_scb) { | ||
651 | 600 | bta_ag_sco_codec_nego(p_scb, true); |
652 | 601 | } |
653 | 602 | } |
654 | -#endif /* (BTM_WBS_INCLUDED == TRUE) */ | |
655 | 603 | |
656 | 604 | /******************************************************************************* |
657 | 605 | * |
@@ -665,22 +613,24 @@ void bta_ag_codec_negotiate(tBTA_AG_SCB* p_scb) { | ||
665 | 613 | ******************************************************************************/ |
666 | 614 | static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) { |
667 | 615 | tBTA_AG_SCO_CB* p_sco = &bta_ag_cb.sco; |
668 | -#if (BTM_WBS_INCLUDED == TRUE) | |
669 | - tBTA_AG_SCB* p_cn_scb = NULL; /* For codec negotiation */ | |
670 | -#endif | |
671 | 616 | #if (BTM_SCO_HCI_INCLUDED == TRUE) |
672 | 617 | BT_HDR* p_buf; |
673 | 618 | #endif |
619 | + | |
674 | 620 | #if (BTA_AG_SCO_DEBUG == TRUE) |
675 | 621 | uint8_t in_state = p_sco->state; |
676 | 622 | |
677 | - APPL_TRACE_EVENT("BTA ag sco evt (hdl 0x%04x): State %d (%s), Event %d (%s)", | |
678 | - p_scb->sco_idx, p_sco->state, | |
679 | - bta_ag_sco_state_str(p_sco->state), event, | |
680 | - bta_ag_sco_evt_str(event)); | |
623 | + if (event != BTA_AG_SCO_CI_DATA_E) { | |
624 | + APPL_TRACE_EVENT("%s: SCO Index 0x%04x, State %d (%s), Event %d (%s)", | |
625 | + __func__, p_scb->sco_idx, p_sco->state, | |
626 | + bta_ag_sco_state_str(p_sco->state), event, | |
627 | + bta_ag_sco_evt_str(event)); | |
628 | + } | |
681 | 629 | #else |
682 | - APPL_TRACE_EVENT("BTA ag sco evt (hdl 0x%04x): State %d, Event %d", | |
683 | - p_scb->sco_idx, p_sco->state, event); | |
630 | + if (event != BTA_AG_SCO_CI_DATA_E) { | |
631 | + APPL_TRACE_EVENT("%s: SCO Index 0x%04x, State %d, Event %d", __func__, | |
632 | + p_scb->sco_idx, p_sco->state, event); | |
633 | + } | |
684 | 634 | #endif |
685 | 635 | |
686 | 636 | #if (BTM_SCO_HCI_INCLUDED == TRUE) |
@@ -710,8 +660,8 @@ static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) { | ||
710 | 660 | break; |
711 | 661 | |
712 | 662 | default: |
713 | - APPL_TRACE_WARNING("BTA_AG_SCO_SHUTDOWN_ST: Ignoring event %d", | |
714 | - event); | |
663 | + APPL_TRACE_WARNING("%s: BTA_AG_SCO_SHUTDOWN_ST: Ignoring event %d", | |
664 | + __func__, event); | |
715 | 665 | break; |
716 | 666 | } |
717 | 667 | break; |
@@ -727,15 +677,9 @@ static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) { | ||
727 | 677 | /* remove listening connection */ |
728 | 678 | bta_ag_remove_sco(p_scb, false); |
729 | 679 | |
730 | -#if (BTM_WBS_INCLUDED == TRUE) | |
731 | 680 | /* start codec negotiation */ |
732 | 681 | p_sco->state = BTA_AG_SCO_CODEC_ST; |
733 | - p_cn_scb = p_scb; | |
734 | -#else | |
735 | - /* create sco connection to peer */ | |
736 | - bta_ag_create_sco(p_scb, true); | |
737 | - p_sco->state = BTA_AG_SCO_OPENING_ST; | |
738 | -#endif | |
682 | + bta_ag_codec_negotiate(p_scb); | |
739 | 683 | break; |
740 | 684 | |
741 | 685 | case BTA_AG_SCO_SHUTDOWN_E: |
@@ -752,9 +696,10 @@ static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) { | ||
752 | 696 | |
753 | 697 | case BTA_AG_SCO_CLOSE_E: |
754 | 698 | /* remove listening connection */ |
755 | - /* Ignore the event. We need to keep listening SCO for the active SLC | |
699 | + /* Ignore the event. Keep listening SCO for the active SLC | |
756 | 700 | */ |
757 | - APPL_TRACE_WARNING("BTA_AG_SCO_LISTEN_ST: Ignoring event %d", event); | |
701 | + APPL_TRACE_WARNING("%s: BTA_AG_SCO_LISTEN_ST: Ignoring event %d", | |
702 | + __func__, event); | |
758 | 703 | break; |
759 | 704 | |
760 | 705 | case BTA_AG_SCO_CONN_CLOSE_E: |
@@ -764,12 +709,12 @@ static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) { | ||
764 | 709 | break; |
765 | 710 | |
766 | 711 | default: |
767 | - APPL_TRACE_WARNING("BTA_AG_SCO_LISTEN_ST: Ignoring event %d", event); | |
712 | + APPL_TRACE_WARNING("%s: BTA_AG_SCO_LISTEN_ST: Ignoring event %d", | |
713 | + __func__, event); | |
768 | 714 | break; |
769 | 715 | } |
770 | 716 | break; |
771 | 717 | |
772 | -#if (BTM_WBS_INCLUDED == TRUE) | |
773 | 718 | case BTA_AG_SCO_CODEC_ST: |
774 | 719 | switch (event) { |
775 | 720 | case BTA_AG_SCO_LISTEN_E: |
@@ -813,11 +758,11 @@ static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) { | ||
813 | 758 | break; |
814 | 759 | |
815 | 760 | default: |
816 | - APPL_TRACE_WARNING("BTA_AG_SCO_CODEC_ST: Ignoring event %d", event); | |
761 | + APPL_TRACE_WARNING("%s: BTA_AG_SCO_CODEC_ST: Ignoring event %d", | |
762 | + __func__, event); | |
817 | 763 | break; |
818 | 764 | } |
819 | 765 | break; |
820 | -#endif | |
821 | 766 | |
822 | 767 | case BTA_AG_SCO_OPENING_ST: |
823 | 768 | switch (event) { |
@@ -829,13 +774,11 @@ static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) { | ||
829 | 774 | } |
830 | 775 | break; |
831 | 776 | |
832 | -#if (BTM_WBS_INCLUDED == TRUE) | |
833 | 777 | case BTA_AG_SCO_REOPEN_E: |
834 | 778 | /* start codec negotiation */ |
835 | 779 | p_sco->state = BTA_AG_SCO_CODEC_ST; |
836 | - p_cn_scb = p_scb; | |
780 | + bta_ag_codec_negotiate(p_scb); | |
837 | 781 | break; |
838 | -#endif | |
839 | 782 | |
840 | 783 | case BTA_AG_SCO_XFER_E: |
841 | 784 | /* save xfer scb */ |
@@ -868,7 +811,8 @@ static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) { | ||
868 | 811 | break; |
869 | 812 | |
870 | 813 | default: |
871 | - APPL_TRACE_WARNING("BTA_AG_SCO_OPENING_ST: Ignoring event %d", event); | |
814 | + APPL_TRACE_WARNING("%s: BTA_AG_SCO_OPENING_ST: Ignoring event %d", | |
815 | + __func__, event); | |
872 | 816 | break; |
873 | 817 | } |
874 | 818 | break; |
@@ -910,7 +854,8 @@ static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) { | ||
910 | 854 | break; |
911 | 855 | |
912 | 856 | default: |
913 | - APPL_TRACE_WARNING("BTA_AG_SCO_OPEN_CL_ST: Ignoring event %d", event); | |
857 | + APPL_TRACE_WARNING("%s: BTA_AG_SCO_OPEN_CL_ST: Ignoring event %d", | |
858 | + __func__, event); | |
914 | 859 | break; |
915 | 860 | } |
916 | 861 | break; |
@@ -945,8 +890,8 @@ static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) { | ||
945 | 890 | break; |
946 | 891 | |
947 | 892 | default: |
948 | - APPL_TRACE_WARNING("BTA_AG_SCO_OPEN_XFER_ST: Ignoring event %d", | |
949 | - event); | |
893 | + APPL_TRACE_WARNING("%s: BTA_AG_SCO_OPEN_XFER_ST: Ignoring event %d", | |
894 | + __func__, event); | |
950 | 895 | break; |
951 | 896 | } |
952 | 897 | break; |
@@ -995,7 +940,8 @@ static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) { | ||
995 | 940 | break; |
996 | 941 | |
997 | 942 | default: |
998 | - APPL_TRACE_WARNING("BTA_AG_SCO_OPEN_ST: Ignoring event %d", event); | |
943 | + APPL_TRACE_WARNING("%s: BTA_AG_SCO_OPEN_ST: Ignoring event %d", | |
944 | + __func__, event); | |
999 | 945 | break; |
1000 | 946 | } |
1001 | 947 | break; |
@@ -1038,7 +984,8 @@ static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) { | ||
1038 | 984 | break; |
1039 | 985 | |
1040 | 986 | default: |
1041 | - APPL_TRACE_WARNING("BTA_AG_SCO_CLOSING_ST: Ignoring event %d", event); | |
987 | + APPL_TRACE_WARNING("%s: BTA_AG_SCO_CLOSING_ST: Ignoring event %d", | |
988 | + __func__, event); | |
1042 | 989 | break; |
1043 | 990 | } |
1044 | 991 | break; |
@@ -1054,15 +1001,9 @@ static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) { | ||
1054 | 1001 | break; |
1055 | 1002 | |
1056 | 1003 | case BTA_AG_SCO_CONN_CLOSE_E: |
1057 | -#if (BTM_WBS_INCLUDED == TRUE) | |
1058 | 1004 | /* start codec negotiation */ |
1059 | 1005 | p_sco->state = BTA_AG_SCO_CODEC_ST; |
1060 | - p_cn_scb = p_scb; | |
1061 | -#else | |
1062 | - /* open sco connection */ | |
1063 | - bta_ag_create_sco(p_scb, true); | |
1064 | - p_sco->state = BTA_AG_SCO_OPENING_ST; | |
1065 | -#endif | |
1006 | + bta_ag_codec_negotiate(p_scb); | |
1066 | 1007 | break; |
1067 | 1008 | |
1068 | 1009 | case BTA_AG_SCO_LISTEN_E: |
@@ -1073,8 +1014,8 @@ static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) { | ||
1073 | 1014 | break; |
1074 | 1015 | |
1075 | 1016 | default: |
1076 | - APPL_TRACE_WARNING("BTA_AG_SCO_CLOSE_OP_ST: Ignoring event %d", | |
1077 | - event); | |
1017 | + APPL_TRACE_WARNING("%s: BTA_AG_SCO_CLOSE_OP_ST: Ignoring event %d", | |
1018 | + __func__, event); | |
1078 | 1019 | break; |
1079 | 1020 | } |
1080 | 1021 | break; |
@@ -1101,29 +1042,24 @@ static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) { | ||
1101 | 1042 | p_sco->state = BTA_AG_SCO_SHUTTING_ST; |
1102 | 1043 | break; |
1103 | 1044 | |
1104 | - case BTA_AG_SCO_CONN_CLOSE_E: | |
1045 | + case BTA_AG_SCO_CONN_CLOSE_E: { | |
1105 | 1046 | /* closed sco; place old sco in listen mode, |
1106 | 1047 | take current sco out of listen, and |
1107 | 1048 | create originating sco for current */ |
1108 | 1049 | bta_ag_create_sco(p_scb, false); |
1109 | 1050 | bta_ag_remove_sco(p_sco->p_xfer_scb, false); |
1110 | 1051 | |
1111 | -#if (BTM_WBS_INCLUDED == TRUE) | |
1112 | 1052 | /* start codec negotiation */ |
1113 | 1053 | p_sco->state = BTA_AG_SCO_CODEC_ST; |
1114 | - p_cn_scb = p_sco->p_xfer_scb; | |
1054 | + tBTA_AG_SCB* p_cn_scb = p_sco->p_xfer_scb; | |
1115 | 1055 | p_sco->p_xfer_scb = NULL; |
1116 | -#else | |
1117 | - /* create sco connection to peer */ | |
1118 | - bta_ag_create_sco(p_sco->p_xfer_scb, true); | |
1119 | - p_sco->p_xfer_scb = NULL; | |
1120 | - p_sco->state = BTA_AG_SCO_OPENING_ST; | |
1121 | -#endif | |
1056 | + bta_ag_codec_negotiate(p_cn_scb); | |
1122 | 1057 | break; |
1058 | + } | |
1123 | 1059 | |
1124 | 1060 | default: |
1125 | - APPL_TRACE_WARNING("BTA_AG_SCO_CLOSE_XFER_ST: Ignoring event %d", | |
1126 | - event); | |
1061 | + APPL_TRACE_WARNING("%s: BTA_AG_SCO_CLOSE_XFER_ST: Ignoring event %d", | |
1062 | + __func__, event); | |
1127 | 1063 | break; |
1128 | 1064 | } |
1129 | 1065 | break; |
@@ -1179,8 +1115,8 @@ static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) { | ||
1179 | 1115 | break; |
1180 | 1116 | |
1181 | 1117 | default: |
1182 | - APPL_TRACE_WARNING("BTA_AG_SCO_SHUTTING_ST: Ignoring event %d", | |
1183 | - event); | |
1118 | + APPL_TRACE_WARNING("%s: BTA_AG_SCO_SHUTTING_ST: Ignoring event %d", | |
1119 | + __func__, event); | |
1184 | 1120 | break; |
1185 | 1121 | } |
1186 | 1122 | break; |
@@ -1196,12 +1132,6 @@ static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) { | ||
1196 | 1132 | bta_ag_sco_evt_str(event)); |
1197 | 1133 | } |
1198 | 1134 | #endif |
1199 | - | |
1200 | -#if (BTM_WBS_INCLUDED == TRUE) | |
1201 | - if (p_cn_scb) { | |
1202 | - bta_ag_codec_negotiate(p_cn_scb); | |
1203 | - } | |
1204 | -#endif | |
1205 | 1135 | } |
1206 | 1136 | |
1207 | 1137 | /******************************************************************************* |
@@ -1286,27 +1216,21 @@ void bta_ag_sco_open(tBTA_AG_SCB* p_scb, UNUSED_ATTR tBTA_AG_DATA* p_data) { | ||
1286 | 1216 | ******************************************************************************/ |
1287 | 1217 | void bta_ag_sco_close(tBTA_AG_SCB* p_scb, UNUSED_ATTR tBTA_AG_DATA* p_data) { |
1288 | 1218 | /* if scb is in use */ |
1289 | -#if (BTM_WBS_INCLUDED == TRUE) | |
1290 | - /* sco_idx is not allocated in SCO_CODEC_ST, we still need to move to | |
1291 | - * listening state. */ | |
1219 | + /* sco_idx is not allocated in SCO_CODEC_ST, still need to move to listen | |
1220 | + * state. */ | |
1292 | 1221 | if ((p_scb->sco_idx != BTM_INVALID_SCO_INDEX) || |
1293 | 1222 | (bta_ag_cb.sco.state == BTA_AG_SCO_CODEC_ST)) |
1294 | -#else | |
1295 | - if (p_scb->sco_idx != BTM_INVALID_SCO_INDEX) | |
1296 | -#endif | |
1297 | 1223 | { |
1298 | 1224 | APPL_TRACE_DEBUG("bta_ag_sco_close: sco_inx = %d", p_scb->sco_idx); |
1299 | 1225 | bta_ag_sco_event(p_scb, BTA_AG_SCO_CLOSE_E); |
1300 | 1226 | } |
1301 | 1227 | } |
1302 | 1228 | |
1303 | -#if (BTM_WBS_INCLUDED == TRUE) | |
1304 | - | |
1305 | 1229 | /******************************************************************************* |
1306 | 1230 | * |
1307 | 1231 | * Function bta_ag_sco_codec_nego |
1308 | 1232 | * |
1309 | - * Description | |
1233 | + * Description Handles result of eSCO codec negotiation | |
1310 | 1234 | * |
1311 | 1235 | * |
1312 | 1236 | * Returns void |
@@ -1314,14 +1238,17 @@ void bta_ag_sco_close(tBTA_AG_SCB* p_scb, UNUSED_ATTR tBTA_AG_DATA* p_data) { | ||
1314 | 1238 | ******************************************************************************/ |
1315 | 1239 | void bta_ag_sco_codec_nego(tBTA_AG_SCB* p_scb, bool result) { |
1316 | 1240 | if (result == true) { |
1317 | - /* Subsequent sco connection will skip codec negotiation */ | |
1241 | + /* Subsequent SCO connection will skip codec negotiation */ | |
1242 | + APPL_TRACE_DEBUG("%s: Succeeded for index 0x%04x", __func__, | |
1243 | + p_scb->sco_idx); | |
1318 | 1244 | p_scb->codec_updated = false; |
1319 | - | |
1320 | 1245 | bta_ag_sco_event(p_scb, BTA_AG_SCO_CN_DONE_E); |
1321 | - } else /* codec negotiation failed */ | |
1246 | + } else { | |
1247 | + /* codec negotiation failed */ | |
1248 | + APPL_TRACE_ERROR("%s: Failed for index 0x%04x", __func__, p_scb->sco_idx); | |
1322 | 1249 | bta_ag_sco_event(p_scb, BTA_AG_SCO_CLOSE_E); |
1250 | + } | |
1323 | 1251 | } |
1324 | -#endif | |
1325 | 1252 | |
1326 | 1253 | /******************************************************************************* |
1327 | 1254 | * |
@@ -1353,13 +1280,6 @@ void bta_ag_sco_conn_open(tBTA_AG_SCB* p_scb, | ||
1353 | 1280 | |
1354 | 1281 | bta_sys_sco_open(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr); |
1355 | 1282 | |
1356 | -#if (BTM_WBS_INCLUDED == TRUE) | |
1357 | - bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, SCO_STATE_ON, | |
1358 | - p_scb->inuse_codec); | |
1359 | -#else | |
1360 | - bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, SCO_STATE_ON); | |
1361 | -#endif | |
1362 | - | |
1363 | 1283 | #if (BTM_SCO_HCI_INCLUDED == TRUE) |
1364 | 1284 | /* open SCO codec if SCO is routed through transport */ |
1365 | 1285 | bta_dm_sco_co_open(bta_ag_scb_to_idx(p_scb), BTA_SCO_OUT_PKT_SIZE, |
@@ -1370,10 +1290,8 @@ void bta_ag_sco_conn_open(tBTA_AG_SCB* p_scb, | ||
1370 | 1290 | bta_ag_cback_sco(p_scb, BTA_AG_AUDIO_OPEN_EVT); |
1371 | 1291 | |
1372 | 1292 | p_scb->retry_with_sco_only = false; |
1373 | -#if (BTM_WBS_INCLUDED == TRUE) | |
1374 | 1293 | /* reset to mSBC T2 settings as the preferred */ |
1375 | 1294 | p_scb->codec_msbc_settings = BTA_AG_SCO_MSBC_SETTINGS_T2; |
1376 | -#endif | |
1377 | 1295 | } |
1378 | 1296 | |
1379 | 1297 | /******************************************************************************* |
@@ -1388,13 +1306,10 @@ void bta_ag_sco_conn_open(tBTA_AG_SCB* p_scb, | ||
1388 | 1306 | ******************************************************************************/ |
1389 | 1307 | void bta_ag_sco_conn_close(tBTA_AG_SCB* p_scb, |
1390 | 1308 | UNUSED_ATTR tBTA_AG_DATA* p_data) { |
1391 | - uint16_t handle = bta_ag_scb_to_idx(p_scb); | |
1392 | - | |
1393 | 1309 | /* clear current scb */ |
1394 | 1310 | bta_ag_cb.sco.p_curr_scb = NULL; |
1395 | 1311 | p_scb->sco_idx = BTM_INVALID_SCO_INDEX; |
1396 | 1312 | |
1397 | -#if (BTM_WBS_INCLUDED == TRUE) | |
1398 | 1313 | /* codec_fallback is set when AG is initiator and connection failed for mSBC. |
1399 | 1314 | */ |
1400 | 1315 | /* OR if codec is msbc and T2 settings failed, then retry Safe T1 settings */ |
@@ -1406,23 +1321,8 @@ void bta_ag_sco_conn_close(tBTA_AG_SCB* p_scb, | ||
1406 | 1321 | * eSCO */ |
1407 | 1322 | bta_ag_create_sco(p_scb, true); |
1408 | 1323 | } |
1409 | -#else | |
1410 | - /* retry_with_sco_only, will be set only when AG is initiator | |
1411 | - ** and AG is first trying to establish an eSCO connection */ | |
1412 | - if (p_scb->retry_with_sco_only && p_scb->svc_conn) { | |
1413 | - bta_ag_create_sco(p_scb, true); | |
1414 | - } | |
1415 | -#endif | |
1416 | 1324 | else { |
1417 | - sco_state_t sco_state = | |
1418 | - bta_ag_cb.sco.p_xfer_scb ? SCO_STATE_OFF_TRANSFER : SCO_STATE_OFF; | |
1419 | -#if (BTM_WBS_INCLUDED == TRUE) | |
1420 | - /* Indicate if the closing of audio is because of transfer */ | |
1421 | - bta_ag_co_audio_state(handle, p_scb->app_id, sco_state, p_scb->inuse_codec); | |
1422 | -#else | |
1423 | 1325 | /* Indicate if the closing of audio is because of transfer */ |
1424 | - bta_ag_co_audio_state(handle, p_scb->app_id, sco_state); | |
1425 | -#endif | |
1426 | 1326 | bta_ag_sco_event(p_scb, BTA_AG_SCO_CONN_CLOSE_E); |
1427 | 1327 | |
1428 | 1328 | bta_sys_sco_close(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr); |
@@ -1437,9 +1337,7 @@ void bta_ag_sco_conn_close(tBTA_AG_SCB* p_scb, | ||
1437 | 1337 | |
1438 | 1338 | /* call app callback */ |
1439 | 1339 | bta_ag_cback_sco(p_scb, BTA_AG_AUDIO_CLOSE_EVT); |
1440 | -#if (BTM_WBS_INCLUDED == TRUE) | |
1441 | 1340 | p_scb->codec_msbc_settings = BTA_AG_SCO_MSBC_SETTINGS_T2; |
1442 | -#endif | |
1443 | 1341 | } |
1444 | 1342 | p_scb->retry_with_sco_only = false; |
1445 | 1343 | } |
@@ -1456,71 +1354,29 @@ void bta_ag_sco_conn_close(tBTA_AG_SCB* p_scb, | ||
1456 | 1354 | ******************************************************************************/ |
1457 | 1355 | void bta_ag_sco_conn_rsp(tBTA_AG_SCB* p_scb, |
1458 | 1356 | tBTM_ESCO_CONN_REQ_EVT_DATA* p_data) { |
1459 | - tBTM_ESCO_PARAMS resp; | |
1460 | - uint8_t hci_status = HCI_SUCCESS; | |
1461 | -#if (BTM_SCO_HCI_INCLUDED == TRUE) | |
1462 | - tBTA_CODEC_INFO codec_info = {BTA_SCO_CODEC_PCM}; | |
1463 | - uint32_t pcm_sample_rate; | |
1464 | -#endif | |
1357 | + bta_ag_cb.sco.is_local = false; | |
1358 | + | |
1359 | + APPL_TRACE_DEBUG("%s: eSCO %d, state %d", __func__, | |
1360 | + controller_get_interface() | |
1361 | + ->supports_enhanced_setup_synchronous_connection(), | |
1362 | + bta_ag_cb.sco.state); | |
1465 | 1363 | |
1466 | 1364 | if (bta_ag_cb.sco.state == BTA_AG_SCO_LISTEN_ST || |
1467 | 1365 | bta_ag_cb.sco.state == BTA_AG_SCO_CLOSE_XFER_ST || |
1468 | 1366 | bta_ag_cb.sco.state == BTA_AG_SCO_OPEN_XFER_ST) { |
1469 | - /* If script overrided sco parameter by BTA_CMD_SET_ESCO_PARAM */ | |
1470 | - if (bta_ag_cb.sco.param_updated) { | |
1471 | - resp = bta_ag_cb.sco.params; | |
1472 | - } else { | |
1473 | - resp.rx_bw = BTM_64KBITS_RATE; | |
1474 | - resp.tx_bw = BTM_64KBITS_RATE; | |
1475 | - resp.max_latency = 12; | |
1476 | - resp.voice_contfmt = 0x60; | |
1477 | - resp.retrans_effort = BTM_ESCO_RETRANS_QUALITY; | |
1478 | - | |
1479 | - if (p_data->link_type == BTM_LINK_TYPE_SCO) { | |
1480 | - resp.packet_types = | |
1481 | - (BTM_SCO_LINK_ONLY_MASK | BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 | | |
1482 | - BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 | BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | | |
1483 | - BTM_SCO_PKT_TYPES_MASK_NO_3_EV5); | |
1484 | - } else /* Allow controller to use all types available except 5-slot EDR */ | |
1485 | - { | |
1486 | - resp.packet_types = | |
1487 | - (BTM_SCO_LINK_ALL_PKT_MASK | BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | | |
1488 | - BTM_SCO_PKT_TYPES_MASK_NO_3_EV5); | |
1489 | - } | |
1490 | - } | |
1491 | - | |
1492 | 1367 | /* tell sys to stop av if any */ |
1493 | 1368 | bta_sys_sco_use(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr); |
1494 | - | |
1495 | -#if (BTM_WBS_INCLUDED == FALSE) | |
1496 | - /* Allow any platform specific pre-SCO set up to take place */ | |
1497 | - bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, | |
1498 | - SCO_STATE_SETUP); | |
1499 | -#else | |
1500 | 1369 | /* When HS initiated SCO, it cannot be WBS. */ |
1501 | - /* Allow any platform specific pre-SCO set up to take place */ | |
1502 | - bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, | |
1503 | - SCO_STATE_SETUP, BTA_AG_CODEC_CVSD); | |
1504 | -#endif | |
1505 | - | |
1506 | 1370 | #if (BTM_SCO_HCI_INCLUDED == TRUE) |
1507 | - pcm_sample_rate = BTA_DM_SCO_SAMP_RATE_8K; | |
1508 | - | |
1509 | - /* initialize SCO setup, no voice setting for AG, data rate <==> sample rate | |
1510 | - */ | |
1511 | - BTM_ConfigScoPath(bta_dm_sco_co_init(pcm_sample_rate, pcm_sample_rate, | |
1512 | - &codec_info, p_scb->app_id), | |
1513 | - bta_ag_sco_read_cback, NULL, true); | |
1371 | + /* Configure the transport being used */ | |
1372 | + BTM_ConfigScoPath(resp.input_data_path, bta_ag_sco_read_cback, NULL, TRUE); | |
1514 | 1373 | #endif |
1515 | - } else | |
1516 | - hci_status = HCI_ERR_HOST_REJECT_DEVICE; | |
1374 | + } | |
1517 | 1375 | |
1518 | -#if (BTM_WBS_INCLUDED == TRUE) | |
1519 | 1376 | /* If SCO open was initiated from HS, it must be CVSD */ |
1520 | 1377 | p_scb->inuse_codec = BTA_AG_CODEC_NONE; |
1521 | -#endif | |
1522 | - | |
1523 | - BTM_EScoConnRsp(p_data->sco_inx, hci_status, &resp); | |
1378 | + /* Send pending commands to create SCO connection to peer */ | |
1379 | + bta_ag_create_pending_sco(p_scb, bta_ag_cb.sco.is_local); | |
1524 | 1380 | } |
1525 | 1381 | |
1526 | 1382 | /******************************************************************************* |
@@ -1541,29 +1397,6 @@ void bta_ag_ci_sco_data(UNUSED_ATTR tBTA_AG_SCB* p_scb, | ||
1541 | 1397 | } |
1542 | 1398 | |
1543 | 1399 | /******************************************************************************* |
1544 | - * | |
1545 | - * Function bta_ag_set_esco_param | |
1546 | - * | |
1547 | - * Description Update esco parameters from script wrapper. | |
1548 | - * | |
1549 | - * | |
1550 | - * Returns void | |
1551 | - * | |
1552 | - ******************************************************************************/ | |
1553 | -void bta_ag_set_esco_param(bool set_reset, tBTM_ESCO_PARAMS* param) { | |
1554 | - if (set_reset == false) /* reset the parameters to default */ | |
1555 | - { | |
1556 | - bta_ag_cb.sco.param_updated = false; | |
1557 | - APPL_TRACE_DEBUG( | |
1558 | - "bta_ag_set_esco_param : Resetting ESCO parameters to default"); | |
1559 | - } else { | |
1560 | - bta_ag_cb.sco.param_updated = true; | |
1561 | - bta_ag_cb.sco.params = *param; | |
1562 | - APPL_TRACE_DEBUG("bta_ag_set_esco_param : Setting ESCO parameters"); | |
1563 | - } | |
1564 | -} | |
1565 | - | |
1566 | -/******************************************************************************* | |
1567 | 1400 | * Debugging functions |
1568 | 1401 | ******************************************************************************/ |
1569 | 1402 |
@@ -1576,12 +1409,10 @@ static char* bta_ag_sco_evt_str(uint8_t event) { | ||
1576 | 1409 | return "Open Request"; |
1577 | 1410 | case BTA_AG_SCO_XFER_E: |
1578 | 1411 | return "Transfer Request"; |
1579 | -#if (BTM_WBS_INCLUDED == TRUE) | |
1580 | 1412 | case BTA_AG_SCO_CN_DONE_E: |
1581 | 1413 | return "Codec Negotiation Done"; |
1582 | 1414 | case BTA_AG_SCO_REOPEN_E: |
1583 | 1415 | return "Reopen Request"; |
1584 | -#endif | |
1585 | 1416 | case BTA_AG_SCO_CLOSE_E: |
1586 | 1417 | return "Close Request"; |
1587 | 1418 | case BTA_AG_SCO_SHUTDOWN_E: |
@@ -1603,10 +1434,8 @@ static char* bta_ag_sco_state_str(uint8_t state) { | ||
1603 | 1434 | return "Shutdown"; |
1604 | 1435 | case BTA_AG_SCO_LISTEN_ST: |
1605 | 1436 | return "Listening"; |
1606 | -#if (BTM_WBS_INCLUDED == TRUE) | |
1607 | 1437 | case BTA_AG_SCO_CODEC_ST: |
1608 | 1438 | return "Codec Negotiation"; |
1609 | -#endif | |
1610 | 1439 | case BTA_AG_SCO_OPENING_ST: |
1611 | 1440 | return "Opening"; |
1612 | 1441 | case BTA_AG_SCO_OPEN_CL_ST: |
@@ -1628,4 +1457,4 @@ static char* bta_ag_sco_state_str(uint8_t state) { | ||
1628 | 1457 | } |
1629 | 1458 | } |
1630 | 1459 | |
1631 | -#endif | |
1460 | +#endif /* (BTA_AG_SCO_DEBUG) */ |
@@ -3920,11 +3920,11 @@ bool bta_dm_check_if_only_hd_connected(BD_ADDR peer_addr) { | ||
3920 | 3920 | !bdcmp(bta_dm_conn_srvcs.conn_srvc[j].peer_bdaddr, peer_addr)) { |
3921 | 3921 | APPL_TRACE_DEBUG("%s: Another profile (id=%d) is connected", __func__, |
3922 | 3922 | bta_dm_conn_srvcs.conn_srvc[j].id); |
3923 | - return FALSE; | |
3923 | + return false; | |
3924 | 3924 | } |
3925 | 3925 | } |
3926 | 3926 | |
3927 | - return TRUE; | |
3927 | + return true; | |
3928 | 3928 | } |
3929 | 3929 | |
3930 | 3930 | /******************************************************************************* |
@@ -20,50 +20,14 @@ | ||
20 | 20 | |
21 | 21 | #include "bt_trace.h" |
22 | 22 | #include "bt_utils.h" |
23 | +#include "bta_ag_api.h" | |
23 | 24 | #include "bta_hf_client_int.h" |
25 | +#include "device/include/esco_parameters.h" | |
24 | 26 | #include "osi/include/osi.h" |
25 | 27 | |
26 | -#define BTA_HF_CLIENT_NO_EDR_ESCO \ | |
27 | - (BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 | BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 | \ | |
28 | - BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | BTM_SCO_PKT_TYPES_MASK_NO_3_EV5) | |
29 | - | |
30 | -static const tBTM_ESCO_PARAMS bta_hf_client_esco_params[] = { | |
31 | - /* SCO CVSD */ | |
32 | - { | |
33 | - .rx_bw = BTM_64KBITS_RATE, | |
34 | - .tx_bw = BTM_64KBITS_RATE, | |
35 | - .max_latency = 10, | |
36 | - .voice_contfmt = BTM_VOICE_SETTING_CVSD, | |
37 | - .packet_types = | |
38 | - (BTM_SCO_LINK_ONLY_MASK | BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 | | |
39 | - BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 | BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | | |
40 | - BTM_SCO_PKT_TYPES_MASK_NO_3_EV5), | |
41 | - .retrans_effort = BTM_ESCO_RETRANS_POWER, | |
42 | - }, | |
43 | - /* ESCO CVSD */ | |
44 | - { | |
45 | - .rx_bw = BTM_64KBITS_RATE, | |
46 | - .tx_bw = BTM_64KBITS_RATE, | |
47 | - .max_latency = 10, | |
48 | - .voice_contfmt = BTM_VOICE_SETTING_CVSD, | |
49 | - /* Allow controller to use all types available except 5-slot EDR */ | |
50 | - .packet_types = | |
51 | - (BTM_SCO_LINK_ALL_PKT_MASK | BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | | |
52 | - BTM_SCO_PKT_TYPES_MASK_NO_3_EV5), | |
53 | - .retrans_effort = BTM_ESCO_RETRANS_POWER, | |
54 | - }, | |
55 | - /* ESCO mSBC */ | |
56 | - { | |
57 | - .rx_bw = BTM_64KBITS_RATE, | |
58 | - .tx_bw = BTM_64KBITS_RATE, | |
59 | - .max_latency = 13, | |
60 | - .voice_contfmt = BTM_VOICE_SETTING_TRANS, | |
61 | - /* Packet Types : EV3 + 2-EV3 */ | |
62 | - .packet_types = | |
63 | - (BTM_SCO_PKT_TYPES_MASK_EV3 | BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 | | |
64 | - BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | BTM_SCO_PKT_TYPES_MASK_NO_3_EV5), | |
65 | - .retrans_effort = BTM_ESCO_RETRANS_QUALITY, | |
66 | - }}; | |
28 | +#define BTA_HF_CLIENT_NO_EDR_ESCO \ | |
29 | + (ESCO_PKT_TYPES_MASK_NO_2_EV3 | ESCO_PKT_TYPES_MASK_NO_3_EV3 | \ | |
30 | + ESCO_PKT_TYPES_MASK_NO_2_EV5 | ESCO_PKT_TYPES_MASK_NO_3_EV5) | |
67 | 31 | |
68 | 32 | enum { |
69 | 33 | BTA_HF_CLIENT_SCO_LISTEN_E, |
@@ -138,16 +102,19 @@ void bta_hf_client_cback_sco(tBTA_HF_CLIENT_CB* client_cb, uint8_t event) { | ||
138 | 102 | ******************************************************************************/ |
139 | 103 | static void bta_hf_client_sco_conn_rsp(tBTA_HF_CLIENT_CB* client_cb, |
140 | 104 | tBTM_ESCO_CONN_REQ_EVT_DATA* p_data) { |
141 | - tBTM_ESCO_PARAMS resp; | |
105 | + enh_esco_params_t resp; | |
142 | 106 | uint8_t hci_status = HCI_SUCCESS; |
143 | 107 | |
144 | 108 | APPL_TRACE_DEBUG("%s", __func__); |
145 | 109 | |
146 | 110 | if (client_cb->sco_state == BTA_HF_CLIENT_SCO_LISTEN_ST) { |
147 | 111 | if (p_data->link_type == BTM_LINK_TYPE_SCO) { |
148 | - resp = bta_hf_client_esco_params[0]; | |
112 | + resp = esco_parameters_for_codec(ESCO_CODEC_CVSD); | |
149 | 113 | } else { |
150 | - resp = bta_hf_client_esco_params[client_cb->negotiated_codec]; | |
114 | + if (client_cb->negotiated_codec == BTA_AG_CODEC_CVSD) | |
115 | + resp = esco_parameters_for_codec(ESCO_CODEC_CVSD); | |
116 | + if (client_cb->negotiated_codec == BTA_AG_CODEC_MSBC) | |
117 | + resp = esco_parameters_for_codec(ESCO_CODEC_MSBC_T1); | |
151 | 118 | } |
152 | 119 | |
153 | 120 | /* tell sys to stop av if any */ |
@@ -255,7 +222,6 @@ static void bta_hf_client_sco_create(tBTA_HF_CLIENT_CB* client_cb, | ||
255 | 222 | bool is_orig) { |
256 | 223 | tBTM_STATUS status; |
257 | 224 | uint8_t* p_bd_addr = NULL; |
258 | - tBTM_ESCO_PARAMS params; | |
259 | 225 | |
260 | 226 | APPL_TRACE_DEBUG("%s: %d", __func__, is_orig); |
261 | 227 |
@@ -266,14 +232,14 @@ static void bta_hf_client_sco_create(tBTA_HF_CLIENT_CB* client_cb, | ||
266 | 232 | return; |
267 | 233 | } |
268 | 234 | |
269 | - params = bta_hf_client_esco_params[1]; | |
235 | + enh_esco_params_t params = esco_parameters_for_codec(ESCO_CODEC_MSBC_T1); | |
270 | 236 | |
271 | 237 | /* if initiating set current scb and peer bd addr */ |
272 | 238 | if (is_orig) { |
273 | 239 | /* Attempt to use eSCO if remote host supports HFP >= 1.5 */ |
274 | 240 | if (client_cb->peer_version >= HFP_VERSION_1_5 && |
275 | 241 | !client_cb->retry_with_sco_only) { |
276 | - BTM_SetEScoMode(BTM_LINK_TYPE_ESCO, ¶ms); | |
242 | + BTM_SetEScoMode(¶ms); | |
277 | 243 | /* If ESCO or EDR ESCO, retry with SCO only in case of failure */ |
278 | 244 | if ((params.packet_types & BTM_ESCO_LINK_ONLY_MASK) || |
279 | 245 | !((params.packet_types & |
@@ -287,7 +253,7 @@ static void bta_hf_client_sco_create(tBTA_HF_CLIENT_CB* client_cb, | ||
287 | 253 | APPL_TRACE_API("retrying with SCO only"); |
288 | 254 | client_cb->retry_with_sco_only = false; |
289 | 255 | |
290 | - BTM_SetEScoMode(BTM_LINK_TYPE_SCO, ¶ms); | |
256 | + BTM_SetEScoMode(¶ms); | |
291 | 257 | } |
292 | 258 | |
293 | 259 | /* tell sys to stop av if any */ |
@@ -165,7 +165,6 @@ typedef uint16_t tBTA_AG_PEER_FEAT; | ||
165 | 165 | |
166 | 166 | /* HFP peer supported codec masks */ |
167 | 167 | // TODO(google) This should use common definitions |
168 | -// in hci/include/hci_audio.h | |
169 | 168 | #define BTA_AG_CODEC_NONE BTM_SCO_CODEC_NONE |
170 | 169 | #define BTA_AG_CODEC_CVSD BTM_SCO_CODEC_CVSD /* CVSD */ |
171 | 170 | #define BTA_AG_CODEC_MSBC BTM_SCO_CODEC_MSBC /* mSBC */ |
@@ -292,9 +291,7 @@ typedef struct { | ||
292 | 291 | #define BTA_AG_MIC_EVT 8 /* Microphone volume changed */ |
293 | 292 | #define BTA_AG_AT_CKPD_EVT 9 /* CKPD from the HS */ |
294 | 293 | #define BTA_AG_DISABLE_EVT 30 /* AG disabled */ |
295 | -#if (BTM_WBS_INCLUDED == TRUE) | |
296 | 294 | #define BTA_AG_WBS_EVT 31 /* SCO codec info */ |
297 | -#endif | |
298 | 295 | /* Values below are for HFP only */ |
299 | 296 | #define BTA_AG_AT_A_EVT 10 /* Answer a call */ |
300 | 297 | #define BTA_AG_AT_D_EVT 11 /* Place a call using number or memory dial */ |
@@ -25,7 +25,6 @@ | ||
25 | 25 | #define BTA_AG_CO_H |
26 | 26 | |
27 | 27 | #include "bta_ag_api.h" |
28 | -#include "hci/include/hci_audio.h" | |
29 | 28 | |
30 | 29 | /******************************************************************************* |
31 | 30 | * |
@@ -44,34 +43,6 @@ extern void bta_ag_co_init(void); | ||
44 | 43 | |
45 | 44 | /******************************************************************************* |
46 | 45 | * |
47 | - * Function bta_ag_co_audio_state | |
48 | - * | |
49 | - * Description This function is called by the AG before the audio | |
50 | - * connection | |
51 | - * is brought up, after it comes up, and after it goes down. | |
52 | - * | |
53 | - * Parameters handle - handle of the AG instance | |
54 | - * state - Audio state | |
55 | - * codec - if WBS support is compiled in, codec to going to be | |
56 | - * used is provided and when in SCO_STATE_SETUP, | |
57 | - * BTM_I2SPCMConfig() must be called with the correct | |
58 | - * platform parameters. In the other states, codec type | |
59 | - * should not be ignored | |
60 | - * | |
61 | - * Returns void | |
62 | - * | |
63 | - ******************************************************************************/ | |
64 | -#if (BTM_WBS_INCLUDED == TRUE) | |
65 | -extern void bta_ag_co_audio_state(uint16_t handle, uint8_t app_id, | |
66 | - uint8_t state, tBTA_AG_PEER_CODEC codec); | |
67 | - | |
68 | -#else | |
69 | -extern void bta_ag_co_audio_state(uint16_t handle, uint8_t app_id, | |
70 | - uint8_t state); | |
71 | -#endif | |
72 | - | |
73 | -/******************************************************************************* | |
74 | - * | |
75 | 46 | * Function bta_ag_co_data_open |
76 | 47 | * |
77 | 48 | * Description This function is executed by AG when a service level |
@@ -25,26 +25,12 @@ | ||
25 | 25 | #define BTA_DM_CO_H |
26 | 26 | |
27 | 27 | #include "bta_sys.h" |
28 | +#include "btm_api.h" | |
28 | 29 | |
29 | 30 | #ifndef BTA_SCO_OUT_PKT_SIZE |
30 | 31 | #define BTA_SCO_OUT_PKT_SIZE BTM_SCO_DATA_SIZE_MAX |
31 | 32 | #endif |
32 | 33 | |
33 | -#define BTA_SCO_CODEC_PCM 0 /* used for regular SCO */ | |
34 | -#define BTA_SCO_CODEC_SBC 1 /* used for WBS */ | |
35 | -typedef uint8_t tBTA_SCO_CODEC_TYPE; | |
36 | - | |
37 | -#define BTA_DM_SCO_SAMP_RATE_8K 8000 | |
38 | -#define BTA_DM_SCO_SAMP_RATE_16K 16000 | |
39 | - | |
40 | -/* SCO codec information */ | |
41 | -typedef struct { tBTA_SCO_CODEC_TYPE codec_type; } tBTA_CODEC_INFO; | |
42 | - | |
43 | -#define BTA_DM_SCO_ROUTE_PCM BTM_SCO_ROUTE_PCM | |
44 | -#define BTA_DM_SCO_ROUTE_HCI BTM_SCO_ROUTE_HCI | |
45 | - | |
46 | -typedef tBTM_SCO_ROUTE_TYPE tBTA_DM_SCO_ROUTE_TYPE; | |
47 | - | |
48 | 34 | /***************************************************************************** |
49 | 35 | * Function Declarations |
50 | 36 | ****************************************************************************/ |
@@ -135,25 +121,6 @@ extern void bta_dm_co_loc_oob(bool valid, BT_OCTET16 c, BT_OCTET16 r); | ||
135 | 121 | ******************************************************************************/ |
136 | 122 | extern void bta_dm_co_rmt_oob(BD_ADDR bd_addr); |
137 | 123 | |
138 | -/***************************************************************************** | |
139 | - * SCO over HCI Function Declarations | |
140 | - ****************************************************************************/ | |
141 | -/******************************************************************************* | |
142 | - * | |
143 | - * Function bta_dm_sco_co_init | |
144 | - * | |
145 | - * Description This function can be used by the phone to initialize audio | |
146 | - * codec or for other initialization purposes before SCO | |
147 | - * connection is opened. | |
148 | - * | |
149 | - * | |
150 | - * Returns Void. | |
151 | - * | |
152 | - ******************************************************************************/ | |
153 | -extern tBTA_DM_SCO_ROUTE_TYPE bta_dm_sco_co_init(uint32_t rx_bw, uint32_t tx_bw, | |
154 | - tBTA_CODEC_INFO* p_codec_info, | |
155 | - uint8_t app_id); | |
156 | - | |
157 | 124 | /******************************************************************************* |
158 | 125 | * |
159 | 126 | * Function bta_dm_sco_co_open |
@@ -462,7 +462,7 @@ void bta_sys_event(BT_HDR* p_msg) { | ||
462 | 462 | uint8_t id; |
463 | 463 | bool freebuf = true; |
464 | 464 | |
465 | - APPL_TRACE_EVENT("BTA got event 0x%x", p_msg->event); | |
465 | + APPL_TRACE_EVENT("%s: Event 0x%x", __func__, p_msg->event); | |
466 | 466 | |
467 | 467 | /* get subsystem id from event */ |
468 | 468 | id = (uint8_t)(p_msg->event >> 8); |
@@ -471,7 +471,7 @@ void bta_sys_event(BT_HDR* p_msg) { | ||
471 | 471 | if ((id < BTA_ID_MAX) && (bta_sys_cb.reg[id] != NULL)) { |
472 | 472 | freebuf = (*bta_sys_cb.reg[id]->evt_hdlr)(p_msg); |
473 | 473 | } else { |
474 | - APPL_TRACE_WARNING("BTA got unregistered event id %d", id); | |
474 | + APPL_TRACE_WARNING("%s: Received unregistered event id %d", __func__, id); | |
475 | 475 | } |
476 | 476 | |
477 | 477 | if (freebuf) { |
@@ -6,6 +6,7 @@ btifCommonIncludes = [ | ||
6 | 6 | "system/bt/bta/sys", |
7 | 7 | "system/bt/bta/dm", |
8 | 8 | "system/bt/btcore/include", |
9 | + "system/bt/device/include", | |
9 | 10 | "system/bt/include", |
10 | 11 | "system/bt/stack/include", |
11 | 12 | "system/bt/stack/l2cap", |
@@ -82,6 +82,7 @@ static_library("btif") { | ||
82 | 82 | "//bta/include", |
83 | 83 | "//bta/sys", |
84 | 84 | "//btcore/include", |
85 | + "//device/include", | |
85 | 86 | "//embdrv/sbc/encoder/include", |
86 | 87 | "//embdrv/sbc/decoder/include", |
87 | 88 | "//hci/include", |
@@ -19,8 +19,9 @@ | ||
19 | 19 | #define LOG_TAG "bt_btif_bta_ag" |
20 | 20 | |
21 | 21 | #include "bta/include/bta_ag_co.h" |
22 | +#include "bta/ag/bta_ag_int.h" | |
22 | 23 | #include "bta/include/bta_ag_api.h" |
23 | -#include "hci/include/hci_audio.h" | |
24 | +#include "bta/include/bta_ag_ci.h" | |
24 | 25 | #include "osi/include/osi.h" |
25 | 26 | |
26 | 27 | /******************************************************************************* |
@@ -40,70 +41,6 @@ void bta_ag_co_init(void) { BTM_WriteVoiceSettings(AG_VOICE_SETTINGS); } | ||
40 | 41 | |
41 | 42 | /******************************************************************************* |
42 | 43 | * |
43 | - * Function bta_ag_co_audio_state | |
44 | - * | |
45 | - * Description This function is called by the AG before the audio | |
46 | - * connection is brought up, after it comes up, and | |
47 | - * after it goes down. | |
48 | - * | |
49 | - * Parameters handle - handle of the AG instance | |
50 | - * state - Audio state | |
51 | - * codec - if WBS support is compiled in, codec to going to be | |
52 | - * used is provided and when in SCO_STATE_SETUP, | |
53 | - * BTM_I2SPCMConfig() must be called with the correct | |
54 | - * platform parameters. | |
55 | - * In the other states, codec type should not be ignored. | |
56 | - * | |
57 | - * Returns void | |
58 | - * | |
59 | - ******************************************************************************/ | |
60 | -#if (BTM_WBS_INCLUDED == TRUE) | |
61 | -void bta_ag_co_audio_state(uint16_t handle, uint8_t app_id, uint8_t state, | |
62 | - tBTA_AG_PEER_CODEC codec) | |
63 | -#else | |
64 | -void bta_ag_co_audio_state(uint16_t handle, uint8_t app_id, uint8_t state) | |
65 | -#endif | |
66 | -{ | |
67 | - BTIF_TRACE_DEBUG("bta_ag_co_audio_state: handle %d, state %d", handle, state); | |
68 | - switch (state) { | |
69 | - case SCO_STATE_OFF: | |
70 | -#if (BTM_WBS_INCLUDED == TRUE) | |
71 | - BTIF_TRACE_DEBUG( | |
72 | - "bta_ag_co_audio_state(handle %d)::Closed (OFF), codec: 0x%x", handle, | |
73 | - codec); | |
74 | - set_audio_state(handle, (sco_codec_t)codec, (sco_state_t)state); | |
75 | -#else | |
76 | - BTIF_TRACE_DEBUG("bta_ag_co_audio_state(handle %d)::Closed (OFF)", | |
77 | - handle); | |
78 | -#endif | |
79 | - break; | |
80 | - case SCO_STATE_OFF_TRANSFER: | |
81 | - BTIF_TRACE_DEBUG("bta_ag_co_audio_state(handle %d)::Closed (XFERRING)", | |
82 | - handle); | |
83 | - break; | |
84 | - case SCO_STATE_SETUP: | |
85 | -#if (BTM_WBS_INCLUDED == TRUE) | |
86 | - set_audio_state(handle, (sco_codec_t)codec, (sco_state_t)state); | |
87 | -#else | |
88 | - set_audio_state(handle, (sco_codec_t)BTA_AG_CODEC_CVSD, | |
89 | - (sco_state_t)state); | |
90 | -#endif | |
91 | - break; | |
92 | - default: | |
93 | - break; | |
94 | - } | |
95 | -#if (BTM_WBS_INCLUDED == TRUE) | |
96 | - APPL_TRACE_DEBUG( | |
97 | - "bta_ag_co_audio_state(handle %d, app_id: %d, state %d, codec: 0x%x)", | |
98 | - handle, app_id, state, codec); | |
99 | -#else | |
100 | - APPL_TRACE_DEBUG("bta_ag_co_audio_state(handle %d, app_id: %d, state %d)", | |
101 | - handle, app_id, state); | |
102 | -#endif | |
103 | -} | |
104 | - | |
105 | -/******************************************************************************* | |
106 | - * | |
107 | 44 | * Function bta_ag_co_data_open |
108 | 45 | * |
109 | 46 | * Description This function is executed by AG when a service level |
@@ -182,48 +182,6 @@ void bta_dm_co_rmt_oob(BD_ADDR bd_addr) { | ||
182 | 182 | static void btui_sco_codec_callback(uint16_t event, uint16_t sco_handle) { |
183 | 183 | bta_dm_sco_ci_data_ready(event, sco_handle); |
184 | 184 | } |
185 | -/******************************************************************************* | |
186 | - * | |
187 | - * Function bta_dm_sco_co_init | |
188 | - * | |
189 | - * Description This function can be used by the phone to initialize audio | |
190 | - * codec or for other initialization purposes before SCO | |
191 | - * connection is opened. | |
192 | - * | |
193 | - * | |
194 | - * Returns tBTA_DM_SCO_ROUTE_TYPE: SCO routing configuration type. | |
195 | - * | |
196 | - ******************************************************************************/ | |
197 | -tBTA_DM_SCO_ROUTE_TYPE bta_dm_sco_co_init(uint32_t rx_bw, uint32_t tx_bw, | |
198 | - tBTA_CODEC_INFO* p_codec_type, | |
199 | - uint8_t app_id) { | |
200 | - tBTM_SCO_ROUTE_TYPE route = BTA_DM_SCO_ROUTE_PCM; | |
201 | - | |
202 | - BTIF_TRACE_DEBUG("bta_dm_sco_co_init"); | |
203 | - | |
204 | - /* set up SCO routing configuration if SCO over HCI app ID is used and run | |
205 | - time | |
206 | - configuration is set to SCO over HCI */ | |
207 | - /* HS invoke this call-out */ | |
208 | - if ( | |
209 | -#if (BTA_HS_INCLUDED == TRUE) | |
210 | - (app_id == BTUI_DM_SCO_4_HS_APP_ID && btui_cfg.hs_sco_over_hci) || | |
211 | -#endif | |
212 | - /* AG invoke this call-out */ | |
213 | - (app_id != BTUI_DM_SCO_4_HS_APP_ID && btui_cfg.ag_sco_over_hci)) { | |
214 | - route = btui_cb.sco_hci = BTA_DM_SCO_ROUTE_HCI; | |
215 | - } | |
216 | - /* no codec is is used for the SCO data */ | |
217 | - if (p_codec_type->codec_type == BTA_SCO_CODEC_PCM && | |
218 | - route == BTA_DM_SCO_ROUTE_HCI) { | |
219 | - /* initialize SCO codec */ | |
220 | - if (!btui_sco_codec_init(rx_bw, tx_bw)) { | |
221 | - BTIF_TRACE_ERROR("codec initialization exception!"); | |
222 | - } | |
223 | - } | |
224 | - | |
225 | - return route; | |
226 | -} | |
227 | 185 | |
228 | 186 | /******************************************************************************* |
229 | 187 | * |
@@ -67,7 +67,6 @@ | ||
67 | 67 | #define BTIF_HF_SECURITY (BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT) |
68 | 68 | #endif |
69 | 69 | |
70 | -#if (BTM_WBS_INCLUDED == TRUE) | |
71 | 70 | #ifndef BTIF_HF_FEATURES |
72 | 71 | #define BTIF_HF_FEATURES \ |
73 | 72 | (BTA_AG_FEAT_3WAY | BTA_AG_FEAT_ECNR | BTA_AG_FEAT_REJECT | \ |
@@ -75,14 +74,6 @@ | ||
75 | 74 | BTA_AG_FEAT_CODEC | BTA_AG_FEAT_HF_IND | BTA_AG_FEAT_ESCO | \ |
76 | 75 | BTA_AG_FEAT_UNAT) |
77 | 76 | #endif |
78 | -#else | |
79 | -#ifndef BTIF_HF_FEATURES | |
80 | -#define BTIF_HF_FEATURES \ | |
81 | - (BTA_AG_FEAT_3WAY | BTA_AG_FEAT_ECNR | BTA_AG_FEAT_REJECT | \ | |
82 | - BTA_AG_FEAT_ECS | BTA_AG_FEAT_EXTERR | BTA_AG_FEAT_VREC | \ | |
83 | - BTA_AG_FEAT_HF_IND | BTA_AG_FEAT_ESCO | BTA_AG_FEAT_UNAT) | |
84 | -#endif | |
85 | -#endif | |
86 | 77 | |
87 | 78 | /* HF features supported at runtime */ |
88 | 79 | static uint32_t btif_hf_features = BTIF_HF_FEATURES; |
@@ -508,7 +499,6 @@ static void btif_hf_upstreams_evt(uint16_t event, char* p_param) { | ||
508 | 499 | &btif_hf_cb[idx].connected_bda); |
509 | 500 | break; |
510 | 501 | |
511 | -#if (BTM_WBS_INCLUDED == TRUE) | |
512 | 502 | case BTA_AG_WBS_EVT: |
513 | 503 | BTIF_TRACE_DEBUG( |
514 | 504 | "BTA_AG_WBS_EVT Set codec status %d codec %d 1=CVSD 2=MSBC", |
@@ -524,7 +514,7 @@ static void btif_hf_upstreams_evt(uint16_t event, char* p_param) { | ||
524 | 514 | &btif_hf_cb[idx].connected_bda); |
525 | 515 | } |
526 | 516 | break; |
527 | -#endif | |
517 | + | |
528 | 518 | /* Java needs to send OK/ERROR for these commands */ |
529 | 519 | case BTA_AG_AT_CHLD_EVT: |
530 | 520 | HAL_CBACK(bt_hf_callbacks, chld_cmd_cb, |
@@ -557,15 +547,14 @@ static void btif_hf_upstreams_evt(uint16_t event, char* p_param) { | ||
557 | 547 | break; |
558 | 548 | case BTA_AG_AT_BAC_EVT: |
559 | 549 | BTIF_TRACE_DEBUG("AG Bitmap of peer-codecs %d", p_data->val.num); |
560 | -#if (BTM_WBS_INCLUDED == TRUE) | |
561 | - /* If the peer supports mSBC and the BTIF prefferred codec is also mSBC, | |
550 | + /* If the peer supports mSBC and the BTIF preferred codec is also mSBC, | |
562 | 551 | then |
563 | 552 | we should set the BTA AG Codec to mSBC. This would trigger a +BCS to mSBC |
564 | 553 | at the time |
565 | 554 | of SCO connection establishment */ |
566 | 555 | if ((btif_conf_hf_force_wbs == true) && |
567 | 556 | (p_data->val.num & BTA_AG_CODEC_MSBC)) { |
568 | - BTIF_TRACE_EVENT("%s btif_hf override-Preferred Codec to MSBC", | |
557 | + BTIF_TRACE_EVENT("%s: btif_hf override-Preferred Codec to MSBC", | |
569 | 558 | __func__); |
570 | 559 | BTA_AgSetCodec(btif_hf_cb[idx].handle, BTA_AG_CODEC_MSBC); |
571 | 560 | } else { |
@@ -573,15 +562,15 @@ static void btif_hf_upstreams_evt(uint16_t event, char* p_param) { | ||
573 | 562 | __func__); |
574 | 563 | BTA_AgSetCodec(btif_hf_cb[idx].handle, BTA_AG_CODEC_CVSD); |
575 | 564 | } |
576 | -#endif | |
577 | 565 | break; |
578 | 566 | case BTA_AG_AT_BCS_EVT: |
579 | - BTIF_TRACE_DEBUG("AG final seleded codec is %d 1=CVSD 2=MSBC", | |
580 | - p_data->val.num); | |
581 | - /* no BTHF_WBS_NONE case, becuase HF1.6 supported device can send BCS */ | |
567 | + BTIF_TRACE_DEBUG("%s: AG final selected codec is 0x%02x 1=CVSD 2=MSBC", | |
568 | + __func__, p_data->val.num); | |
569 | + /* No BTHF_WBS_NONE case, because HF1.6 supported device can send BCS */ | |
570 | + /* Only CVSD is considered narrow band speech */ | |
582 | 571 | HAL_CBACK( |
583 | 572 | bt_hf_callbacks, wbs_cb, |
584 | - (p_data->val.num == BTA_AG_CODEC_MSBC) ? BTHF_WBS_YES : BTHF_WBS_NO, | |
573 | + (p_data->val.num == BTA_AG_CODEC_CVSD) ? BTHF_WBS_NO : BTHF_WBS_YES, | |
585 | 574 | &btif_hf_cb[idx].connected_bda); |
586 | 575 | break; |
587 | 576 |
@@ -1309,7 +1298,7 @@ static bt_status_t phone_state_change(int num_active, int num_held, | ||
1309 | 1298 | ag_res.audio_handle = BTA_AG_HANDLE_SCO_NO_CHANGE; |
1310 | 1299 | /* Addition call setup with the Active call |
1311 | 1300 | ** CIND response should have been updated. |
1312 | - ** just open SCO conenction. | |
1301 | + ** just open SCO connection. | |
1313 | 1302 | */ |
1314 | 1303 | if (call_setup_state != BTHF_CALL_STATE_IDLE) |
1315 | 1304 | res = BTA_AG_MULTI_CALL_RES; |
@@ -1123,7 +1123,7 @@ bool btif_rc_get_connected_peer(BD_ADDR peer_addr) { | ||
1123 | 1123 | p_dev = get_connected_device(idx); |
1124 | 1124 | if (p_dev != NULL && (p_dev->rc_connected == TRUE)) { |
1125 | 1125 | bdcpy(peer_addr, p_dev->rc_addr); |
1126 | - return TRUE; | |
1126 | + return true; | |
1127 | 1127 | } |
1128 | 1128 | } |
1129 | 1129 | return false; |
@@ -32,6 +32,7 @@ | ||
32 | 32 | #include <hardware/bt_sock.h> |
33 | 33 | |
34 | 34 | #include "btif_common.h" |
35 | +#include "device/include/esco_parameters.h" | |
35 | 36 | #include "osi/include/allocator.h" |
36 | 37 | #include "osi/include/list.h" |
37 | 38 | #include "osi/include/log.h" |
@@ -63,17 +64,6 @@ typedef struct { | ||
63 | 64 | bool connect_completed; |
64 | 65 | } sco_socket_t; |
65 | 66 | |
66 | -// TODO: verify packet types that are being sent OTA. | |
67 | -static tBTM_ESCO_PARAMS sco_parameters = { | |
68 | - BTM_64KBITS_RATE, /* TX Bandwidth (64 kbits/sec) */ | |
69 | - BTM_64KBITS_RATE, /* RX Bandwidth (64 kbits/sec) */ | |
70 | - 0x000a, /* 10 ms (HS/HF can use EV3, 2-EV3, 3-EV3) */ | |
71 | - 0x0060, /* Inp Linear, Air CVSD, 2s Comp, 16bit */ | |
72 | - (BTM_SCO_LINK_ALL_PKT_MASK | BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | | |
73 | - BTM_SCO_PKT_TYPES_MASK_NO_3_EV5), | |
74 | - BTM_ESCO_RETRANS_POWER /* Retransmission effort */ | |
75 | -}; | |
76 | - | |
77 | 67 | static sco_socket_t* sco_socket_establish_locked(bool is_listening, |
78 | 68 | const bt_bdaddr_t* bd_addr, |
79 | 69 | int* sock_fd); |
@@ -100,7 +90,8 @@ bt_status_t btsock_sco_init(thread_t* thread_) { | ||
100 | 90 | if (!sco_sockets) return BT_STATUS_FAIL; |
101 | 91 | |
102 | 92 | thread = thread_; |
103 | - BTM_SetEScoMode(BTM_LINK_TYPE_ESCO, &sco_parameters); | |
93 | + enh_esco_params_t params = esco_parameters_for_codec(ESCO_CODEC_CVSD); | |
94 | + BTM_SetEScoMode(¶ms); | |
104 | 95 | |
105 | 96 | return BT_STATUS_SUCCESS; |
106 | 97 | } |
@@ -145,7 +136,7 @@ static sco_socket_t* sco_socket_establish_locked(bool is_listening, | ||
145 | 136 | sco_socket_t* sco_socket = NULL; |
146 | 137 | socket_t* socket = NULL; |
147 | 138 | tBTM_STATUS status; |
148 | - | |
139 | + enh_esco_params_t params; | |
149 | 140 | if (socketpair(AF_LOCAL, SOCK_STREAM, 0, pair) == -1) { |
150 | 141 | LOG_ERROR(LOG_TAG, "%s unable to allocate socket pair: %s", __func__, |
151 | 142 | strerror(errno)); |
@@ -158,9 +149,10 @@ static sco_socket_t* sco_socket_establish_locked(bool is_listening, | ||
158 | 149 | goto error; |
159 | 150 | } |
160 | 151 | |
161 | - status = BTM_CreateSco((uint8_t*)bd_addr, !is_listening, | |
162 | - sco_parameters.packet_types, &sco_socket->sco_handle, | |
163 | - connect_completed_cb, disconnect_completed_cb); | |
152 | + params = esco_parameters_for_codec(ESCO_CODEC_CVSD); | |
153 | + status = BTM_CreateSco((uint8_t*)bd_addr, !is_listening, params.packet_types, | |
154 | + &sco_socket->sco_handle, connect_completed_cb, | |
155 | + disconnect_completed_cb); | |
164 | 156 | if (status != BTM_CMD_STARTED) { |
165 | 157 | LOG_ERROR(LOG_TAG, "%s unable to create SCO socket: %d", __func__, status); |
166 | 158 | goto error; |
@@ -270,9 +270,7 @@ const char* dump_hf_event(uint16_t event) { | ||
270 | 270 | CASE_RETURN_STR(BTA_AG_MIC_EVT) |
271 | 271 | CASE_RETURN_STR(BTA_AG_AT_CKPD_EVT) |
272 | 272 | CASE_RETURN_STR(BTA_AG_DISABLE_EVT) |
273 | -#if (BTM_WBS_INCLUDED == TRUE) | |
274 | 273 | CASE_RETURN_STR(BTA_AG_WBS_EVT) |
275 | -#endif | |
276 | 274 | CASE_RETURN_STR(BTA_AG_AT_A_EVT) |
277 | 275 | CASE_RETURN_STR(BTA_AG_AT_D_EVT) |
278 | 276 | CASE_RETURN_STR(BTA_AG_AT_CHLD_EVT) |
@@ -15,6 +15,7 @@ cc_library_static { | ||
15 | 15 | ], |
16 | 16 | srcs: [ |
17 | 17 | "src/controller.cc", |
18 | + "src/esco_parameters.cc", | |
18 | 19 | "src/interop.cc", |
19 | 20 | ], |
20 | 21 | shared_libs: [ |
@@ -17,6 +17,7 @@ | ||
17 | 17 | static_library("device") { |
18 | 18 | sources = [ |
19 | 19 | "src/controller.cc", |
20 | + "src/esco_parameters.cc", | |
20 | 21 | "src/interop.cc", |
21 | 22 | ] |
22 | 23 |
@@ -49,6 +49,8 @@ typedef struct controller_t { | ||
49 | 49 | bool (*supports_rssi_with_inquiry_results)(void); |
50 | 50 | bool (*supports_extended_inquiry_response)(void); |
51 | 51 | bool (*supports_master_slave_role_switch)(void); |
52 | + bool (*supports_enhanced_setup_synchronous_connection)(void); | |
53 | + bool (*supports_enhanced_accept_synchronous_connection)(void); | |
52 | 54 | |
53 | 55 | bool (*supports_ble)(void); |
54 | 56 | bool (*supports_ble_packet_extension)(void); |
@@ -0,0 +1,137 @@ | ||
1 | +/****************************************************************************** | |
2 | + * | |
3 | + * Copyright (C) 2015 Broadcom Corporation | |
4 | + * | |
5 | + * Licensed under the Apache License, Version 2.0 (the "License"); | |
6 | + * you may not use this file except in compliance with the License. | |
7 | + * You may obtain a copy of the License at: | |
8 | + * | |
9 | + * http://www.apache.org/licenses/LICENSE-2.0 | |
10 | + * | |
11 | + * Unless required by applicable law or agreed to in writing, software | |
12 | + * distributed under the License is distributed on an "AS IS" BASIS, | |
13 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
14 | + * See the License for the specific language governing permissions and | |
15 | + * limitations under the License. | |
16 | + * | |
17 | + ******************************************************************************/ | |
18 | + | |
19 | +#pragma once | |
20 | + | |
21 | +#include <stdint.h> | |
22 | + | |
23 | +/******************* | |
24 | + * SCO Codec Types | |
25 | + *******************/ | |
26 | +typedef enum { | |
27 | + SCO_CODEC_NONE = 0x0000, | |
28 | + SCO_CODEC_CVSD = 0x0001, | |
29 | + SCO_CODEC_MSBC = 0x0002, | |
30 | +} sco_codec_t; | |
31 | + | |
32 | +typedef enum { | |
33 | + ESCO_CODEC_CVSD = 0, | |
34 | + ESCO_CODEC_MSBC_T1, | |
35 | + ESCO_CODEC_MSBC_T2, | |
36 | +} esco_codec_t; | |
37 | + | |
38 | +#define ESCO_NUM_CODECS 3 | |
39 | + | |
40 | +// Coding Formats (BT 4.1 or later Assigned numbers) | |
41 | +#define ESCO_CODING_FORMAT_ULAW ((uint8_t)0x00) /* u-Law log */ | |
42 | +#define ESCO_CODING_FORMAT_ALAW ((uint8_t)0x01) /* A-Law log */ | |
43 | +#define ESCO_CODING_FORMAT_CVSD ((uint8_t)0x02) /* CVSD */ | |
44 | +#define ESCO_CODING_FORMAT_TRANSPNT ((uint8_t)0x03) /* Transparent */ | |
45 | +#define ESCO_CODING_FORMAT_LINEAR ((uint8_t)0x04) /* Linear PCM */ | |
46 | +#define ESCO_CODING_FORMAT_MSBC ((uint8_t)0x05) /* MSBC PCM */ | |
47 | +#define ESCO_CODING_FORMAT_VS ((uint8_t)0xFF) /* Specifies VSC used */ | |
48 | +typedef uint8_t esco_coding_format_t; | |
49 | + | |
50 | +// PCM Data Formats (BT 4.1 or later Assigned numbers) | |
51 | +#define ESCO_PCM_DATA_FORMAT_NA \ | |
52 | + ((uint8_t)0x00) /* N/A to coding format in use */ | |
53 | +#define ESCO_PCM_DATA_FORMAT_1_COMP ((uint8_t)0x01) /* 1's complement */ | |
54 | +#define ESCO_PCM_DATA_FORMAT_2_COMP ((uint8_t)0x02) /* 2's complement */ | |
55 | +#define ESCO_PCM_DATA_FORMAT_SIGN ((uint8_t)0x03) /* Sign-magnitude */ | |
56 | +#define ESCO_PCM_DATA_FORMAT_UNSIGN ((uint8_t)0x04) /* Unsigned */ | |
57 | +typedef uint8_t esco_pcm_data_format_t; | |
58 | + | |
59 | +// SCO Data Path | |
60 | +#define ESCO_DATA_PATH_PCM 1 /* 0x01-0xFE (PCM Chan) */ | |
61 | +#define ESCO_DATA_PATH_HCI ((uint8_t)0x00) /* HCI-0, 0x01-0xFE (PCM Chan) */ | |
62 | +#define ESCO_DATA_PATH_TEST ((uint8_t)0xFF) /* 0xFF-Audio Test */ | |
63 | +typedef uint8_t esco_data_path_t; | |
64 | + | |
65 | +// eSCO constants | |
66 | +#define TXRX_64KBITS_RATE 0x00001f40 /* 64 kbits/sec data rate */ | |
67 | +#define TXRX_128KBITS_RATE 0x00003E80 /* 128 kbits/sec data rate */ | |
68 | +typedef uint32_t esco_txrx_bandwidth_t; | |
69 | + | |
70 | +#define INPUT_OUTPUT_64K_RATE 0x00003E80 /* 16000 Bytes/sec over transport */ | |
71 | +#define INPUT_OUTPUT_128K_RATE 0x00007D00 /* 32000 Bytes/sec over transport */ | |
72 | +typedef uint32_t esco_io_bandwidth_t; | |
73 | + | |
74 | +// Retransmission effort | |
75 | +#define ESCO_RETRANSMISSION_OFF 0 | |
76 | +#define ESCO_RETRANSMISSION_POWER 1 | |
77 | +#define ESCO_RETRANSMISSION_QUALITY 2 | |
78 | +#define ESCO_RETRANSMISSION_DONTCARE 0xff | |
79 | +typedef uint8_t esco_retransmission_effort_t; | |
80 | + | |
81 | +// Definitions for eSCO packet type masks (BT1.2 and BT2.0 definitions) | |
82 | +#define ESCO_PKT_TYPES_MASK_HV1 0x0001 | |
83 | +#define ESCO_PKT_TYPES_MASK_HV2 0x0002 | |
84 | +#define ESCO_PKT_TYPES_MASK_HV3 0x0004 | |
85 | +#define ESCO_PKT_TYPES_MASK_EV3 0x0008 | |
86 | +#define ESCO_PKT_TYPES_MASK_EV4 0x0010 | |
87 | +#define ESCO_PKT_TYPES_MASK_EV5 0x0020 | |
88 | +#define ESCO_PKT_TYPES_MASK_NO_2_EV3 0x0040 | |
89 | +#define ESCO_PKT_TYPES_MASK_NO_3_EV3 0x0080 | |
90 | +#define ESCO_PKT_TYPES_MASK_NO_2_EV5 0x0100 | |
91 | +#define ESCO_PKT_TYPES_MASK_NO_3_EV5 0x0200 | |
92 | +typedef uint16_t esco_packet_types_t; | |
93 | + | |
94 | +// type definition | |
95 | +typedef struct { | |
96 | + esco_coding_format_t coding_format; /* Coding Format*/ | |
97 | + uint16_t company_id; /* Company ID from BT SIG Assigned Numbers */ | |
98 | + uint16_t vendor_specific_codec_id; /* Vendor Specific Codec ID */ | |
99 | +} esco_coding_id_format_t; | |
100 | + | |
101 | +// Enhanced setup/accept synchronous connection See BT 4.1 or later HCI spec for | |
102 | +// details | |
103 | +typedef struct { | |
104 | + esco_txrx_bandwidth_t | |
105 | + transmit_bandwidth; /* Transmit Bandwidth (in octets/second) */ | |
106 | + esco_txrx_bandwidth_t receive_bandwidth; /* RX BW (# of octets/second) */ | |
107 | + esco_coding_id_format_t transmit_coding_format; /* TX coding format */ | |
108 | + esco_coding_id_format_t receive_coding_format; /* RX coding format */ | |
109 | + uint16_t transmit_codec_frame_size; /* TX CODEC frame size (OTA frame size) */ | |
110 | + uint16_t receive_codec_frame_size; /* RX CODEC frame size (OTA frame size) */ | |
111 | + esco_io_bandwidth_t input_bandwidth; /* Input BW (nominal rate octets/sec) */ | |
112 | + esco_io_bandwidth_t | |
113 | + output_bandwidth; /* Output BW (nominal rate octets/sec) */ | |
114 | + esco_coding_id_format_t input_coding_format; /* Input coding format */ | |
115 | + esco_coding_id_format_t output_coding_format; /* Output coding format */ | |
116 | + uint16_t input_coded_data_size; /* Input coded data size (in bits) */ | |
117 | + uint16_t output_coded_data_size; /* Output coded data size (in bits) */ | |
118 | + esco_pcm_data_format_t | |
119 | + input_pcm_data_format; /* Input PCM data format (see hcidefs.h) */ | |
120 | + esco_pcm_data_format_t | |
121 | + output_pcm_data_format; /* Output PCM data format (see hcidefs.h) */ | |
122 | + uint8_t input_pcm_payload_msb_position; /* Input PCM sample payload MSB | |
123 | + position */ | |
124 | + uint8_t output_pcm_payload_msb_position; /* Output PCM sample payload MSB | |
125 | + position */ | |
126 | + esco_data_path_t input_data_path; /* 0x00 - HCI, or 0x01-0xFE for VS) */ | |
127 | + esco_data_path_t output_data_path; /* 0x00 - HCI, or 0x01-0xFE for VS) */ | |
128 | + uint8_t input_transport_unit_size; /* Input transport unit size */ | |
129 | + uint8_t output_transport_unit_size; /* Output transport unit size */ | |
130 | + uint16_t max_latency_ms; /* Maximum latency (0x4-0xFFFE in msecs) */ | |
131 | + esco_packet_types_t packet_types; /* Packet Types */ | |
132 | + esco_retransmission_effort_t | |
133 | + retransmission_effort; /* 0x00-0x02, 0xFF don't care */ | |
134 | +} enh_esco_params_t; | |
135 | + | |
136 | +// Get the enhanced eSCO configuration parameters for the provided |codec| | |
137 | +enh_esco_params_t esco_parameters_for_codec(esco_codec_t codec); |
@@ -357,6 +357,16 @@ static bool supports_master_slave_role_switch(void) { | ||
357 | 357 | return HCI_SWITCH_SUPPORTED(features_classic[0].as_array); |
358 | 358 | } |
359 | 359 | |
360 | +static bool supports_enhanced_setup_synchronous_connection(void) { | |
361 | + assert(readable); | |
362 | + return HCI_ENH_SETUP_SYNCH_CONN_SUPPORTED(supported_commands); | |
363 | +} | |
364 | + | |
365 | +static bool supports_enhanced_accept_synchronous_connection(void) { | |
366 | + assert(readable); | |
367 | + return HCI_ENH_ACCEPT_SYNCH_CONN_SUPPORTED(supported_commands); | |
368 | +} | |
369 | + | |
360 | 370 | static bool supports_ble(void) { |
361 | 371 | CHECK(readable); |
362 | 372 | return ble_supported; |
@@ -504,6 +514,8 @@ static const controller_t interface = { | ||
504 | 514 | supports_rssi_with_inquiry_results, |
505 | 515 | supports_extended_inquiry_response, |
506 | 516 | supports_master_slave_role_switch, |
517 | + supports_enhanced_setup_synchronous_connection, | |
518 | + supports_enhanced_accept_synchronous_connection, | |
507 | 519 | |
508 | 520 | supports_ble, |
509 | 521 | supports_ble_packet_extension, |
@@ -0,0 +1,147 @@ | ||
1 | +/****************************************************************************** | |
2 | + * | |
3 | + * Copyright (C) 2015 Broadcom Corporation | |
4 | + * | |
5 | + * Licensed under the Apache License, Version 2.0 (the "License"); | |
6 | + * you may not use this file except in compliance with the License. | |
7 | + * You may obtain a copy of the License at: | |
8 | + * | |
9 | + * http://www.apache.org/licenses/LICENSE-2.0 | |
10 | + * | |
11 | + * Unless required by applicable law or agreed to in writing, software | |
12 | + * distributed under the License is distributed on an "AS IS" BASIS, | |
13 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
14 | + * See the License for the specific language governing permissions and | |
15 | + * limitations under the License. | |
16 | + * | |
17 | + ******************************************************************************/ | |
18 | + | |
19 | +#include "base/logging.h" | |
20 | + | |
21 | +#include "device/include/esco_parameters.h" | |
22 | + | |
23 | +static const enh_esco_params_t default_esco_parameters[ESCO_NUM_CODECS] = { | |
24 | + // CVSD | |
25 | + {.transmit_bandwidth = TXRX_64KBITS_RATE, | |
26 | + .receive_bandwidth = TXRX_64KBITS_RATE, | |
27 | + .transmit_coding_format = {.coding_format = ESCO_CODING_FORMAT_CVSD, | |
28 | + .company_id = 0x0000, | |
29 | + .vendor_specific_codec_id = 0x0000}, | |
30 | + .receive_coding_format = {.coding_format = ESCO_CODING_FORMAT_CVSD, | |
31 | + .company_id = 0x0000, | |
32 | + .vendor_specific_codec_id = 0x0000}, | |
33 | + .transmit_codec_frame_size = 60, | |
34 | + .receive_codec_frame_size = 60, | |
35 | + .input_bandwidth = INPUT_OUTPUT_64K_RATE, | |
36 | + .output_bandwidth = INPUT_OUTPUT_64K_RATE, | |
37 | + .input_coding_format = {.coding_format = ESCO_CODING_FORMAT_LINEAR, | |
38 | + .company_id = 0x0000, | |
39 | + .vendor_specific_codec_id = 0x0000}, | |
40 | + .output_coding_format = {.coding_format = ESCO_CODING_FORMAT_LINEAR, | |
41 | + .company_id = 0x0000, | |
42 | + .vendor_specific_codec_id = 0x0000}, | |
43 | + .input_coded_data_size = 16, | |
44 | + .output_coded_data_size = 16, | |
45 | + .input_pcm_data_format = ESCO_PCM_DATA_FORMAT_2_COMP, | |
46 | + .output_pcm_data_format = ESCO_PCM_DATA_FORMAT_2_COMP, | |
47 | + .input_pcm_payload_msb_position = 0, | |
48 | + .output_pcm_payload_msb_position = 0, | |
49 | + .input_data_path = ESCO_DATA_PATH_PCM, | |
50 | + .output_data_path = ESCO_DATA_PATH_PCM, | |
51 | + .input_transport_unit_size = 0x00, | |
52 | + .output_transport_unit_size = 0x00, | |
53 | +#if (BTA_HFP_VERSION >= HFP_VERSION_1_7) | |
54 | + .max_latency_ms = 12, | |
55 | +#else | |
56 | + .max_latency_ms = 10, | |
57 | +#endif | |
58 | + | |
59 | + .packet_types = | |
60 | + (ESCO_PKT_TYPES_MASK_HV1 | ESCO_PKT_TYPES_MASK_HV2 | | |
61 | + ESCO_PKT_TYPES_MASK_HV3 | ESCO_PKT_TYPES_MASK_EV3 | | |
62 | + ESCO_PKT_TYPES_MASK_EV4 | ESCO_PKT_TYPES_MASK_EV5 | | |
63 | + ESCO_PKT_TYPES_MASK_NO_3_EV3 | ESCO_PKT_TYPES_MASK_NO_2_EV5 | | |
64 | + ESCO_PKT_TYPES_MASK_NO_3_EV5), | |
65 | +#if (BTA_HFP_VERSION >= HFP_VERSION_1_7) | |
66 | + .retransmission_effort = ESCO_RETRANSMISSION_QUALITY | |
67 | +#else | |
68 | + .retransmission_effort = ESCO_RETRANSMISSION_POWER | |
69 | +#endif | |
70 | + | |
71 | + }, | |
72 | + // mSBC T1 | |
73 | + {.transmit_bandwidth = TXRX_64KBITS_RATE, | |
74 | + .receive_bandwidth = TXRX_64KBITS_RATE, | |
75 | + .transmit_coding_format = {.coding_format = ESCO_CODING_FORMAT_MSBC, | |
76 | + .company_id = 0x0000, | |
77 | + .vendor_specific_codec_id = 0x0000}, | |
78 | + .receive_coding_format = {.coding_format = ESCO_CODING_FORMAT_MSBC, | |
79 | + .company_id = 0x0000, | |
80 | + .vendor_specific_codec_id = 0x0000}, | |
81 | + .transmit_codec_frame_size = 60, | |
82 | + .receive_codec_frame_size = 60, | |
83 | + .input_bandwidth = INPUT_OUTPUT_128K_RATE, | |
84 | + .output_bandwidth = INPUT_OUTPUT_128K_RATE, | |
85 | + .input_coding_format = {.coding_format = ESCO_CODING_FORMAT_LINEAR, | |
86 | + .company_id = 0x0000, | |
87 | + .vendor_specific_codec_id = 0x0000}, | |
88 | + .output_coding_format = {.coding_format = ESCO_CODING_FORMAT_LINEAR, | |
89 | + .company_id = 0x0000, | |
90 | + .vendor_specific_codec_id = 0x0000}, | |
91 | + .input_coded_data_size = 16, | |
92 | + .output_coded_data_size = 16, | |
93 | + .input_pcm_data_format = ESCO_PCM_DATA_FORMAT_2_COMP, | |
94 | + .output_pcm_data_format = ESCO_PCM_DATA_FORMAT_2_COMP, | |
95 | + .input_pcm_payload_msb_position = 0, | |
96 | + .output_pcm_payload_msb_position = 0, | |
97 | + .input_data_path = ESCO_DATA_PATH_PCM, | |
98 | + .output_data_path = ESCO_DATA_PATH_PCM, | |
99 | + .input_transport_unit_size = 0x00, | |
100 | + .output_transport_unit_size = 0x00, | |
101 | + .max_latency_ms = 8, | |
102 | + .packet_types = | |
103 | + (ESCO_PKT_TYPES_MASK_EV3 | ESCO_PKT_TYPES_MASK_NO_3_EV3 | | |
104 | + ESCO_PKT_TYPES_MASK_NO_2_EV5 | ESCO_PKT_TYPES_MASK_NO_3_EV5 | | |
105 | + ESCO_PKT_TYPES_MASK_NO_2_EV3), | |
106 | + .retransmission_effort = ESCO_RETRANSMISSION_QUALITY}, | |
107 | + // mSBC T2 | |
108 | + {.transmit_bandwidth = TXRX_64KBITS_RATE, | |
109 | + .receive_bandwidth = TXRX_64KBITS_RATE, | |
110 | + .transmit_coding_format = {.coding_format = ESCO_CODING_FORMAT_MSBC, | |
111 | + .company_id = 0x0000, | |
112 | + .vendor_specific_codec_id = 0x0000}, | |
113 | + .receive_coding_format = {.coding_format = ESCO_CODING_FORMAT_MSBC, | |
114 | + .company_id = 0x0000, | |
115 | + .vendor_specific_codec_id = 0x0000}, | |
116 | + .transmit_codec_frame_size = 60, | |
117 | + .receive_codec_frame_size = 60, | |
118 | + .input_bandwidth = INPUT_OUTPUT_128K_RATE, | |
119 | + .output_bandwidth = INPUT_OUTPUT_128K_RATE, | |
120 | + .input_coding_format = {.coding_format = ESCO_CODING_FORMAT_LINEAR, | |
121 | + .company_id = 0x0000, | |
122 | + .vendor_specific_codec_id = 0x0000}, | |
123 | + .output_coding_format = {.coding_format = ESCO_CODING_FORMAT_LINEAR, | |
124 | + .company_id = 0x0000, | |
125 | + .vendor_specific_codec_id = 0x0000}, | |
126 | + .input_coded_data_size = 16, | |
127 | + .output_coded_data_size = 16, | |
128 | + .input_pcm_data_format = ESCO_PCM_DATA_FORMAT_2_COMP, | |
129 | + .output_pcm_data_format = ESCO_PCM_DATA_FORMAT_2_COMP, | |
130 | + .input_pcm_payload_msb_position = 0, | |
131 | + .output_pcm_payload_msb_position = 0, | |
132 | + .input_data_path = ESCO_DATA_PATH_PCM, | |
133 | + .output_data_path = ESCO_DATA_PATH_PCM, | |
134 | + .input_transport_unit_size = 0x00, | |
135 | + .output_transport_unit_size = 0x00, | |
136 | + .max_latency_ms = 13, | |
137 | + .packet_types = | |
138 | + (ESCO_PKT_TYPES_MASK_EV3 | ESCO_PKT_TYPES_MASK_NO_3_EV3 | | |
139 | + ESCO_PKT_TYPES_MASK_NO_2_EV5 | ESCO_PKT_TYPES_MASK_NO_3_EV5), | |
140 | + .retransmission_effort = ESCO_RETRANSMISSION_QUALITY}}; | |
141 | + | |
142 | +enh_esco_params_t esco_parameters_for_codec(esco_codec_t codec) { | |
143 | + CHECK(codec >= 0) << "codec index " << (int)codec << "< 0"; | |
144 | + CHECK(codec < ESCO_NUM_CODECS) << "codec index " << (int)codec << " > " | |
145 | + << ESCO_NUM_CODECS; | |
146 | + return default_esco_parameters[codec]; | |
147 | +} |
@@ -19,7 +19,6 @@ cc_library_static { | ||
19 | 19 | "src/btsnoop_mem.cc", |
20 | 20 | "src/btsnoop_net.cc", |
21 | 21 | "src/buffer_allocator.cc", |
22 | - "src/hci_audio.cc", | |
23 | 22 | "src/hci_inject.cc", |
24 | 23 | "src/hci_layer.cc", |
25 | 24 | "src/hci_layer_android.cc", |
@@ -20,7 +20,6 @@ static_library("hci") { | ||
20 | 20 | "src/btsnoop_mem.cc", |
21 | 21 | "src/btsnoop_net.cc", |
22 | 22 | "src/buffer_allocator.cc", |
23 | - "src/hci_audio.cc", | |
24 | 23 | "src/hci_inject.cc", |
25 | 24 | "src/hci_layer.cc", |
26 | 25 | "src/hci_layer_linux.cc", |
@@ -19,6 +19,7 @@ | ||
19 | 19 | #ifndef BT_VENDOR_LIB_H |
20 | 20 | #define BT_VENDOR_LIB_H |
21 | 21 | |
22 | +#include <stdbool.h> | |
22 | 23 | #include <stdint.h> |
23 | 24 | #include <sys/cdefs.h> |
24 | 25 | #include <sys/types.h> |
@@ -240,6 +241,7 @@ typedef struct { | ||
240 | 241 | uint16_t handle; |
241 | 242 | uint16_t peer_codec; |
242 | 243 | uint16_t state; |
244 | + bool use_enhanced_sco; | |
243 | 245 | } bt_vendor_op_audio_state_t; |
244 | 246 | |
245 | 247 | /* |
@@ -1,40 +0,0 @@ | ||
1 | -/****************************************************************************** | |
2 | - * | |
3 | - * Copyright (C) 2015 Google, Inc. | |
4 | - * | |
5 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
6 | - * you may not use this file except in compliance with the License. | |
7 | - * You may obtain a copy of the License at: | |
8 | - * | |
9 | - * http://www.apache.org/licenses/LICENSE-2.0 | |
10 | - * | |
11 | - * Unless required by applicable law or agreed to in writing, software | |
12 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
13 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
14 | - * See the License for the specific language governing permissions and | |
15 | - * limitations under the License. | |
16 | - * | |
17 | - ******************************************************************************/ | |
18 | - | |
19 | -#pragma once | |
20 | - | |
21 | -#include <stdint.h> | |
22 | - | |
23 | -// Audio state definitions. | |
24 | -typedef enum { | |
25 | - SCO_STATE_OFF = 0, // Audio is off. | |
26 | - SCO_STATE_OFF_TRANSFER, // Closed pending final transfer of audio. | |
27 | - SCO_STATE_ON, // Audio is on. | |
28 | - SCO_STATE_SETUP, // Open pending completion of audio setup. | |
29 | -} sco_state_t; | |
30 | - | |
31 | -// Codec type definitions. | |
32 | -typedef enum { | |
33 | - SCO_CODEC_NONE = 0x0000, | |
34 | - SCO_CODEC_CVSD = 0x0001, | |
35 | - SCO_CODEC_MSBC = 0x0002, | |
36 | -} sco_codec_t; | |
37 | - | |
38 | -// Set the audio state on the controller for SCO (PCM, WBS, ...) using the | |
39 | -// vendor library. | |
40 | -void set_audio_state(uint16_t handle, sco_codec_t codec, sco_state_t state); |
@@ -1,38 +0,0 @@ | ||
1 | -/****************************************************************************** | |
2 | - * | |
3 | - * Copyright (C) 2015 Google, Inc. | |
4 | - * | |
5 | - * Licensed under the Apache License, Version 2.0 (the "License"); | |
6 | - * you may not use this file except in compliance with the License. | |
7 | - * You may obtain a copy of the License at: | |
8 | - * | |
9 | - * http://www.apache.org/licenses/LICENSE-2.0 | |
10 | - * | |
11 | - * Unless required by applicable law or agreed to in writing, software | |
12 | - * distributed under the License is distributed on an "AS IS" BASIS, | |
13 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
14 | - * See the License for the specific language governing permissions and | |
15 | - * limitations under the License. | |
16 | - * | |
17 | - ******************************************************************************/ | |
18 | - | |
19 | -#define LOG_TAG "bt_hci_audio" | |
20 | - | |
21 | -#include "hci/include/hci_audio.h" | |
22 | - | |
23 | -#include "hci/include/bt_vendor_lib.h" | |
24 | -#include "osi/include/log.h" | |
25 | - | |
26 | -void set_audio_state(uint16_t handle, sco_codec_t codec, sco_state_t state) { | |
27 | - /* | |
28 | - TODO(eisenbach): [HIDL] Re-implement using VSC | |
29 | - | |
30 | - bt_vendor_op_audio_state_t audio_state; | |
31 | - | |
32 | - audio_state.handle = handle; | |
33 | - audio_state.peer_codec = codec; | |
34 | - audio_state.state = state; | |
35 | - | |
36 | - vendor_get_interface()->send_command(VENDOR_SET_AUDIO_STATE, &audio_state); | |
37 | - */ | |
38 | -} |
@@ -104,10 +104,10 @@ | ||
104 | 104 | #endif |
105 | 105 | |
106 | 106 | #ifndef BTA_AG_SCO_PKT_TYPES |
107 | -#define BTA_AG_SCO_PKT_TYPES \ | |
108 | - (BTM_SCO_LINK_ONLY_MASK | BTM_SCO_PKT_TYPES_MASK_EV3 | \ | |
109 | - BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 | BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | \ | |
110 | - BTM_SCO_PKT_TYPES_MASK_NO_3_EV5) | |
107 | +#define BTA_AG_SCO_PKT_TYPES \ | |
108 | + (BTM_SCO_LINK_ONLY_MASK | ESCO_PKT_TYPES_MASK_EV3 | \ | |
109 | + ESCO_PKT_TYPES_MASK_NO_3_EV3 | ESCO_PKT_TYPES_MASK_NO_2_EV5 | \ | |
110 | + ESCO_PKT_TYPES_MASK_NO_3_EV5) | |
111 | 111 | #endif |
112 | 112 | |
113 | 113 | #ifndef BTA_AV_RET_TOUT |
@@ -301,14 +301,6 @@ | ||
301 | 301 | #define BTM_SCO_HCI_INCLUDED FALSE /* TRUE includes SCO over HCI code */ |
302 | 302 | #endif |
303 | 303 | |
304 | -/* Includes WBS if TRUE */ | |
305 | -// TODO(eisenbch): Temporarily disable WBS; to be replaced with proper eSCO | |
306 | -// setup | |
307 | -#ifdef BTM_WBS_INCLUDED | |
308 | -#undef BTM_WBS_INCLUDED | |
309 | -#endif | |
310 | -#define BTM_WBS_INCLUDED FALSE /* TRUE includes WBS code */ | |
311 | - | |
312 | 304 | /* This is used to work around a controller bug that doesn't like Disconnect |
313 | 305 | * issued while there is a role switch in progress |
314 | 306 | */ |
@@ -96,9 +96,9 @@ void btm_dev_init(void) { | ||
96 | 96 | BTM_ACL_PKT_TYPES_MASK_DH5 + BTM_ACL_PKT_TYPES_MASK_DM5; |
97 | 97 | |
98 | 98 | btm_cb.btm_sco_pkt_types_supported = |
99 | - BTM_SCO_PKT_TYPES_MASK_HV1 + BTM_SCO_PKT_TYPES_MASK_HV2 + | |
100 | - BTM_SCO_PKT_TYPES_MASK_HV3 + BTM_SCO_PKT_TYPES_MASK_EV3 + | |
101 | - BTM_SCO_PKT_TYPES_MASK_EV4 + BTM_SCO_PKT_TYPES_MASK_EV5; | |
99 | + ESCO_PKT_TYPES_MASK_HV1 + ESCO_PKT_TYPES_MASK_HV2 + | |
100 | + ESCO_PKT_TYPES_MASK_HV3 + ESCO_PKT_TYPES_MASK_EV3 + | |
101 | + ESCO_PKT_TYPES_MASK_EV4 + ESCO_PKT_TYPES_MASK_EV5; | |
102 | 102 | } |
103 | 103 | |
104 | 104 | /******************************************************************************* |
@@ -296,49 +296,43 @@ static void btm_decode_ext_features_page(uint8_t page_number, | ||
296 | 296 | btm_cb.sco_cb.esco_supported = false; |
297 | 297 | #endif |
298 | 298 | if (HCI_SCO_LINK_SUPPORTED(p_features)) { |
299 | - btm_cb.btm_sco_pkt_types_supported = BTM_SCO_PKT_TYPES_MASK_HV1; | |
299 | + btm_cb.btm_sco_pkt_types_supported = ESCO_PKT_TYPES_MASK_HV1; | |
300 | 300 | |
301 | 301 | if (HCI_HV2_PACKETS_SUPPORTED(p_features)) |
302 | - btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_HV2; | |
302 | + btm_cb.btm_sco_pkt_types_supported |= ESCO_PKT_TYPES_MASK_HV2; | |
303 | 303 | |
304 | 304 | if (HCI_HV3_PACKETS_SUPPORTED(p_features)) |
305 | - btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_HV3; | |
305 | + btm_cb.btm_sco_pkt_types_supported |= ESCO_PKT_TYPES_MASK_HV3; | |
306 | 306 | } |
307 | 307 | |
308 | 308 | if (HCI_ESCO_EV3_SUPPORTED(p_features)) |
309 | - btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_EV3; | |
309 | + btm_cb.btm_sco_pkt_types_supported |= ESCO_PKT_TYPES_MASK_EV3; | |
310 | 310 | |
311 | 311 | if (HCI_ESCO_EV4_SUPPORTED(p_features)) |
312 | - btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_EV4; | |
312 | + btm_cb.btm_sco_pkt_types_supported |= ESCO_PKT_TYPES_MASK_EV4; | |
313 | 313 | |
314 | 314 | if (HCI_ESCO_EV5_SUPPORTED(p_features)) |
315 | - btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_EV5; | |
316 | -#if (BTM_SCO_INCLUDED == TRUE) | |
315 | + btm_cb.btm_sco_pkt_types_supported |= ESCO_PKT_TYPES_MASK_EV5; | |
317 | 316 | if (btm_cb.btm_sco_pkt_types_supported & BTM_ESCO_LINK_ONLY_MASK) { |
318 | 317 | btm_cb.sco_cb.esco_supported = true; |
319 | 318 | |
320 | 319 | /* Add in EDR related eSCO types */ |
321 | 320 | if (HCI_EDR_ESCO_2MPS_SUPPORTED(p_features)) { |
322 | 321 | if (!HCI_3_SLOT_EDR_ESCO_SUPPORTED(p_features)) |
323 | - btm_cb.btm_sco_pkt_types_supported |= | |
324 | - BTM_SCO_PKT_TYPES_MASK_NO_2_EV5; | |
322 | + btm_cb.btm_sco_pkt_types_supported |= ESCO_PKT_TYPES_MASK_NO_2_EV5; | |
325 | 323 | } else { |
326 | 324 | btm_cb.btm_sco_pkt_types_supported |= |
327 | - (BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 + | |
328 | - BTM_SCO_PKT_TYPES_MASK_NO_2_EV5); | |
325 | + (ESCO_PKT_TYPES_MASK_NO_2_EV3 + ESCO_PKT_TYPES_MASK_NO_2_EV5); | |
329 | 326 | } |
330 | 327 | |
331 | 328 | if (HCI_EDR_ESCO_3MPS_SUPPORTED(p_features)) { |
332 | 329 | if (!HCI_3_SLOT_EDR_ESCO_SUPPORTED(p_features)) |
333 | - btm_cb.btm_sco_pkt_types_supported |= | |
334 | - BTM_SCO_PKT_TYPES_MASK_NO_3_EV5; | |
330 | + btm_cb.btm_sco_pkt_types_supported |= ESCO_PKT_TYPES_MASK_NO_3_EV5; | |
335 | 331 | } else { |
336 | 332 | btm_cb.btm_sco_pkt_types_supported |= |
337 | - (BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 + | |
338 | - BTM_SCO_PKT_TYPES_MASK_NO_3_EV5); | |
333 | + (ESCO_PKT_TYPES_MASK_NO_3_EV3 + ESCO_PKT_TYPES_MASK_NO_3_EV5); | |
339 | 334 | } |
340 | 335 | } |
341 | -#endif | |
342 | 336 | |
343 | 337 | BTM_TRACE_DEBUG("Local supported SCO packet types: 0x%04x", |
344 | 338 | btm_cb.btm_sco_pkt_types_supported); |
@@ -35,6 +35,8 @@ | ||
35 | 35 | #include "rfcdefs.h" |
36 | 36 | |
37 | 37 | #include "btm_api.h" |
38 | +#include "device/include/esco_parameters.h" | |
39 | + | |
38 | 40 | #include "btm_ble_int.h" |
39 | 41 | #include "btm_int_types.h" |
40 | 42 | #include "smp_api.h" |
@@ -158,7 +160,7 @@ extern bool btm_is_sco_active(uint16_t handle); | ||
158 | 160 | extern void btm_remove_sco_links(BD_ADDR bda); |
159 | 161 | extern bool btm_is_sco_active_by_bdaddr(BD_ADDR remote_bda); |
160 | 162 | |
161 | -extern tBTM_SCO_TYPE btm_read_def_esco_mode(tBTM_ESCO_PARAMS* p_parms); | |
163 | +extern void btm_read_def_esco_mode(enh_esco_params_t* p_parms); | |
162 | 164 | extern uint16_t btm_find_scb_by_handle(uint16_t handle); |
163 | 165 | extern void btm_sco_flush_sco_data(uint16_t sco_inx); |
164 | 166 |
@@ -305,9 +305,8 @@ typedef void(tBTM_SCO_IND_CBACK)(uint16_t sco_inx); | ||
305 | 305 | (HCI_PKT_TYPES_MASK_HV1 | HCI_PKT_TYPES_MASK_HV2 | HCI_PKT_TYPES_MASK_HV3) |
306 | 306 | |
307 | 307 | /* Mask defining only the SCO types of an esco packet type */ |
308 | -#define BTM_ESCO_PKT_TYPE_MASK \ | |
309 | - (HCI_ESCO_PKT_TYPES_MASK_HV1 | HCI_ESCO_PKT_TYPES_MASK_HV2 | \ | |
310 | - HCI_ESCO_PKT_TYPES_MASK_HV3) | |
308 | +#define BTM_ESCO_PKT_TYPE_MASK \ | |
309 | + (ESCO_PKT_TYPES_MASK_HV1 | ESCO_PKT_TYPES_MASK_HV2 | ESCO_PKT_TYPES_MASK_HV3) | |
311 | 310 | |
312 | 311 | #define BTM_SCO_2_ESCO(scotype) \ |
313 | 312 | ((uint16_t)(((scotype)&BTM_SCO_PKT_TYPE_MASK) >> 5)) |
@@ -316,21 +315,21 @@ typedef void(tBTM_SCO_IND_CBACK)(uint16_t sco_inx); | ||
316 | 315 | |
317 | 316 | /* Define masks for supported and exception 2.0 SCO packet types |
318 | 317 | */ |
319 | -#define BTM_SCO_SUPPORTED_PKTS_MASK \ | |
320 | - (HCI_ESCO_PKT_TYPES_MASK_HV1 | HCI_ESCO_PKT_TYPES_MASK_HV2 | \ | |
321 | - HCI_ESCO_PKT_TYPES_MASK_HV3 | HCI_ESCO_PKT_TYPES_MASK_EV3 | \ | |
322 | - HCI_ESCO_PKT_TYPES_MASK_EV4 | HCI_ESCO_PKT_TYPES_MASK_EV5) | |
318 | +#define BTM_SCO_SUPPORTED_PKTS_MASK \ | |
319 | + (ESCO_PKT_TYPES_MASK_HV1 | ESCO_PKT_TYPES_MASK_HV2 | \ | |
320 | + ESCO_PKT_TYPES_MASK_HV3 | ESCO_PKT_TYPES_MASK_EV3 | \ | |
321 | + ESCO_PKT_TYPES_MASK_EV4 | ESCO_PKT_TYPES_MASK_EV5) | |
323 | 322 | |
324 | -#define BTM_SCO_EXCEPTION_PKTS_MASK \ | |
325 | - (HCI_ESCO_PKT_TYPES_MASK_NO_2_EV3 | HCI_ESCO_PKT_TYPES_MASK_NO_3_EV3 | \ | |
326 | - HCI_ESCO_PKT_TYPES_MASK_NO_2_EV5 | HCI_ESCO_PKT_TYPES_MASK_NO_3_EV5) | |
323 | +#define BTM_SCO_EXCEPTION_PKTS_MASK \ | |
324 | + (ESCO_PKT_TYPES_MASK_NO_2_EV3 | ESCO_PKT_TYPES_MASK_NO_3_EV3 | \ | |
325 | + ESCO_PKT_TYPES_MASK_NO_2_EV5 | ESCO_PKT_TYPES_MASK_NO_3_EV5) | |
327 | 326 | |
328 | 327 | #define BTM_SCO_ROUTE_UNKNOWN 0xff |
329 | 328 | |
330 | 329 | /* Define the structure that contains (e)SCO data */ |
331 | 330 | typedef struct { |
332 | 331 | tBTM_ESCO_CBACK* p_esco_cback; /* Callback for eSCO events */ |
333 | - tBTM_ESCO_PARAMS setup; | |
332 | + enh_esco_params_t setup; | |
334 | 333 | tBTM_ESCO_DATA data; /* Connection complete information */ |
335 | 334 | uint8_t hci_status; |
336 | 335 | } tBTM_ESCO_INFO; |
@@ -356,26 +355,17 @@ typedef struct { | ||
356 | 355 | tBTM_SCO_IND_CBACK* app_sco_ind_cb; |
357 | 356 | #if (BTM_SCO_HCI_INCLUDED == TRUE) |
358 | 357 | tBTM_SCO_DATA_CB* p_data_cb; /* Callback for SCO data over HCI */ |
359 | - uint32_t xmit_window_size; /* Total SCO window in bytes */ | |
360 | 358 | #endif |
361 | 359 | tSCO_CONN sco_db[BTM_MAX_SCO_LINKS]; |
362 | - tBTM_ESCO_PARAMS def_esco_parms; | |
363 | - BD_ADDR xfer_addr; | |
360 | + enh_esco_params_t def_esco_parms; | |
364 | 361 | uint16_t sco_disc_reason; |
365 | - bool esco_supported; /* true if 1.2 cntlr AND supports eSCO links */ | |
366 | - tBTM_SCO_TYPE desired_sco_mode; | |
367 | - tBTM_SCO_TYPE xfer_sco_type; | |
368 | - tBTM_SCO_PCM_PARAM sco_pcm_param; | |
369 | - tBTM_SCO_CODEC_TYPE codec_in_use; /* None, CVSD, MSBC, etc. */ | |
370 | -#if (BTM_SCO_HCI_INCLUDED == TRUE) | |
371 | - tBTM_SCO_ROUTE_TYPE sco_path; | |
372 | -#endif | |
373 | - | |
362 | + bool esco_supported; /* true if 1.2 cntlr AND supports eSCO links */ | |
363 | + esco_data_path_t sco_route; /* HCI, PCM, or TEST */ | |
374 | 364 | } tSCO_CB; |
375 | 365 | |
376 | 366 | #if (BTM_SCO_INCLUDED == TRUE) |
377 | 367 | extern void btm_set_sco_ind_cback(tBTM_SCO_IND_CBACK* sco_ind_cb); |
378 | -extern void btm_accept_sco_link(uint16_t sco_inx, tBTM_ESCO_PARAMS* p_setup, | |
368 | +extern void btm_accept_sco_link(uint16_t sco_inx, enh_esco_params_t* p_setup, | |
379 | 369 | tBTM_SCO_CB* p_conn_cb, tBTM_SCO_CB* p_disc_cb); |
380 | 370 | extern void btm_reject_sco_link(uint16_t sco_inx); |
381 | 371 | extern void btm_sco_chk_pend_rolechange(uint16_t hci_handle); |
@@ -32,6 +32,7 @@ | ||
32 | 32 | #include "btm_int.h" |
33 | 33 | #include "btu.h" |
34 | 34 | #include "device/include/controller.h" |
35 | +#include "device/include/esco_parameters.h" | |
35 | 36 | #include "hcidefs.h" |
36 | 37 | #include "hcimsgs.h" |
37 | 38 | #include "osi/include/osi.h" |
@@ -56,17 +57,7 @@ | ||
56 | 57 | /* L O C A L F U N C T I O N P R O T O T Y P E S */ |
57 | 58 | /******************************************************************************/ |
58 | 59 | |
59 | -static const tBTM_ESCO_PARAMS btm_esco_defaults = { | |
60 | - BTM_64KBITS_RATE, /* TX Bandwidth (64 kbits/sec) */ | |
61 | - BTM_64KBITS_RATE, /* RX Bandwidth (64 kbits/sec) */ | |
62 | - 0x000c, /* 12 ms (HS/HF can use EV3, 2-EV3, 3-EV3) */ | |
63 | - 0x0060, /* Inp Linear, Air CVSD, 2s Comp, 16bit */ | |
64 | - (BTM_SCO_PKT_TYPES_MASK_HV1 + /* Packet Types */ | |
65 | - BTM_SCO_PKT_TYPES_MASK_HV2 + BTM_SCO_PKT_TYPES_MASK_HV3 + | |
66 | - BTM_SCO_PKT_TYPES_MASK_EV3 + BTM_SCO_PKT_TYPES_MASK_EV4 + | |
67 | - BTM_SCO_PKT_TYPES_MASK_EV5), | |
68 | - BTM_ESCO_RETRANS_QUALITY /* Retransmission Effort */ | |
69 | -}; | |
60 | +static uint16_t btm_sco_voice_settings_to_legacy(enh_esco_params_t* p_parms); | |
70 | 61 | |
71 | 62 | /******************************************************************************* |
72 | 63 | * |
@@ -107,13 +98,11 @@ void btm_sco_init(void) { | ||
107 | 98 | for (int i = 0; i < BTM_MAX_SCO_LINKS; i++) |
108 | 99 | btm_cb.sco_cb.sco_db[i].xmit_data_q = fixed_queue_new(SIZE_MAX); |
109 | 100 | #endif |
110 | - | |
111 | 101 | /* Initialize nonzero defaults */ |
112 | 102 | btm_cb.sco_cb.sco_disc_reason = BTM_INVALID_SCO_DISC_REASON; |
113 | - | |
114 | - btm_cb.sco_cb.def_esco_parms = | |
115 | - btm_esco_defaults; /* Initialize with defaults */ | |
116 | - btm_cb.sco_cb.desired_sco_mode = BTM_DEFAULT_SCO_MODE; | |
103 | + btm_cb.sco_cb.def_esco_parms = esco_parameters_for_codec(ESCO_CODEC_CVSD); | |
104 | + btm_cb.sco_cb.def_esco_parms.max_latency_ms = 12; | |
105 | + btm_cb.sco_cb.sco_route = ESCO_DATA_PATH_PCM; | |
117 | 106 | } |
118 | 107 | |
119 | 108 | /******************************************************************************* |
@@ -133,11 +122,9 @@ void btm_sco_init(void) { | ||
133 | 122 | * |
134 | 123 | ******************************************************************************/ |
135 | 124 | static void btm_esco_conn_rsp(uint16_t sco_inx, uint8_t hci_status, BD_ADDR bda, |
136 | - tBTM_ESCO_PARAMS* p_parms) { | |
125 | + enh_esco_params_t* p_parms) { | |
137 | 126 | #if (BTM_MAX_SCO_LINKS > 0) |
138 | 127 | tSCO_CONN* p_sco = NULL; |
139 | - tBTM_ESCO_PARAMS* p_setup; | |
140 | - uint16_t temp_pkt_types; | |
141 | 128 | |
142 | 129 | if (sco_inx < BTM_MAX_SCO_LINKS) p_sco = &btm_cb.sco_cb.sco_db[sco_inx]; |
143 | 130 |
@@ -147,52 +134,72 @@ static void btm_esco_conn_rsp(uint16_t sco_inx, uint8_t hci_status, BD_ADDR bda, | ||
147 | 134 | p_sco->state = (p_sco->state == SCO_ST_W4_CONN_RSP) ? SCO_ST_LISTENING |
148 | 135 | : SCO_ST_UNUSED; |
149 | 136 | } |
150 | - | |
151 | 137 | if (!btm_cb.sco_cb.esco_supported) { |
152 | 138 | btsnd_hcic_reject_conn(bda, hci_status); |
153 | 139 | } else { |
154 | 140 | btsnd_hcic_reject_esco_conn(bda, hci_status); |
155 | 141 | } |
156 | - } else /* Connection is being accepted */ | |
157 | - { | |
142 | + } else { | |
143 | + /* Connection is being accepted */ | |
158 | 144 | p_sco->state = SCO_ST_CONNECTING; |
159 | - p_setup = &p_sco->esco.setup; | |
145 | + enh_esco_params_t* p_setup = &p_sco->esco.setup; | |
160 | 146 | /* If parameters not specified use the default */ |
161 | - if (p_parms) | |
147 | + if (p_parms) { | |
162 | 148 | *p_setup = *p_parms; |
163 | - else /* Use the last setup passed thru BTM_SetEscoMode (or defaults) */ | |
164 | - { | |
149 | + } else { | |
150 | + /* Use the last setup passed thru BTM_SetEscoMode (or defaults) */ | |
165 | 151 | *p_setup = btm_cb.sco_cb.def_esco_parms; |
166 | 152 | } |
167 | 153 | |
168 | - temp_pkt_types = (p_setup->packet_types & BTM_SCO_SUPPORTED_PKTS_MASK & | |
169 | - btm_cb.btm_sco_pkt_types_supported); | |
154 | + uint16_t temp_packet_types = | |
155 | + (p_setup->packet_types & BTM_SCO_SUPPORTED_PKTS_MASK & | |
156 | + btm_cb.btm_sco_pkt_types_supported); | |
170 | 157 | |
171 | 158 | /* Make sure at least one eSCO packet type is sent, else might confuse peer |
172 | 159 | */ |
173 | 160 | /* Taking this out to confirm with BQB tests |
174 | 161 | ** Real application would like to include this though, as many devices |
175 | 162 | ** do not retry with SCO only if an eSCO connection fails. |
176 | - if (!(temp_pkt_types & BTM_ESCO_LINK_ONLY_MASK)) | |
163 | + if (!(temp_packet_types & BTM_ESCO_LINK_ONLY_MASK)) | |
177 | 164 | { |
178 | - temp_pkt_types |= BTM_SCO_PKT_TYPES_MASK_EV3; | |
165 | + temp_packet_types |= BTM_SCO_PKT_TYPES_MASK_EV3; | |
179 | 166 | } |
180 | 167 | */ |
181 | 168 | /* If SCO request, remove eSCO packet types (conformance) */ |
182 | 169 | if (p_sco->esco.data.link_type == BTM_LINK_TYPE_SCO) { |
183 | - temp_pkt_types &= BTM_SCO_LINK_ONLY_MASK; | |
184 | - temp_pkt_types |= BTM_SCO_EXCEPTION_PKTS_MASK; | |
170 | + temp_packet_types &= BTM_SCO_LINK_ONLY_MASK; | |
171 | + temp_packet_types |= BTM_SCO_EXCEPTION_PKTS_MASK; | |
185 | 172 | } else { |
186 | 173 | /* OR in any exception packet types */ |
187 | - temp_pkt_types |= | |
174 | + temp_packet_types |= | |
188 | 175 | ((p_setup->packet_types & BTM_SCO_EXCEPTION_PKTS_MASK) | |
189 | 176 | (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_EXCEPTION_PKTS_MASK)); |
190 | 177 | } |
191 | 178 | |
192 | - btsnd_hcic_accept_esco_conn(bda, p_setup->tx_bw, p_setup->rx_bw, | |
193 | - p_setup->max_latency, p_setup->voice_contfmt, | |
194 | - p_setup->retrans_effort, temp_pkt_types); | |
195 | - p_setup->packet_types = temp_pkt_types; | |
179 | + /* Use Enhanced Synchronous commands if supported */ | |
180 | + if (controller_get_interface() | |
181 | + ->supports_enhanced_setup_synchronous_connection()) { | |
182 | + /* Use the saved SCO routing */ | |
183 | + p_setup->input_data_path = p_setup->output_data_path = | |
184 | + btm_cb.sco_cb.sco_route; | |
185 | + | |
186 | + BTM_TRACE_DEBUG( | |
187 | + "%s: txbw 0x%x, rxbw 0x%x, lat 0x%x, retrans 0x%02x, " | |
188 | + "pkt 0x%04x, path %u", | |
189 | + __func__, p_setup->transmit_bandwidth, p_setup->receive_bandwidth, | |
190 | + p_setup->max_latency_ms, p_setup->retransmission_effort, | |
191 | + p_setup->packet_types, p_setup->input_data_path); | |
192 | + | |
193 | + btsnd_hcic_enhanced_accept_synchronous_connection(bda, p_setup); | |
194 | + | |
195 | + } else { | |
196 | + /* Use legacy command if enhanced SCO setup is not supported */ | |
197 | + uint16_t voice_content_format = btm_sco_voice_settings_to_legacy(p_setup); | |
198 | + btsnd_hcic_accept_esco_conn( | |
199 | + bda, p_setup->transmit_bandwidth, p_setup->receive_bandwidth, | |
200 | + p_setup->max_latency_ms, voice_content_format, | |
201 | + p_setup->retransmission_effort, p_setup->packet_types); | |
202 | + } | |
196 | 203 | } |
197 | 204 | #endif |
198 | 205 | } |
@@ -328,12 +335,12 @@ tBTM_STATUS BTM_WriteScoData(uint16_t sco_inx, BT_HDR* p_buf) { | ||
328 | 335 | } else { |
329 | 336 | osi_free(p_buf); |
330 | 337 | |
331 | - BTM_TRACE_WARNING("BTM_WriteScoData, invalid sco index: %d at state [%d]", | |
332 | - sco_inx, btm_cb.sco_cb.sco_db[sco_inx].state); | |
338 | + BTM_TRACE_ERROR("%s:invalid sco index: %d at state [%d]", __func__, sco_inx, | |
339 | + btm_cb.sco_cb.sco_db[sco_inx].state); | |
333 | 340 | status = BTM_UNKNOWN_ADDR; |
334 | 341 | } |
335 | 342 | |
336 | - return (status); | |
343 | + return status; | |
337 | 344 | } |
338 | 345 | #else |
339 | 346 | tBTM_STATUS BTM_WriteScoData(UNUSED_ATTR uint16_t sco_inx, |
@@ -354,50 +361,49 @@ tBTM_STATUS BTM_WriteScoData(UNUSED_ATTR uint16_t sco_inx, | ||
354 | 361 | * |
355 | 362 | ******************************************************************************/ |
356 | 363 | static tBTM_STATUS btm_send_connect_request(uint16_t acl_handle, |
357 | - tBTM_ESCO_PARAMS* p_setup) { | |
358 | - uint16_t temp_pkt_types; | |
359 | - uint8_t xx; | |
364 | + enh_esco_params_t* p_setup) { | |
360 | 365 | tACL_CONN* p_acl; |
361 | 366 | |
362 | 367 | /* Send connect request depending on version of spec */ |
363 | 368 | if (!btm_cb.sco_cb.esco_supported) { |
364 | 369 | btsnd_hcic_add_SCO_conn(acl_handle, BTM_ESCO_2_SCO(p_setup->packet_types)); |
365 | 370 | } else { |
366 | - temp_pkt_types = (p_setup->packet_types & BTM_SCO_SUPPORTED_PKTS_MASK & | |
367 | - btm_cb.btm_sco_pkt_types_supported); | |
371 | + uint16_t temp_packet_types = | |
372 | + (p_setup->packet_types & BTM_SCO_SUPPORTED_PKTS_MASK & | |
373 | + btm_cb.btm_sco_pkt_types_supported); | |
368 | 374 | |
369 | 375 | /* OR in any exception packet types */ |
370 | - temp_pkt_types |= | |
376 | + temp_packet_types |= | |
371 | 377 | ((p_setup->packet_types & BTM_SCO_EXCEPTION_PKTS_MASK) | |
372 | 378 | (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_EXCEPTION_PKTS_MASK)); |
373 | 379 | |
374 | 380 | /* Finally, remove EDR eSCO if the remote device doesn't support it */ |
375 | 381 | /* UPF25: Only SCO was brought up in this case */ |
376 | 382 | btm_handle_to_acl_index(acl_handle); |
377 | - xx = btm_handle_to_acl_index(acl_handle); | |
378 | - if (xx < MAX_L2CAP_LINKS) { | |
379 | - p_acl = &btm_cb.acl_db[xx]; | |
383 | + uint8_t acl_index = btm_handle_to_acl_index(acl_handle); | |
384 | + if (acl_index < MAX_L2CAP_LINKS) { | |
385 | + p_acl = &btm_cb.acl_db[acl_index]; | |
380 | 386 | if (!HCI_EDR_ESCO_2MPS_SUPPORTED(p_acl->peer_lmp_feature_pages[0])) { |
381 | 387 | BTM_TRACE_WARNING("BTM Remote does not support 2-EDR eSCO"); |
382 | - temp_pkt_types |= (HCI_ESCO_PKT_TYPES_MASK_NO_2_EV3 | | |
383 | - HCI_ESCO_PKT_TYPES_MASK_NO_2_EV5); | |
388 | + temp_packet_types |= | |
389 | + (ESCO_PKT_TYPES_MASK_NO_2_EV3 | ESCO_PKT_TYPES_MASK_NO_2_EV5); | |
384 | 390 | } |
385 | 391 | if (!HCI_EDR_ESCO_3MPS_SUPPORTED(p_acl->peer_lmp_feature_pages[0])) { |
386 | 392 | BTM_TRACE_WARNING("BTM Remote does not support 3-EDR eSCO"); |
387 | - temp_pkt_types |= (HCI_ESCO_PKT_TYPES_MASK_NO_3_EV3 | | |
388 | - HCI_ESCO_PKT_TYPES_MASK_NO_3_EV5); | |
393 | + temp_packet_types |= | |
394 | + (ESCO_PKT_TYPES_MASK_NO_3_EV3 | ESCO_PKT_TYPES_MASK_NO_3_EV5); | |
389 | 395 | } |
390 | 396 | |
391 | 397 | /* Check to see if BR/EDR Secure Connections is being used |
392 | 398 | ** If so, we cannot use SCO-only packet types (HFP 1.7) |
393 | 399 | */ |
394 | 400 | if (BTM_BothEndsSupportSecureConnections(p_acl->remote_addr)) { |
395 | - temp_pkt_types &= ~(BTM_SCO_PKT_TYPE_MASK); | |
401 | + temp_packet_types &= ~(BTM_SCO_PKT_TYPE_MASK); | |
396 | 402 | BTM_TRACE_DEBUG("%s: SCO Conn: pkt_types after removing SCO (0x%04x)", |
397 | - __func__, temp_pkt_types); | |
403 | + __func__, temp_packet_types); | |
398 | 404 | |
399 | 405 | /* Return error if no packet types left */ |
400 | - if (temp_pkt_types == 0) { | |
406 | + if (temp_packet_types == 0) { | |
401 | 407 | BTM_TRACE_ERROR("%s: SCO Conn (BR/EDR SC): No packet types available", |
402 | 408 | __func__); |
403 | 409 | return (BTM_WRONG_MODE); |
@@ -409,16 +415,41 @@ static tBTM_STATUS btm_send_connect_request(uint16_t acl_handle, | ||
409 | 415 | } |
410 | 416 | } |
411 | 417 | |
412 | - BTM_TRACE_API( | |
413 | - " txbw 0x%x, rxbw 0x%x, lat 0x%x, voice 0x%x, retrans 0x%02x, pkt " | |
414 | - "0x%04x", | |
415 | - p_setup->tx_bw, p_setup->rx_bw, p_setup->max_latency, | |
416 | - p_setup->voice_contfmt, p_setup->retrans_effort, temp_pkt_types); | |
417 | - | |
418 | - btsnd_hcic_setup_esco_conn(acl_handle, p_setup->tx_bw, p_setup->rx_bw, | |
419 | - p_setup->max_latency, p_setup->voice_contfmt, | |
420 | - p_setup->retrans_effort, temp_pkt_types); | |
421 | - p_setup->packet_types = temp_pkt_types; | |
418 | + /* Save the previous types in case command fails */ | |
419 | + uint16_t saved_packet_types = p_setup->packet_types; | |
420 | + p_setup->packet_types = temp_packet_types; | |
421 | + | |
422 | + /* Use Enhanced Synchronous commands if supported */ | |
423 | + if (controller_get_interface() | |
424 | + ->supports_enhanced_setup_synchronous_connection()) { | |
425 | + /* Use the saved SCO routing */ | |
426 | + p_setup->input_data_path = p_setup->output_data_path = | |
427 | + btm_cb.sco_cb.sco_route; | |
428 | + | |
429 | + BTM_TRACE_DEBUG( | |
430 | + "%s: txbw 0x%x, rxbw 0x%x, " | |
431 | + "lat 0x%x, retrans 0x%02x, pkt 0x%04x, path %u", | |
432 | + __func__, p_setup->transmit_bandwidth, p_setup->receive_bandwidth, | |
433 | + p_setup->max_latency_ms, p_setup->retransmission_effort, | |
434 | + p_setup->packet_types, p_setup->input_data_path); | |
435 | + | |
436 | + btsnd_hcic_enhanced_set_up_synchronous_connection(acl_handle, p_setup); | |
437 | + p_setup->packet_types = saved_packet_types; | |
438 | + } else { /* Use older command */ | |
439 | + uint16_t voice_content_format = btm_sco_voice_settings_to_legacy(p_setup); | |
440 | + | |
441 | + BTM_TRACE_API( | |
442 | + "%s: txbw 0x%x, rxbw 0x%x, " | |
443 | + "lat 0x%x, voice 0x%x, retrans 0x%02x, pkt 0x%04x", | |
444 | + __func__, p_setup->transmit_bandwidth, p_setup->receive_bandwidth, | |
445 | + p_setup->max_latency_ms, voice_content_format, | |
446 | + p_setup->retransmission_effort, p_setup->packet_types); | |
447 | + | |
448 | + btsnd_hcic_setup_esco_conn( | |
449 | + acl_handle, p_setup->transmit_bandwidth, p_setup->receive_bandwidth, | |
450 | + p_setup->max_latency_ms, voice_content_format, | |
451 | + p_setup->retransmission_effort, p_setup->packet_types); | |
452 | + } | |
422 | 453 | } |
423 | 454 | |
424 | 455 | return (BTM_CMD_STARTED); |
@@ -449,7 +480,7 @@ void btm_set_sco_ind_cback(tBTM_SCO_IND_CBACK* sco_ind_cb) { | ||
449 | 480 | * Returns void |
450 | 481 | * |
451 | 482 | ******************************************************************************/ |
452 | -void btm_accept_sco_link(uint16_t sco_inx, tBTM_ESCO_PARAMS* p_setup, | |
483 | +void btm_accept_sco_link(uint16_t sco_inx, enh_esco_params_t* p_setup, | |
453 | 484 | tBTM_SCO_CB* p_conn_cb, tBTM_SCO_CB* p_disc_cb) { |
454 | 485 | #if (BTM_MAX_SCO_LINKS > 0) |
455 | 486 | tSCO_CONN* p_sco; |
@@ -513,11 +544,10 @@ tBTM_STATUS BTM_CreateSco(BD_ADDR remote_bda, bool is_orig, uint16_t pkt_types, | ||
513 | 544 | uint16_t* p_sco_inx, tBTM_SCO_CB* p_conn_cb, |
514 | 545 | tBTM_SCO_CB* p_disc_cb) { |
515 | 546 | #if (BTM_MAX_SCO_LINKS > 0) |
516 | - tBTM_ESCO_PARAMS* p_setup; | |
547 | + enh_esco_params_t* p_setup; | |
517 | 548 | tSCO_CONN* p = &btm_cb.sco_cb.sco_db[0]; |
518 | 549 | uint16_t xx; |
519 | 550 | uint16_t acl_handle = 0; |
520 | - uint16_t temp_pkt_types; | |
521 | 551 | tACL_CONN* p_acl; |
522 | 552 | |
523 | 553 | #if (BTM_SCO_WAKE_PARKED_LINK == TRUE) |
@@ -530,10 +560,21 @@ tBTM_STATUS BTM_CreateSco(BD_ADDR remote_bda, bool is_orig, uint16_t pkt_types, | ||
530 | 560 | *p_sco_inx = BTM_INVALID_SCO_INDEX; |
531 | 561 | |
532 | 562 | /* If originating, ensure that there is an ACL connection to the BD Address */ |
563 | + | |
533 | 564 | if (is_orig) { |
534 | - if ((!remote_bda) || ((acl_handle = BTM_GetHCIConnHandle( | |
535 | - remote_bda, BT_TRANSPORT_BR_EDR)) == 0xFFFF)) | |
536 | - return (BTM_UNKNOWN_ADDR); | |
565 | + if (!remote_bda) { | |
566 | + BTM_TRACE_ERROR("%s: remote_bda is null", __func__); | |
567 | + return BTM_ILLEGAL_VALUE; | |
568 | + } | |
569 | + acl_handle = BTM_GetHCIConnHandle(remote_bda, BT_TRANSPORT_BR_EDR); | |
570 | + if (acl_handle == 0xFFFF) { | |
571 | + BTM_TRACE_ERROR( | |
572 | + "%s: cannot find ACL handle for remote device " | |
573 | + "%02x:%02x:%02x:%02x:%02x:%02x", | |
574 | + __func__, remote_bda[0], remote_bda[1], remote_bda[2], remote_bda[3], | |
575 | + remote_bda[4], remote_bda[5]); | |
576 | + return BTM_UNKNOWN_ADDR; | |
577 | + } | |
537 | 578 | } |
538 | 579 | |
539 | 580 | if (remote_bda) { |
@@ -542,19 +583,17 @@ tBTM_STATUS BTM_CreateSco(BD_ADDR remote_bda, bool is_orig, uint16_t pkt_types, | ||
542 | 583 | if (((p->state == SCO_ST_CONNECTING) || (p->state == SCO_ST_LISTENING) || |
543 | 584 | (p->state == SCO_ST_PEND_UNPARK)) && |
544 | 585 | (!memcmp(p->esco.data.bd_addr, remote_bda, BD_ADDR_LEN))) { |
545 | - return (BTM_BUSY); | |
586 | + return BTM_BUSY; | |
546 | 587 | } |
547 | 588 | } |
548 | 589 | } else { |
549 | 590 | /* Support only 1 wildcard BD address at a time */ |
550 | 591 | for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { |
551 | - if ((p->state == SCO_ST_LISTENING) && (!p->rem_bd_known)) | |
552 | - return (BTM_BUSY); | |
592 | + if ((p->state == SCO_ST_LISTENING) && (!p->rem_bd_known)) return BTM_BUSY; | |
553 | 593 | } |
554 | 594 | } |
555 | 595 | |
556 | - /* Now, try to find an unused control block, and kick off the SCO | |
557 | - * establishment */ | |
596 | + /* Try to find an unused control block, and kick off the SCO establishment */ | |
558 | 597 | for (xx = 0, p = &btm_cb.sco_cb.sco_db[0]; xx < BTM_MAX_SCO_LINKS; |
559 | 598 | xx++, p++) { |
560 | 599 | if (p->state == SCO_ST_UNUSED) { |
@@ -585,33 +624,20 @@ tBTM_STATUS BTM_CreateSco(BD_ADDR remote_bda, bool is_orig, uint16_t pkt_types, | ||
585 | 624 | } else |
586 | 625 | p->rem_bd_known = false; |
587 | 626 | |
588 | - /* Link role is ignored in for this message */ | |
589 | - if (pkt_types == BTM_IGNORE_SCO_PKT_TYPE) | |
590 | - pkt_types = btm_cb.sco_cb.def_esco_parms.packet_types; | |
591 | - | |
592 | 627 | p_setup = &p->esco.setup; |
593 | 628 | *p_setup = btm_cb.sco_cb.def_esco_parms; |
594 | - p_setup->packet_types = | |
595 | - (btm_cb.sco_cb.desired_sco_mode == BTM_LINK_TYPE_SCO) | |
596 | - ? (pkt_types & BTM_SCO_LINK_ONLY_MASK) | |
597 | - : pkt_types; | |
598 | - | |
599 | - temp_pkt_types = (p_setup->packet_types & BTM_SCO_SUPPORTED_PKTS_MASK & | |
600 | - btm_cb.btm_sco_pkt_types_supported); | |
601 | 629 | |
630 | + /* Determine the packet types */ | |
631 | + p_setup->packet_types = pkt_types & BTM_SCO_SUPPORTED_PKTS_MASK & | |
632 | + btm_cb.btm_sco_pkt_types_supported; | |
602 | 633 | /* OR in any exception packet types */ |
603 | 634 | if (controller_get_interface()->get_bt_version()->hci_version >= |
604 | 635 | HCI_PROTO_VERSION_2_0) { |
605 | - temp_pkt_types |= | |
606 | - ((p_setup->packet_types & BTM_SCO_EXCEPTION_PKTS_MASK) | | |
607 | - (btm_cb.btm_sco_pkt_types_supported & | |
608 | - BTM_SCO_EXCEPTION_PKTS_MASK)); | |
609 | - } else /* Only using SCO packet types; turn off EDR also */ | |
610 | - { | |
611 | - temp_pkt_types |= BTM_SCO_EXCEPTION_PKTS_MASK; | |
636 | + p_setup->packet_types |= | |
637 | + (pkt_types & BTM_SCO_EXCEPTION_PKTS_MASK) | | |
638 | + (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_EXCEPTION_PKTS_MASK); | |
612 | 639 | } |
613 | 640 | |
614 | - p_setup->packet_types = temp_pkt_types; | |
615 | 641 | p->p_conn_cb = p_conn_cb; |
616 | 642 | p->p_disc_cb = p_disc_cb; |
617 | 643 | p->hci_handle = BTM_INVALID_HCI_HANDLE; |
@@ -633,10 +659,8 @@ tBTM_STATUS BTM_CreateSco(BD_ADDR remote_bda, bool is_orig, uint16_t pkt_types, | ||
633 | 659 | if (p->state != SCO_ST_PEND_UNPARK && |
634 | 660 | p->state != SCO_ST_PEND_ROLECHANGE) { |
635 | 661 | if (is_orig) { |
636 | - BTM_TRACE_API( | |
637 | - "BTM_CreateSco -> (e)SCO Link for ACL handle 0x%04x, Desired " | |
638 | - "Type %d", | |
639 | - acl_handle, btm_cb.sco_cb.desired_sco_mode); | |
662 | + BTM_TRACE_API("%s:(e)SCO Link for ACL handle 0x%04x", __func__, | |
663 | + acl_handle); | |
640 | 664 | |
641 | 665 | if ((btm_send_connect_request(acl_handle, p_setup)) != |
642 | 666 | BTM_CMD_STARTED) |
@@ -649,13 +673,13 @@ tBTM_STATUS BTM_CreateSco(BD_ADDR remote_bda, bool is_orig, uint16_t pkt_types, | ||
649 | 673 | |
650 | 674 | *p_sco_inx = xx; |
651 | 675 | |
652 | - return (BTM_CMD_STARTED); | |
676 | + return BTM_CMD_STARTED; | |
653 | 677 | } |
654 | 678 | } |
655 | 679 | |
656 | 680 | #endif |
657 | 681 | /* If here, all SCO blocks in use */ |
658 | - return (BTM_NO_RESOURCES); | |
682 | + return BTM_NO_RESOURCES; | |
659 | 683 | } |
660 | 684 | |
661 | 685 | #if (BTM_SCO_WAKE_PARKED_LINK == TRUE) |
@@ -683,9 +707,9 @@ void btm_sco_chk_pend_unpark(uint8_t hci_status, uint16_t hci_handle) { | ||
683 | 707 | |
684 | 708 | { |
685 | 709 | BTM_TRACE_API( |
686 | - "btm_sco_chk_pend_unpark -> (e)SCO Link for ACL handle 0x%04x, " | |
687 | - "Desired Type %d, hci_status 0x%02x", | |
688 | - acl_handle, btm_cb.sco_cb.desired_sco_mode, hci_status); | |
710 | + "%s:(e)SCO Link for ACL " | |
711 | + "handle 0x%04x, hci_status 0x%02x", | |
712 | + __func__, acl_handle, hci_status); | |
689 | 713 | |
690 | 714 | if ((btm_send_connect_request(acl_handle, &p->esco.setup)) == |
691 | 715 | BTM_CMD_STARTED) |
@@ -919,8 +943,8 @@ void btm_sco_connected(uint8_t hci_status, BD_ADDR bda, uint16_t hci_handle, | ||
919 | 943 | if (spt) { |
920 | 944 | parms.packet_types = p->esco.setup.packet_types; |
921 | 945 | /* Keep the other parameters the same for SCO */ |
922 | - parms.max_latency = p->esco.setup.max_latency; | |
923 | - parms.retrans_effort = p->esco.setup.retrans_effort; | |
946 | + parms.max_latency_ms = p->esco.setup.max_latency_ms; | |
947 | + parms.retransmission_effort = p->esco.setup.retransmission_effort; | |
924 | 948 | |
925 | 949 | BTM_ChangeEScoLinkParms(xx, &parms); |
926 | 950 | } |
@@ -1140,8 +1164,8 @@ tBTM_STATUS BTM_SetScoPacketTypes(uint16_t sco_inx, uint16_t pkt_types) { | ||
1140 | 1164 | parms.packet_types = pkt_types; |
1141 | 1165 | |
1142 | 1166 | /* Keep the other parameters the same for SCO */ |
1143 | - parms.max_latency = p->esco.setup.max_latency; | |
1144 | - parms.retrans_effort = p->esco.setup.retrans_effort; | |
1167 | + parms.max_latency_ms = p->esco.setup.max_latency_ms; | |
1168 | + parms.retransmission_effort = p->esco.setup.retransmission_effort; | |
1145 | 1169 | |
1146 | 1170 | return (BTM_ChangeEScoLinkParms(sco_inx, &parms)); |
1147 | 1171 | #else |
@@ -1291,43 +1315,27 @@ uint8_t* BTM_ReadScoBdAddr(uint16_t sco_inx) { | ||
1291 | 1315 | * BTM_BUSY if there are one or more active (e)SCO links. |
1292 | 1316 | * |
1293 | 1317 | ******************************************************************************/ |
1294 | -tBTM_STATUS BTM_SetEScoMode(tBTM_SCO_TYPE sco_mode, tBTM_ESCO_PARAMS* p_parms) { | |
1295 | - tSCO_CB* p_esco = &btm_cb.sco_cb; | |
1296 | - tBTM_ESCO_PARAMS* p_def = &p_esco->def_esco_parms; | |
1318 | +tBTM_STATUS BTM_SetEScoMode(enh_esco_params_t* p_parms) { | |
1319 | + enh_esco_params_t* p_def = &btm_cb.sco_cb.def_esco_parms; | |
1297 | 1320 | |
1298 | - if (p_esco->esco_supported) { | |
1299 | - if (p_parms) { | |
1300 | - if (sco_mode == BTM_LINK_TYPE_ESCO) | |
1301 | - *p_def = *p_parms; /* Save as the default parameters */ | |
1302 | - else /* Load only the SCO packet types */ | |
1303 | - { | |
1304 | - p_def->packet_types = p_parms->packet_types; | |
1305 | - p_def->tx_bw = BTM_64KBITS_RATE; | |
1306 | - p_def->rx_bw = BTM_64KBITS_RATE; | |
1307 | - p_def->max_latency = 0x000a; | |
1308 | - p_def->voice_contfmt = 0x0060; | |
1309 | - p_def->retrans_effort = 0; | |
1310 | - | |
1311 | - /* OR in any exception packet types */ | |
1312 | - p_def->packet_types |= BTM_SCO_EXCEPTION_PKTS_MASK; | |
1313 | - } | |
1314 | - } | |
1315 | - p_esco->desired_sco_mode = sco_mode; | |
1316 | - BTM_TRACE_API("BTM_SetEScoMode -> mode %d", sco_mode); | |
1321 | + if (btm_cb.sco_cb.esco_supported) { | |
1322 | + *p_def = *p_parms; | |
1317 | 1323 | } else { |
1318 | - p_esco->desired_sco_mode = BTM_LINK_TYPE_SCO; | |
1324 | + /* Load defaults for SCO only */ | |
1325 | + *p_def = esco_parameters_for_codec(ESCO_CODEC_CVSD); | |
1319 | 1326 | p_def->packet_types &= BTM_SCO_LINK_ONLY_MASK; |
1320 | - p_def->retrans_effort = 0; | |
1321 | - BTM_TRACE_API("BTM_SetEScoMode -> mode SCO (eSCO not supported)"); | |
1327 | + p_def->retransmission_effort = ESCO_RETRANSMISSION_OFF; | |
1328 | + p_def->max_latency_ms = 12; | |
1329 | + BTM_TRACE_WARNING("%s: eSCO not supported", __func__); | |
1322 | 1330 | } |
1323 | 1331 | |
1324 | - BTM_TRACE_DEBUG( | |
1325 | - " txbw 0x%08x, rxbw 0x%08x, max_lat 0x%04x, voice 0x%04x, pkt 0x%04x, " | |
1326 | - "rtx effort 0x%02x", | |
1327 | - p_def->tx_bw, p_def->rx_bw, p_def->max_latency, p_def->voice_contfmt, | |
1328 | - p_def->packet_types, p_def->retrans_effort); | |
1332 | + BTM_TRACE_API( | |
1333 | + "%s: txbw 0x%08x, rxbw 0x%08x, max_lat 0x%04x, " | |
1334 | + "pkt 0x%04x, rtx effort 0x%02x", | |
1335 | + __func__, p_def->transmit_bandwidth, p_def->receive_bandwidth, | |
1336 | + p_def->max_latency_ms, p_def->packet_types, p_def->retransmission_effort); | |
1329 | 1337 | |
1330 | - return (BTM_SUCCESS); | |
1338 | + return BTM_SUCCESS; | |
1331 | 1339 | } |
1332 | 1340 | |
1333 | 1341 | /******************************************************************************* |
@@ -1385,7 +1393,7 @@ tBTM_STATUS BTM_ReadEScoLinkParms(uint16_t sco_inx, tBTM_ESCO_DATA* p_parms) { | ||
1385 | 1393 | #if (BTM_MAX_SCO_LINKS > 0) |
1386 | 1394 | uint8_t index; |
1387 | 1395 | |
1388 | - BTM_TRACE_API("BTM_ReadEScoLinkParms -> sco_inx 0x%04x", sco_inx); | |
1396 | + BTM_TRACE_API("%s: -> sco_inx 0x%04x", __func__, sco_inx); | |
1389 | 1397 | |
1390 | 1398 | if (sco_inx < BTM_MAX_SCO_LINKS && |
1391 | 1399 | btm_cb.sco_cb.sco_db[sco_inx].state >= SCO_ST_CONNECTED) { |
@@ -1396,8 +1404,7 @@ tBTM_STATUS BTM_ReadEScoLinkParms(uint16_t sco_inx, tBTM_ESCO_DATA* p_parms) { | ||
1396 | 1404 | if (sco_inx == BTM_FIRST_ACTIVE_SCO_INDEX) { |
1397 | 1405 | for (index = 0; index < BTM_MAX_SCO_LINKS; index++) { |
1398 | 1406 | if (btm_cb.sco_cb.sco_db[index].state >= SCO_ST_CONNECTED) { |
1399 | - BTM_TRACE_API("BTM_ReadEScoLinkParms the first active SCO index is %d", | |
1400 | - index); | |
1407 | + BTM_TRACE_API("%s: the first active SCO index is %d", __func__, index); | |
1401 | 1408 | *p_parms = btm_cb.sco_cb.sco_db[index].esco.data; |
1402 | 1409 | return (BTM_SUCCESS); |
1403 | 1410 | } |
@@ -1434,17 +1441,17 @@ tBTM_STATUS BTM_ReadEScoLinkParms(uint16_t sco_inx, tBTM_ESCO_DATA* p_parms) { | ||
1434 | 1441 | tBTM_STATUS BTM_ChangeEScoLinkParms(uint16_t sco_inx, |
1435 | 1442 | tBTM_CHG_ESCO_PARAMS* p_parms) { |
1436 | 1443 | #if (BTM_MAX_SCO_LINKS > 0) |
1437 | - tBTM_ESCO_PARAMS* p_setup; | |
1438 | - tSCO_CONN* p_sco; | |
1439 | - uint16_t temp_pkt_types; | |
1440 | 1444 | |
1441 | 1445 | /* Make sure sco handle is valid and on an active link */ |
1442 | 1446 | if (sco_inx >= BTM_MAX_SCO_LINKS || |
1443 | 1447 | btm_cb.sco_cb.sco_db[sco_inx].state != SCO_ST_CONNECTED) |
1444 | 1448 | return (BTM_WRONG_MODE); |
1445 | 1449 | |
1446 | - p_sco = &btm_cb.sco_cb.sco_db[sco_inx]; | |
1447 | - p_setup = &p_sco->esco.setup; | |
1450 | + tSCO_CONN* p_sco = &btm_cb.sco_cb.sco_db[sco_inx]; | |
1451 | + enh_esco_params_t* p_setup = &p_sco->esco.setup; | |
1452 | + | |
1453 | + /* Save the previous types in case command fails */ | |
1454 | + uint16_t saved_packet_types = p_setup->packet_types; | |
1448 | 1455 | |
1449 | 1456 | /* If SCO connection OR eSCO not supported just send change packet types */ |
1450 | 1457 | if (p_sco->esco.data.link_type == BTM_LINK_TYPE_SCO || |
@@ -1453,34 +1460,60 @@ tBTM_STATUS BTM_ChangeEScoLinkParms(uint16_t sco_inx, | ||
1453 | 1460 | p_parms->packet_types & |
1454 | 1461 | (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_LINK_ONLY_MASK); |
1455 | 1462 | |
1456 | - BTM_TRACE_API( | |
1457 | - "BTM_ChangeEScoLinkParms -> SCO Link for handle 0x%04x, pkt 0x%04x", | |
1458 | - p_sco->hci_handle, p_setup->packet_types); | |
1463 | + BTM_TRACE_API("%s: SCO Link for handle 0x%04x, pkt 0x%04x", __func__, | |
1464 | + p_sco->hci_handle, p_setup->packet_types); | |
1465 | + | |
1466 | + BTM_TRACE_API("%s: SCO Link for handle 0x%04x, pkt 0x%04x", __func__, | |
1467 | + p_sco->hci_handle, p_setup->packet_types); | |
1459 | 1468 | |
1460 | 1469 | btsnd_hcic_change_conn_type(p_sco->hci_handle, |
1461 | 1470 | BTM_ESCO_2_SCO(p_setup->packet_types)); |
1462 | - } else { | |
1463 | - temp_pkt_types = (p_parms->packet_types & BTM_SCO_SUPPORTED_PKTS_MASK & | |
1464 | - btm_cb.btm_sco_pkt_types_supported); | |
1471 | + } else /* eSCO is supported and the link type is eSCO */ | |
1472 | + { | |
1473 | + uint16_t temp_packet_types = | |
1474 | + (p_parms->packet_types & BTM_SCO_SUPPORTED_PKTS_MASK & | |
1475 | + btm_cb.btm_sco_pkt_types_supported); | |
1465 | 1476 | |
1466 | 1477 | /* OR in any exception packet types */ |
1467 | - temp_pkt_types |= | |
1478 | + temp_packet_types |= | |
1468 | 1479 | ((p_parms->packet_types & BTM_SCO_EXCEPTION_PKTS_MASK) | |
1469 | 1480 | (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_EXCEPTION_PKTS_MASK)); |
1481 | + p_setup->packet_types = temp_packet_types; | |
1470 | 1482 | |
1471 | - BTM_TRACE_API("BTM_ChangeEScoLinkParms -> eSCO Link for handle 0x%04x", | |
1483 | + BTM_TRACE_API("%s -> eSCO Link for handle 0x%04x", __func__, | |
1472 | 1484 | p_sco->hci_handle); |
1473 | 1485 | BTM_TRACE_API( |
1474 | - " txbw 0x%x, rxbw 0x%x, lat 0x%x, voice 0x%x, retrans 0x%02x, pkt " | |
1475 | - "0x%04x", | |
1476 | - p_setup->tx_bw, p_setup->rx_bw, p_parms->max_latency, | |
1477 | - p_setup->voice_contfmt, p_parms->retrans_effort, temp_pkt_types); | |
1478 | - | |
1479 | - /* When changing an existing link, only change latency, retrans, and pkts */ | |
1480 | - btsnd_hcic_setup_esco_conn( | |
1481 | - p_sco->hci_handle, p_setup->tx_bw, p_setup->rx_bw, p_parms->max_latency, | |
1482 | - p_setup->voice_contfmt, p_parms->retrans_effort, temp_pkt_types); | |
1483 | - p_parms->packet_types = temp_pkt_types; | |
1486 | + " txbw 0x%x, rxbw 0x%x, lat 0x%x, retrans 0x%02x, pkt 0x%04x", | |
1487 | + p_setup->transmit_bandwidth, p_setup->receive_bandwidth, | |
1488 | + p_parms->max_latency_ms, p_parms->retransmission_effort, | |
1489 | + temp_packet_types); | |
1490 | + | |
1491 | + /* Use Enhanced Synchronous commands if supported */ | |
1492 | + if (controller_get_interface() | |
1493 | + ->supports_enhanced_setup_synchronous_connection()) { | |
1494 | + /* Use the saved SCO routing */ | |
1495 | + p_setup->input_data_path = p_setup->output_data_path = | |
1496 | + btm_cb.sco_cb.sco_route; | |
1497 | + | |
1498 | + btsnd_hcic_enhanced_set_up_synchronous_connection(p_sco->hci_handle, | |
1499 | + p_setup); | |
1500 | + p_setup->packet_types = saved_packet_types; | |
1501 | + } else { /* Use older command */ | |
1502 | + uint16_t voice_content_format = btm_sco_voice_settings_to_legacy(p_setup); | |
1503 | + /* When changing an existing link, only change latency, retrans, and | |
1504 | + * pkts */ | |
1505 | + btsnd_hcic_setup_esco_conn(p_sco->hci_handle, p_setup->transmit_bandwidth, | |
1506 | + p_setup->receive_bandwidth, | |
1507 | + p_parms->max_latency_ms, voice_content_format, | |
1508 | + p_parms->retransmission_effort, | |
1509 | + p_setup->packet_types); | |
1510 | + } | |
1511 | + | |
1512 | + BTM_TRACE_API( | |
1513 | + "%s: txbw 0x%x, rxbw 0x%x, lat 0x%x, retrans 0x%02x, pkt 0x%04x", | |
1514 | + __func__, p_setup->transmit_bandwidth, p_setup->receive_bandwidth, | |
1515 | + p_parms->max_latency_ms, p_parms->retransmission_effort, | |
1516 | + temp_packet_types); | |
1484 | 1517 | } |
1485 | 1518 | |
1486 | 1519 | return (BTM_CMD_STARTED); |
@@ -1508,7 +1541,7 @@ tBTM_STATUS BTM_ChangeEScoLinkParms(uint16_t sco_inx, | ||
1508 | 1541 | * |
1509 | 1542 | ******************************************************************************/ |
1510 | 1543 | void BTM_EScoConnRsp(uint16_t sco_inx, uint8_t hci_status, |
1511 | - tBTM_ESCO_PARAMS* p_parms) { | |
1544 | + enh_esco_params_t* p_parms) { | |
1512 | 1545 | #if (BTM_MAX_SCO_LINKS > 0) |
1513 | 1546 | if (sco_inx < BTM_MAX_SCO_LINKS && |
1514 | 1547 | btm_cb.sco_cb.sco_db[sco_inx].state == SCO_ST_W4_CONN_RSP) { |
@@ -1528,12 +1561,9 @@ void BTM_EScoConnRsp(uint16_t sco_inx, uint8_t hci_status, | ||
1528 | 1561 | * Returns tBTM_SCO_TYPE |
1529 | 1562 | * |
1530 | 1563 | ******************************************************************************/ |
1531 | -tBTM_SCO_TYPE btm_read_def_esco_mode(tBTM_ESCO_PARAMS* p_parms) { | |
1564 | +void btm_read_def_esco_mode(enh_esco_params_t* p_parms) { | |
1532 | 1565 | #if (BTM_MAX_SCO_LINKS > 0) |
1533 | 1566 | *p_parms = btm_cb.sco_cb.def_esco_parms; |
1534 | - return btm_cb.sco_cb.desired_sco_mode; | |
1535 | -#else | |
1536 | - return BTM_LINK_TYPE_SCO; | |
1537 | 1567 | #endif |
1538 | 1568 | } |
1539 | 1569 |
@@ -1656,6 +1686,114 @@ bool btm_is_sco_active_by_bdaddr(BD_ADDR remote_bda) { | ||
1656 | 1686 | #endif |
1657 | 1687 | return (false); |
1658 | 1688 | } |
1689 | + | |
1690 | +/******************************************************************************* | |
1691 | + * | |
1692 | + * Function btm_sco_voice_settings_2_legacy | |
1693 | + * | |
1694 | + * Description This function is called to convert the Enhanced eSCO | |
1695 | + * parameters into voice setting parameter mask used | |
1696 | + * for legacy setup synchronous connection HCI commands | |
1697 | + * | |
1698 | + * Returns UINT16 - 16-bit mask for voice settings | |
1699 | + * | |
1700 | + * HCI_INP_CODING_LINEAR 0x0000 (0000000000) | |
1701 | + * HCI_INP_CODING_U_LAW 0x0100 (0100000000) | |
1702 | + * HCI_INP_CODING_A_LAW 0x0200 (1000000000) | |
1703 | + * HCI_INP_CODING_MASK 0x0300 (1100000000) | |
1704 | + * | |
1705 | + * HCI_INP_DATA_FMT_1S_COMPLEMENT 0x0000 (0000000000) | |
1706 | + * HCI_INP_DATA_FMT_2S_COMPLEMENT 0x0040 (0001000000) | |
1707 | + * HCI_INP_DATA_FMT_SIGN_MAGNITUDE 0x0080 (0010000000) | |
1708 | + * HCI_INP_DATA_FMT_UNSIGNED 0x00c0 (0011000000) | |
1709 | + * HCI_INP_DATA_FMT_MASK 0x00c0 (0011000000) | |
1710 | + * | |
1711 | + * HCI_INP_SAMPLE_SIZE_8BIT 0x0000 (0000000000) | |
1712 | + * HCI_INP_SAMPLE_SIZE_16BIT 0x0020 (0000100000) | |
1713 | + * HCI_INP_SAMPLE_SIZE_MASK 0x0020 (0000100000) | |
1714 | + * | |
1715 | + * HCI_INP_LINEAR_PCM_BIT_POS_MASK 0x001c (0000011100) | |
1716 | + * HCI_INP_LINEAR_PCM_BIT_POS_OFFS 2 | |
1717 | + * | |
1718 | + * HCI_AIR_CODING_FORMAT_CVSD 0x0000 (0000000000) | |
1719 | + * HCI_AIR_CODING_FORMAT_U_LAW 0x0001 (0000000001) | |
1720 | + * HCI_AIR_CODING_FORMAT_A_LAW 0x0002 (0000000010) | |
1721 | + * HCI_AIR_CODING_FORMAT_TRANSPNT 0x0003 (0000000011) | |
1722 | + * HCI_AIR_CODING_FORMAT_MASK 0x0003 (0000000011) | |
1723 | + * | |
1724 | + * default (0001100000) | |
1725 | + * HCI_DEFAULT_VOICE_SETTINGS (HCI_INP_CODING_LINEAR \ | |
1726 | + * | HCI_INP_DATA_FMT_2S_COMPLEMENT \ | |
1727 | + * | HCI_INP_SAMPLE_SIZE_16BIT \ | |
1728 | + * | HCI_AIR_CODING_FORMAT_CVSD) | |
1729 | + * | |
1730 | + ******************************************************************************/ | |
1731 | +static uint16_t btm_sco_voice_settings_to_legacy(enh_esco_params_t* p_params) { | |
1732 | + uint16_t voice_settings = 0; | |
1733 | + | |
1734 | + /* Convert Input Coding Format: If no uLaw or aLAW then Linear will be used | |
1735 | + * (0) */ | |
1736 | + if (p_params->input_coding_format.coding_format == ESCO_CODING_FORMAT_ULAW) | |
1737 | + voice_settings |= HCI_INP_CODING_U_LAW; | |
1738 | + else if (p_params->input_coding_format.coding_format == | |
1739 | + ESCO_CODING_FORMAT_ALAW) | |
1740 | + voice_settings |= HCI_INP_CODING_A_LAW; | |
1741 | + /* else default value of '0 is good 'Linear' */ | |
1742 | + | |
1743 | + /* Convert Input Data Format. Use 2's Compliment as the default */ | |
1744 | + switch (p_params->input_pcm_data_format) { | |
1745 | + case ESCO_PCM_DATA_FORMAT_1_COMP: | |
1746 | + /* voice_settings |= HCI_INP_DATA_FMT_1S_COMPLEMENT; value is '0' | |
1747 | + * already */ | |
1748 | + break; | |
1749 | + | |
1750 | + case ESCO_PCM_DATA_FORMAT_SIGN: | |
1751 | + voice_settings |= HCI_INP_DATA_FMT_SIGN_MAGNITUDE; | |
1752 | + break; | |
1753 | + | |
1754 | + case ESCO_PCM_DATA_FORMAT_UNSIGN: | |
1755 | + voice_settings |= HCI_INP_DATA_FMT_UNSIGNED; | |
1756 | + break; | |
1757 | + | |
1758 | + default: /* 2's Compliment */ | |
1759 | + voice_settings |= HCI_INP_DATA_FMT_2S_COMPLEMENT; | |
1760 | + break; | |
1761 | + } | |
1762 | + | |
1763 | + /* Convert Over the Air Coding. Use CVSD as the default */ | |
1764 | + switch (p_params->transmit_coding_format.coding_format) { | |
1765 | + case ESCO_CODING_FORMAT_ULAW: | |
1766 | + voice_settings |= HCI_AIR_CODING_FORMAT_U_LAW; | |
1767 | + break; | |
1768 | + | |
1769 | + case ESCO_CODING_FORMAT_ALAW: | |
1770 | + voice_settings |= HCI_AIR_CODING_FORMAT_A_LAW; | |
1771 | + break; | |
1772 | + | |
1773 | + case ESCO_CODING_FORMAT_MSBC: | |
1774 | + voice_settings |= HCI_AIR_CODING_FORMAT_TRANSPNT; | |
1775 | + break; | |
1776 | + | |
1777 | + default: /* CVSD (0) */ | |
1778 | + break; | |
1779 | + } | |
1780 | + | |
1781 | + /* Convert PCM payload MSB position (0000011100) */ | |
1782 | + voice_settings |= (uint16_t)(((p_params->input_pcm_payload_msb_position & 0x7) | |
1783 | + << HCI_INP_LINEAR_PCM_BIT_POS_OFFS)); | |
1784 | + | |
1785 | + /* Convert Input Sample Size (0000011100) */ | |
1786 | + if (p_params->input_coded_data_size == 16) | |
1787 | + voice_settings |= HCI_INP_SAMPLE_SIZE_16BIT; | |
1788 | + else /* Use 8 bit for all others */ | |
1789 | + voice_settings |= HCI_INP_SAMPLE_SIZE_8BIT; | |
1790 | + | |
1791 | + BTM_TRACE_DEBUG("%s: voice setting for legacy 0x%03x", __func__, | |
1792 | + voice_settings); | |
1793 | + | |
1794 | + return (voice_settings); | |
1795 | +} | |
1796 | + | |
1659 | 1797 | #else /* SCO_EXCLUDED == TRUE (Link in stubs) */ |
1660 | 1798 | |
1661 | 1799 | tBTM_STATUS BTM_CreateSco(BD_ADDR remote_bda, bool is_orig, uint16_t pkt_types, |
@@ -1674,7 +1812,7 @@ uint16_t BTM_ReadScoHandle(uint16_t sco_inx) { | ||
1674 | 1812 | } |
1675 | 1813 | uint8_t* BTM_ReadScoBdAddr(uint16_t sco_inx) { return ((uint8_t*)NULL); } |
1676 | 1814 | uint16_t BTM_ReadScoDiscReason(void) { return (BTM_INVALID_SCO_DISC_REASON); } |
1677 | -tBTM_STATUS BTM_SetEScoMode(tBTM_SCO_TYPE sco_mode, tBTM_ESCO_PARAMS* p_parms) { | |
1815 | +tBTM_STATUS BTM_SetEScoMode(enh_esco_params_t* p_parms) { | |
1678 | 1816 | return (BTM_MODE_UNSUPPORTED); |
1679 | 1817 | } |
1680 | 1818 | tBTM_STATUS BTM_RegForEScoEvts(uint16_t sco_inx, |
@@ -1689,7 +1827,7 @@ tBTM_STATUS BTM_ChangeEScoLinkParms(uint16_t sco_inx, | ||
1689 | 1827 | return (BTM_MODE_UNSUPPORTED); |
1690 | 1828 | } |
1691 | 1829 | void BTM_EScoConnRsp(uint16_t sco_inx, uint8_t hci_status, |
1692 | - tBTM_ESCO_PARAMS* p_parms) {} | |
1830 | + enh_esco_params_t* p_parms) {} | |
1693 | 1831 | uint8_t BTM_GetNumScoLinks(void) { return (0); } |
1694 | 1832 | |
1695 | 1833 | #endif /* If SCO is being used */ |
@@ -1145,13 +1145,14 @@ static void btu_hcif_hdl_command_status(uint16_t opcode, uint8_t status, | ||
1145 | 1145 | |
1146 | 1146 | #if (BTM_SCO_INCLUDED == TRUE) |
1147 | 1147 | case HCI_SETUP_ESCO_CONNECTION: |
1148 | + case HCI_ENH_SETUP_ESCO_CONNECTION: | |
1148 | 1149 | /* read handle out of stored command */ |
1149 | 1150 | if (p_cmd != NULL) { |
1150 | 1151 | p_cmd++; |
1151 | 1152 | STREAM_TO_UINT16(handle, p_cmd); |
1152 | 1153 | |
1153 | - /* Determine if initial connection failed or is a change of setup | |
1154 | - */ | |
1154 | + /* Determine if initial connection failed or is a change | |
1155 | + * of setup */ | |
1155 | 1156 | if (btm_is_sco_active(handle)) |
1156 | 1157 | btm_esco_proc_conn_chg(status, handle, 0, 0, 0, 0); |
1157 | 1158 | else |
@@ -431,7 +431,8 @@ void btsnd_hcic_read_lmp_handle(uint16_t handle) { | ||
431 | 431 | btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p); |
432 | 432 | } |
433 | 433 | |
434 | -void btsnd_hcic_setup_esco_conn(uint16_t handle, uint32_t tx_bw, uint32_t rx_bw, | |
434 | +void btsnd_hcic_setup_esco_conn(uint16_t handle, uint32_t transmit_bandwidth, | |
435 | + uint32_t receive_bandwidth, | |
435 | 436 | uint16_t max_latency, uint16_t voice, |
436 | 437 | uint8_t retrans_effort, uint16_t packet_types) { |
437 | 438 | BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE); |
@@ -444,8 +445,8 @@ void btsnd_hcic_setup_esco_conn(uint16_t handle, uint32_t tx_bw, uint32_t rx_bw, | ||
444 | 445 | UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_SETUP_ESCO); |
445 | 446 | |
446 | 447 | UINT16_TO_STREAM(pp, handle); |
447 | - UINT32_TO_STREAM(pp, tx_bw); | |
448 | - UINT32_TO_STREAM(pp, rx_bw); | |
448 | + UINT32_TO_STREAM(pp, transmit_bandwidth); | |
449 | + UINT32_TO_STREAM(pp, receive_bandwidth); | |
449 | 450 | UINT16_TO_STREAM(pp, max_latency); |
450 | 451 | UINT16_TO_STREAM(pp, voice); |
451 | 452 | UINT8_TO_STREAM(pp, retrans_effort); |
@@ -454,9 +455,10 @@ void btsnd_hcic_setup_esco_conn(uint16_t handle, uint32_t tx_bw, uint32_t rx_bw, | ||
454 | 455 | btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p); |
455 | 456 | } |
456 | 457 | |
457 | -void btsnd_hcic_accept_esco_conn(BD_ADDR bd_addr, uint32_t tx_bw, | |
458 | - uint32_t rx_bw, uint16_t max_latency, | |
459 | - uint16_t content_fmt, uint8_t retrans_effort, | |
458 | +void btsnd_hcic_accept_esco_conn(BD_ADDR bd_addr, uint32_t transmit_bandwidth, | |
459 | + uint32_t receive_bandwidth, | |
460 | + uint16_t max_latency, uint16_t content_fmt, | |
461 | + uint8_t retrans_effort, | |
460 | 462 | uint16_t packet_types) { |
461 | 463 | BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE); |
462 | 464 | uint8_t* pp = (uint8_t*)(p + 1); |
@@ -468,8 +470,8 @@ void btsnd_hcic_accept_esco_conn(BD_ADDR bd_addr, uint32_t tx_bw, | ||
468 | 470 | UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_ACCEPT_ESCO); |
469 | 471 | |
470 | 472 | BDADDR_TO_STREAM(pp, bd_addr); |
471 | - UINT32_TO_STREAM(pp, tx_bw); | |
472 | - UINT32_TO_STREAM(pp, rx_bw); | |
473 | + UINT32_TO_STREAM(pp, transmit_bandwidth); | |
474 | + UINT32_TO_STREAM(pp, receive_bandwidth); | |
473 | 475 | UINT16_TO_STREAM(pp, max_latency); |
474 | 476 | UINT16_TO_STREAM(pp, content_fmt); |
475 | 477 | UINT8_TO_STREAM(pp, retrans_effort); |
@@ -1009,6 +1011,104 @@ void btsnd_hcic_io_cap_req_reply(BD_ADDR bd_addr, uint8_t capability, | ||
1009 | 1011 | btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p); |
1010 | 1012 | } |
1011 | 1013 | |
1014 | +void btsnd_hcic_enhanced_set_up_synchronous_connection( | |
1015 | + uint16_t conn_handle, enh_esco_params_t* p_params) { | |
1016 | + BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE); | |
1017 | + uint8_t* pp = (uint8_t*)(p + 1); | |
1018 | + | |
1019 | + p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_ENH_SET_ESCO_CONN; | |
1020 | + p->offset = 0; | |
1021 | + | |
1022 | + UINT16_TO_STREAM(pp, HCI_ENH_SETUP_ESCO_CONNECTION); | |
1023 | + UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_ENH_SET_ESCO_CONN); | |
1024 | + | |
1025 | + UINT16_TO_STREAM(pp, conn_handle); | |
1026 | + UINT32_TO_STREAM(pp, p_params->transmit_bandwidth); | |
1027 | + UINT32_TO_STREAM(pp, p_params->receive_bandwidth); | |
1028 | + UINT8_TO_STREAM(pp, p_params->transmit_coding_format.coding_format); | |
1029 | + UINT16_TO_STREAM(pp, p_params->transmit_coding_format.company_id); | |
1030 | + UINT16_TO_STREAM(pp, | |
1031 | + p_params->transmit_coding_format.vendor_specific_codec_id); | |
1032 | + UINT8_TO_STREAM(pp, p_params->receive_coding_format.coding_format); | |
1033 | + UINT16_TO_STREAM(pp, p_params->receive_coding_format.company_id); | |
1034 | + UINT16_TO_STREAM(pp, | |
1035 | + p_params->receive_coding_format.vendor_specific_codec_id); | |
1036 | + UINT16_TO_STREAM(pp, p_params->transmit_codec_frame_size); | |
1037 | + UINT16_TO_STREAM(pp, p_params->receive_codec_frame_size); | |
1038 | + UINT32_TO_STREAM(pp, p_params->input_bandwidth); | |
1039 | + UINT32_TO_STREAM(pp, p_params->output_bandwidth); | |
1040 | + UINT8_TO_STREAM(pp, p_params->input_coding_format.coding_format); | |
1041 | + UINT16_TO_STREAM(pp, p_params->input_coding_format.company_id); | |
1042 | + UINT16_TO_STREAM(pp, p_params->input_coding_format.vendor_specific_codec_id); | |
1043 | + UINT8_TO_STREAM(pp, p_params->output_coding_format.coding_format); | |
1044 | + UINT16_TO_STREAM(pp, p_params->output_coding_format.company_id); | |
1045 | + UINT16_TO_STREAM(pp, p_params->output_coding_format.vendor_specific_codec_id); | |
1046 | + UINT16_TO_STREAM(pp, p_params->input_coded_data_size); | |
1047 | + UINT16_TO_STREAM(pp, p_params->output_coded_data_size); | |
1048 | + UINT8_TO_STREAM(pp, p_params->input_pcm_data_format); | |
1049 | + UINT8_TO_STREAM(pp, p_params->output_pcm_data_format); | |
1050 | + UINT8_TO_STREAM(pp, p_params->input_pcm_payload_msb_position); | |
1051 | + UINT8_TO_STREAM(pp, p_params->output_pcm_payload_msb_position); | |
1052 | + UINT8_TO_STREAM(pp, p_params->input_data_path); | |
1053 | + UINT8_TO_STREAM(pp, p_params->output_data_path); | |
1054 | + UINT8_TO_STREAM(pp, p_params->input_transport_unit_size); | |
1055 | + UINT8_TO_STREAM(pp, p_params->output_transport_unit_size); | |
1056 | + UINT16_TO_STREAM(pp, p_params->max_latency_ms); | |
1057 | + UINT16_TO_STREAM(pp, p_params->packet_types); | |
1058 | + UINT8_TO_STREAM(pp, p_params->retransmission_effort); | |
1059 | + | |
1060 | + btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p); | |
1061 | +} | |
1062 | + | |
1063 | +void btsnd_hcic_enhanced_accept_synchronous_connection( | |
1064 | + BD_ADDR bd_addr, enh_esco_params_t* p_params) { | |
1065 | + BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE); | |
1066 | + uint8_t* pp = (uint8_t*)(p + 1); | |
1067 | + | |
1068 | + p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_ENH_ACC_ESCO_CONN; | |
1069 | + p->offset = 0; | |
1070 | + | |
1071 | + UINT16_TO_STREAM(pp, HCI_ENH_ACCEPT_ESCO_CONNECTION); | |
1072 | + UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_ENH_ACC_ESCO_CONN); | |
1073 | + | |
1074 | + BDADDR_TO_STREAM(pp, bd_addr); | |
1075 | + UINT32_TO_STREAM(pp, p_params->transmit_bandwidth); | |
1076 | + UINT32_TO_STREAM(pp, p_params->receive_bandwidth); | |
1077 | + UINT8_TO_STREAM(pp, p_params->transmit_coding_format.coding_format); | |
1078 | + UINT16_TO_STREAM(pp, p_params->transmit_coding_format.company_id); | |
1079 | + UINT16_TO_STREAM(pp, | |
1080 | + p_params->transmit_coding_format.vendor_specific_codec_id); | |
1081 | + UINT8_TO_STREAM(pp, p_params->receive_coding_format.coding_format); | |
1082 | + UINT16_TO_STREAM(pp, p_params->receive_coding_format.company_id); | |
1083 | + UINT16_TO_STREAM(pp, | |
1084 | + p_params->receive_coding_format.vendor_specific_codec_id); | |
1085 | + UINT16_TO_STREAM(pp, p_params->transmit_codec_frame_size); | |
1086 | + UINT16_TO_STREAM(pp, p_params->receive_codec_frame_size); | |
1087 | + UINT32_TO_STREAM(pp, p_params->input_bandwidth); | |
1088 | + UINT32_TO_STREAM(pp, p_params->output_bandwidth); | |
1089 | + UINT8_TO_STREAM(pp, p_params->input_coding_format.coding_format); | |
1090 | + UINT16_TO_STREAM(pp, p_params->input_coding_format.company_id); | |
1091 | + UINT16_TO_STREAM(pp, p_params->input_coding_format.vendor_specific_codec_id); | |
1092 | + UINT8_TO_STREAM(pp, p_params->output_coding_format.coding_format); | |
1093 | + UINT16_TO_STREAM(pp, p_params->output_coding_format.company_id); | |
1094 | + UINT16_TO_STREAM(pp, p_params->output_coding_format.vendor_specific_codec_id); | |
1095 | + UINT16_TO_STREAM(pp, p_params->input_coded_data_size); | |
1096 | + UINT16_TO_STREAM(pp, p_params->output_coded_data_size); | |
1097 | + UINT8_TO_STREAM(pp, p_params->input_pcm_data_format); | |
1098 | + UINT8_TO_STREAM(pp, p_params->output_pcm_data_format); | |
1099 | + UINT8_TO_STREAM(pp, p_params->input_pcm_payload_msb_position); | |
1100 | + UINT8_TO_STREAM(pp, p_params->output_pcm_payload_msb_position); | |
1101 | + UINT8_TO_STREAM(pp, p_params->input_data_path); | |
1102 | + UINT8_TO_STREAM(pp, p_params->output_data_path); | |
1103 | + UINT8_TO_STREAM(pp, p_params->input_transport_unit_size); | |
1104 | + UINT8_TO_STREAM(pp, p_params->output_transport_unit_size); | |
1105 | + UINT16_TO_STREAM(pp, p_params->max_latency_ms); | |
1106 | + UINT16_TO_STREAM(pp, p_params->packet_types); | |
1107 | + UINT8_TO_STREAM(pp, p_params->retransmission_effort); | |
1108 | + | |
1109 | + btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p); | |
1110 | +} | |
1111 | + | |
1012 | 1112 | void btsnd_hcic_io_cap_req_neg_reply(BD_ADDR bd_addr, uint8_t err_code) { |
1013 | 1113 | BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE); |
1014 | 1114 | uint8_t* pp = (uint8_t*)(p + 1); |
@@ -26,6 +26,7 @@ | ||
26 | 26 | #define BTM_API_H |
27 | 27 | |
28 | 28 | #include "bt_target.h" |
29 | +#include "device/include/esco_parameters.h" | |
29 | 30 | #include "hcidefs.h" |
30 | 31 | #include "sdp_api.h" |
31 | 32 |
@@ -1110,8 +1111,7 @@ extern uint16_t BTM_ReadScoDiscReason(void); | ||
1110 | 1111 | * BTM_BUSY if there are one or more active (e)SCO links. |
1111 | 1112 | * |
1112 | 1113 | ******************************************************************************/ |
1113 | -extern tBTM_STATUS BTM_SetEScoMode(tBTM_SCO_TYPE sco_mode, | |
1114 | - tBTM_ESCO_PARAMS* p_parms); | |
1114 | +extern tBTM_STATUS BTM_SetEScoMode(enh_esco_params_t* p_parms); | |
1115 | 1115 | |
1116 | 1116 | /******************************************************************************* |
1117 | 1117 | * |
@@ -1207,7 +1207,7 @@ extern tBTM_STATUS BTM_ChangeEScoLinkParms(uint16_t sco_inx, | ||
1207 | 1207 | * |
1208 | 1208 | ******************************************************************************/ |
1209 | 1209 | extern void BTM_EScoConnRsp(uint16_t sco_inx, uint8_t hci_status, |
1210 | - tBTM_ESCO_PARAMS* p_parms); | |
1210 | + enh_esco_params_t* p_parms); | |
1211 | 1211 | |
1212 | 1212 | /******************************************************************************* |
1213 | 1213 | * |
@@ -2010,7 +2010,7 @@ extern uint8_t BTM_GetEirUuidList(uint8_t* p_eir, size_t eir_len, | ||
2010 | 2010 | * |
2011 | 2011 | * |
2012 | 2012 | ******************************************************************************/ |
2013 | -extern tBTM_STATUS BTM_ConfigScoPath(tBTM_SCO_ROUTE_TYPE path, | |
2013 | +extern tBTM_STATUS BTM_ConfigScoPath(esco_data_path_t path, | |
2014 | 2014 | tBTM_SCO_DATA_CB* p_sco_data_cb, |
2015 | 2015 | tBTM_SCO_PCM_PARAM* p_pcm_param, |
2016 | 2016 | bool err_data_rpt); |
@@ -20,6 +20,7 @@ | ||
20 | 20 | #define BTM_API_TYPES_H |
21 | 21 | |
22 | 22 | #include "bt_target.h" |
23 | +#include "device/include/esco_parameters.h" | |
23 | 24 | #include "hcidefs.h" |
24 | 25 | #include "smp_api_types.h" |
25 | 26 |
@@ -910,34 +911,17 @@ typedef void(tBTM_ACL_DB_CHANGE_CB)(BD_ADDR p_bda, DEV_CLASS p_dc, | ||
910 | 911 | /* Define first active SCO index */ |
911 | 912 | #define BTM_FIRST_ACTIVE_SCO_INDEX BTM_MAX_SCO_LINKS |
912 | 913 | |
913 | -/* Define SCO packet types used in APIs */ | |
914 | -#define BTM_SCO_PKT_TYPES_MASK_HV1 HCI_ESCO_PKT_TYPES_MASK_HV1 | |
915 | -#define BTM_SCO_PKT_TYPES_MASK_HV2 HCI_ESCO_PKT_TYPES_MASK_HV2 | |
916 | -#define BTM_SCO_PKT_TYPES_MASK_HV3 HCI_ESCO_PKT_TYPES_MASK_HV3 | |
917 | -#define BTM_SCO_PKT_TYPES_MASK_EV3 HCI_ESCO_PKT_TYPES_MASK_EV3 | |
918 | -#define BTM_SCO_PKT_TYPES_MASK_EV4 HCI_ESCO_PKT_TYPES_MASK_EV4 | |
919 | -#define BTM_SCO_PKT_TYPES_MASK_EV5 HCI_ESCO_PKT_TYPES_MASK_EV5 | |
920 | -#define BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 HCI_ESCO_PKT_TYPES_MASK_NO_2_EV3 | |
921 | -#define BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 HCI_ESCO_PKT_TYPES_MASK_NO_3_EV3 | |
922 | -#define BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 HCI_ESCO_PKT_TYPES_MASK_NO_2_EV5 | |
923 | -#define BTM_SCO_PKT_TYPES_MASK_NO_3_EV5 HCI_ESCO_PKT_TYPES_MASK_NO_3_EV5 | |
924 | - | |
925 | -#define BTM_SCO_LINK_ONLY_MASK \ | |
926 | - (BTM_SCO_PKT_TYPES_MASK_HV1 | BTM_SCO_PKT_TYPES_MASK_HV2 | \ | |
927 | - BTM_SCO_PKT_TYPES_MASK_HV3) | |
928 | - | |
929 | -#define BTM_ESCO_LINK_ONLY_MASK \ | |
930 | - (BTM_SCO_PKT_TYPES_MASK_EV3 | BTM_SCO_PKT_TYPES_MASK_EV4 | \ | |
931 | - BTM_SCO_PKT_TYPES_MASK_EV5) | |
914 | +#define BTM_SCO_LINK_ONLY_MASK \ | |
915 | + (ESCO_PKT_TYPES_MASK_HV1 | ESCO_PKT_TYPES_MASK_HV2 | ESCO_PKT_TYPES_MASK_HV3) | |
916 | + | |
917 | +#define BTM_ESCO_LINK_ONLY_MASK \ | |
918 | + (ESCO_PKT_TYPES_MASK_EV3 | ESCO_PKT_TYPES_MASK_EV4 | ESCO_PKT_TYPES_MASK_EV5) | |
932 | 919 | |
933 | 920 | #define BTM_SCO_LINK_ALL_PKT_MASK \ |
934 | 921 | (BTM_SCO_LINK_ONLY_MASK | BTM_ESCO_LINK_ONLY_MASK) |
935 | 922 | |
936 | 923 | #define BTM_VALID_SCO_ALL_PKT_TYPE HCI_VALID_SCO_ALL_PKT_TYPE |
937 | 924 | |
938 | -/* Passed in BTM_CreateSco if the packet type parameter should be ignored */ | |
939 | -#define BTM_IGNORE_SCO_PKT_TYPE 0 | |
940 | - | |
941 | 925 | /*************** |
942 | 926 | * SCO Types |
943 | 927 | ***************/ |
@@ -946,32 +930,15 @@ typedef void(tBTM_ACL_DB_CHANGE_CB)(BD_ADDR p_bda, DEV_CLASS p_dc, | ||
946 | 930 | typedef uint8_t tBTM_SCO_TYPE; |
947 | 931 | |
948 | 932 | /******************* |
949 | - * SCO Routing Path | |
950 | - *******************/ | |
951 | -#define BTM_SCO_ROUTE_PCM HCI_BRCM_SCO_ROUTE_PCM | |
952 | -#define BTM_SCO_ROUTE_HCI HCI_BRCM_SCO_ROUTE_HCI | |
953 | -typedef uint8_t tBTM_SCO_ROUTE_TYPE; | |
954 | - | |
955 | -/******************* | |
956 | 933 | * SCO Codec Types |
957 | 934 | *******************/ |
958 | 935 | // TODO(google) This should use common definitions |
959 | -// in hci/include/hci_audio.h | |
960 | 936 | #define BTM_SCO_CODEC_NONE 0x0000 |
961 | 937 | #define BTM_SCO_CODEC_CVSD 0x0001 |
962 | 938 | #define BTM_SCO_CODEC_MSBC 0x0002 |
963 | 939 | typedef uint16_t tBTM_SCO_CODEC_TYPE; |
964 | 940 | |
965 | 941 | /******************* |
966 | - * SCO Air Mode Types | |
967 | - *******************/ | |
968 | -#define BTM_SCO_AIR_MODE_U_LAW 0 | |
969 | -#define BTM_SCO_AIR_MODE_A_LAW 1 | |
970 | -#define BTM_SCO_AIR_MODE_CVSD 2 | |
971 | -#define BTM_SCO_AIR_MODE_TRANSPNT 3 | |
972 | -typedef uint8_t tBTM_SCO_AIR_MODE_TYPE; | |
973 | - | |
974 | -/******************* | |
975 | 942 | * SCO Voice Settings |
976 | 943 | *******************/ |
977 | 944 | #define BTM_VOICE_SETTING_CVSD \ |
@@ -1000,20 +967,6 @@ typedef void(tBTM_SCO_CB)(uint16_t sco_inx); | ||
1000 | 967 | typedef void(tBTM_SCO_DATA_CB)(uint16_t sco_inx, BT_HDR* p_data, |
1001 | 968 | tBTM_SCO_DATA_FLAG status); |
1002 | 969 | |
1003 | -/****************** | |
1004 | - * eSCO Constants | |
1005 | - ******************/ | |
1006 | -#define BTM_64KBITS_RATE 0x00001f40 /* 64 kbits/sec data rate */ | |
1007 | - | |
1008 | -/* Retransmission effort */ | |
1009 | -#define BTM_ESCO_RETRANS_OFF 0 | |
1010 | -#define BTM_ESCO_RETRANS_POWER 1 | |
1011 | -#define BTM_ESCO_RETRANS_QUALITY 2 | |
1012 | -#define BTM_ESCO_RETRANS_DONTCARE 0xff | |
1013 | - | |
1014 | -/* Max Latency Don't Care */ | |
1015 | -#define BTM_ESCO_MAX_LAT_DONTCARE 0xffff | |
1016 | - | |
1017 | 970 | /*************** |
1018 | 971 | * eSCO Types |
1019 | 972 | ***************/ |
@@ -1022,20 +975,13 @@ typedef void(tBTM_SCO_DATA_CB)(uint16_t sco_inx, BT_HDR* p_data, | ||
1022 | 975 | #define BTM_ESCO_CONN_REQ_EVT 2 |
1023 | 976 | typedef uint8_t tBTM_ESCO_EVT; |
1024 | 977 | |
1025 | -/* Passed into BTM_SetEScoMode() */ | |
1026 | -typedef struct { | |
1027 | - uint32_t tx_bw; | |
1028 | - uint32_t rx_bw; | |
1029 | - uint16_t max_latency; | |
1030 | - uint16_t voice_contfmt; /* Voice Settings or Content Format */ | |
1031 | - uint16_t packet_types; | |
1032 | - uint8_t retrans_effort; | |
1033 | -} tBTM_ESCO_PARAMS; | |
1034 | - | |
978 | +/* Structure passed with SCO change command and events. | |
979 | + * Used by both Sync and Enhanced sync messaging | |
980 | + */ | |
1035 | 981 | typedef struct { |
1036 | - uint16_t max_latency; | |
982 | + uint16_t max_latency_ms; | |
1037 | 983 | uint16_t packet_types; |
1038 | - uint8_t retrans_effort; | |
984 | + uint8_t retransmission_effort; | |
1039 | 985 | } tBTM_CHG_ESCO_PARAMS; |
1040 | 986 | |
1041 | 987 | /* Returned by BTM_ReadEScoLinkParms() */ |
@@ -1077,37 +1077,24 @@ | ||
1077 | 1077 | HCI_PKT_TYPES_MASK_DM3 | HCI_PKT_TYPES_MASK_DH3 | \ |
1078 | 1078 | HCI_PKT_TYPES_MASK_DM5 | HCI_PKT_TYPES_MASK_DH5)) != 0)) |
1079 | 1079 | |
1080 | -/* | |
1081 | - * Definitions for eSCO packet type masks (BT1.2 and BT2.0 definitions) | |
1082 | -*/ | |
1083 | -#define HCI_ESCO_PKT_TYPES_MASK_HV1 0x0001 | |
1084 | -#define HCI_ESCO_PKT_TYPES_MASK_HV2 0x0002 | |
1085 | -#define HCI_ESCO_PKT_TYPES_MASK_HV3 0x0004 | |
1086 | -#define HCI_ESCO_PKT_TYPES_MASK_EV3 0x0008 | |
1087 | -#define HCI_ESCO_PKT_TYPES_MASK_EV4 0x0010 | |
1088 | -#define HCI_ESCO_PKT_TYPES_MASK_EV5 0x0020 | |
1089 | -#define HCI_ESCO_PKT_TYPES_MASK_NO_2_EV3 0x0040 | |
1090 | -#define HCI_ESCO_PKT_TYPES_MASK_NO_3_EV3 0x0080 | |
1091 | -#define HCI_ESCO_PKT_TYPES_MASK_NO_2_EV5 0x0100 | |
1092 | -#define HCI_ESCO_PKT_TYPES_MASK_NO_3_EV5 0x0200 | |
1093 | - | |
1094 | 1080 | /* Packet type should be one of valid but at least one should be specified for |
1095 | 1081 | * 1.2 */ |
1096 | -#define HCI_VALID_ESCO_PKT_TYPE(t) \ | |
1097 | - (((((t) & \ | |
1098 | - ~(HCI_ESCO_PKT_TYPES_MASK_EV3 | HCI_ESCO_PKT_TYPES_MASK_EV4 | \ | |
1099 | - HCI_ESCO_PKT_TYPES_MASK_EV5)) == 0)) && \ | |
1100 | - ((t) != 0)) | |
1101 | - | |
1102 | -#define HCI_VALID_ESCO_SCOPKT_TYPE(t) \ | |
1103 | - (((((t) & \ | |
1104 | - ~(HCI_ESCO_PKT_TYPES_MASK_HV1 | HCI_ESCO_PKT_TYPES_MASK_HV2 | \ | |
1105 | - HCI_ESCO_PKT_TYPES_MASK_HV3)) == 0)) && \ | |
1082 | +#define HCI_VALID_ESCO_PKT_TYPE(t) \ | |
1083 | + (((((t) & \ | |
1084 | + ~(HCI_ESCO_PKT_TYPES_MASK_EV3 | HCI_ESCO_PKT_TYPES_MASK_EV4 | \ | |
1085 | + HCI_ESCO_PKT_TYPES_MASK_EV5)) == 0)) && \ | |
1086 | + ((t) != 0)) /* Packet type should be one of valid but at least one should \ | |
1087 | + be specified */ | |
1088 | + | |
1089 | +#define HCI_VALID_ESCO_SCOPKT_TYPE(t) \ | |
1090 | + (((((t) & \ | |
1091 | + ~(ESCO_PKT_TYPES_MASK_HV1 | HCI_ESCO_PKT_TYPES_MASK_HV2 | \ | |
1092 | + HCI_ESCO_PKT_TYPES_MASK_HV3)) == 0)) && \ | |
1106 | 1093 | ((t) != 0)) |
1107 | 1094 | |
1108 | 1095 | #define HCI_VALID_SCO_ALL_PKT_TYPE(t) \ |
1109 | 1096 | (((((t) & \ |
1110 | - ~(HCI_ESCO_PKT_TYPES_MASK_HV1 | HCI_ESCO_PKT_TYPES_MASK_HV2 | \ | |
1097 | + ~(ESCO_PKT_TYPES_MASK_HV1 | HCI_ESCO_PKT_TYPES_MASK_HV2 | \ | |
1111 | 1098 | HCI_ESCO_PKT_TYPES_MASK_HV3 | HCI_ESCO_PKT_TYPES_MASK_EV3 | \ |
1112 | 1099 | HCI_ESCO_PKT_TYPES_MASK_EV4 | HCI_ESCO_PKT_TYPES_MASK_EV5)) == 0)) && \ |
1113 | 1100 | ((t) != 0)) |
@@ -3006,13 +2993,13 @@ typedef struct { | ||
3006 | 2993 | /* Supported Commands (Byte 29) */ |
3007 | 2994 | #define HCI_SUPP_COMMANDS_ENH_SETUP_SYNCH_CONN_MASK 0x08 |
3008 | 2995 | #define HCI_SUPP_COMMANDS_ENH_SETUP_SYNCH_CONN_OFF 29 |
3009 | -#define HCI_READ_ENH_SETUP_SYNCH_CONN_SUPPORTED(x) \ | |
2996 | +#define HCI_ENH_SETUP_SYNCH_CONN_SUPPORTED(x) \ | |
3010 | 2997 | ((x)[HCI_SUPP_COMMANDS_ENH_SETUP_SYNCH_CONN_OFF] & \ |
3011 | 2998 | HCI_SUPP_COMMANDS_ENH_SETUP_SYNCH_CONN_MASK) |
3012 | 2999 | |
3013 | 3000 | #define HCI_SUPP_COMMANDS_ENH_ACCEPT_SYNCH_CONN_MASK 0x10 |
3014 | 3001 | #define HCI_SUPP_COMMANDS_ENH_ACCEPT_SYNCH_CONN_OFF 29 |
3015 | -#define HCI_READ_ENH_ACCEPT_SYNCH_CONN_SUPPORTED(x) \ | |
3002 | +#define HCI_ENH_ACCEPT_SYNCH_CONN_SUPPORTED(x) \ | |
3016 | 3003 | ((x)[HCI_SUPP_COMMANDS_ENH_ACCEPT_SYNCH_CONN_OFF] & \ |
3017 | 3004 | HCI_SUPP_COMMANDS_ENH_ACCEPT_SYNCH_CONN_MASK) |
3018 | 3005 |
@@ -21,6 +21,7 @@ | ||
21 | 21 | |
22 | 22 | #include "bt_target.h" |
23 | 23 | #include "bt_types.h" |
24 | +#include "device/include/esco_parameters.h" | |
24 | 25 | #include "hcidefs.h" |
25 | 26 | |
26 | 27 | #include <base/callback_forward.h> |
@@ -222,10 +223,11 @@ extern void btsnd_hcic_rmt_ver_req( | ||
222 | 223 | extern void btsnd_hcic_read_rmt_clk_offset( |
223 | 224 | uint16_t handle); /* Remote Clock Offset */ |
224 | 225 | extern void btsnd_hcic_read_lmp_handle(uint16_t handle); /* Remote LMP Handle */ |
225 | - | |
226 | -extern void btsnd_hcic_setup_esco_conn(uint16_t handle, uint32_t tx_bw, | |
227 | - uint32_t rx_bw, uint16_t max_latency, | |
228 | - uint16_t voice, uint8_t retrans_effort, | |
226 | +extern void btsnd_hcic_setup_esco_conn(uint16_t handle, | |
227 | + uint32_t transmit_bandwidth, | |
228 | + uint32_t receive_bandwidth, | |
229 | + uint16_t max_latency, uint16_t voice, | |
230 | + uint8_t retrans_effort, | |
229 | 231 | uint16_t packet_types); |
230 | 232 | #define HCIC_PARAM_SIZE_SETUP_ESCO 17 |
231 | 233 |
@@ -237,11 +239,10 @@ extern void btsnd_hcic_setup_esco_conn(uint16_t handle, uint32_t tx_bw, | ||
237 | 239 | #define HCI_SETUP_ESCO_RETRAN_EFF_OFF 14 |
238 | 240 | #define HCI_SETUP_ESCO_PKT_TYPES_OFF 15 |
239 | 241 | |
240 | -extern void btsnd_hcic_accept_esco_conn(BD_ADDR bd_addr, uint32_t tx_bw, | |
241 | - uint32_t rx_bw, uint16_t max_latency, | |
242 | - uint16_t content_fmt, | |
243 | - uint8_t retrans_effort, | |
244 | - uint16_t packet_types); | |
242 | +extern void btsnd_hcic_accept_esco_conn( | |
243 | + BD_ADDR bd_addr, uint32_t transmit_bandwidth, uint32_t receive_bandwidth, | |
244 | + uint16_t max_latency, uint16_t content_fmt, uint8_t retrans_effort, | |
245 | + uint16_t packet_types); | |
245 | 246 | #define HCIC_PARAM_SIZE_ACCEPT_ESCO 21 |
246 | 247 | |
247 | 248 | #define HCI_ACCEPT_ESCO_BDADDR_OFF 0 |
@@ -517,6 +518,9 @@ extern void btsnd_hcic_write_scan_enable(uint8_t flag); /* Write Scan Enable */ | ||
517 | 518 | extern void btsnd_hcic_write_pagescan_cfg( |
518 | 519 | uint16_t interval, uint16_t window); /* Write Page Scan Activity */ |
519 | 520 | |
521 | +#define HCIC_PARAM_SIZE_ENH_SET_ESCO_CONN 59 | |
522 | +#define HCIC_PARAM_SIZE_ENH_ACC_ESCO_CONN 63 | |
523 | + | |
520 | 524 | #define HCIC_PARAM_SIZE_WRITE_PAGESCAN_CFG 4 |
521 | 525 | |
522 | 526 | #define HCI_SCAN_CFG_INTERVAL_OFF 0 |
@@ -607,6 +611,14 @@ extern void btsnd_hcic_write_inqscan_type( | ||
607 | 611 | extern void btsnd_hcic_write_inquiry_mode( |
608 | 612 | uint8_t type); /* Write Inquiry Mode */ |
609 | 613 | |
614 | +/* Enhanced setup SCO connection (CSA2) */ | |
615 | +extern void btsnd_hcic_enhanced_set_up_synchronous_connection( | |
616 | + uint16_t conn_handle, enh_esco_params_t* p_parms); | |
617 | + | |
618 | +/* Enhanced accept SCO connection request (CSA2) */ | |
619 | +extern void btsnd_hcic_enhanced_accept_synchronous_connection( | |
620 | + BD_ADDR bd_addr, enh_esco_params_t* p_parms); | |
621 | + | |
610 | 622 | #define HCI_DATA_HANDLE_MASK 0x0FFF |
611 | 623 | |
612 | 624 | #define HCID_GET_HANDLE_EVENT(p) \ |
@@ -286,10 +286,8 @@ | ||
286 | 286 | |
287 | 287 | #define UUID_SERVCLASS_TEST_SERVER 0x9000 /* Test Group UUID */ |
288 | 288 | |
289 | -#if (BTM_WBS_INCLUDED == TRUE) | |
290 | 289 | #define UUID_CODEC_CVSD 0x0001 /* CVSD */ |
291 | 290 | #define UUID_CODEC_MSBC 0x0002 /* mSBC */ |
292 | -#endif | |
293 | 291 | |
294 | 292 | #define UUID_HF_IND_ENHANCED_DRIVER_SAFETY 0x0001 /* Enhanced Safety */ |
295 | 293 | #define UUID_HF_IND_BATTERY_LEVEL_STATUS 0x0002 /* Battery Status */ |