• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
Keine Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

system/bt


Commit MetaInfo

Revision6559d817d39875fb6d075f260fa53afb02900a6a (tree)
Zeit2017-05-24 23:23:37
Autorandroid-build-team Robot <android-build-team-robot@goog...>
Commiterandroid-build-team Robot

Log Message

release-request-aaaef485-cf88-426c-8186-1f3903a60dd5-for-git_oc-release-4038872 snap-temp-L67700000067294126

Change-Id: Ia631f45c953fe4e417c127b35d821a27f5297b59

Ändern Zusammenfassung

Diff

--- a/bta/ag/bta_ag_act.cc
+++ b/bta/ag/bta_ag_act.cc
@@ -341,10 +341,8 @@ void bta_ag_rfc_fail(tBTA_AG_SCB* p_scb, UNUSED_ATTR tBTA_AG_DATA* p_data) {
341341 p_scb->conn_handle = 0;
342342 p_scb->conn_service = 0;
343343 p_scb->peer_features = 0;
344-#if (BTM_WBS_INCLUDED == TRUE)
345344 p_scb->peer_codecs = BTA_AG_CODEC_CVSD;
346345 p_scb->sco_codec = BTA_AG_CODEC_CVSD;
347-#endif
348346 p_scb->role = 0;
349347 p_scb->svc_conn = false;
350348 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) {
376374 /* reinitialize stuff */
377375 p_scb->conn_service = 0;
378376 p_scb->peer_features = 0;
379-#if (BTM_WBS_INCLUDED == TRUE)
380377 p_scb->peer_codecs = BTA_AG_CODEC_CVSD;
381378 p_scb->sco_codec = BTA_AG_CODEC_CVSD;
382379 /* Clear these flags upon SLC teardown */
383380 p_scb->codec_updated = false;
384381 p_scb->codec_fallback = false;
385382 p_scb->codec_msbc_settings = BTA_AG_SCO_MSBC_SETTINGS_T2;
386-#endif
387383 p_scb->role = 0;
388384 p_scb->post_sco = BTA_AG_POST_SCO_NONE;
389385 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) {
395391
396392 /* stop timers */
397393 alarm_cancel(p_scb->ring_timer);
398-#if (BTM_WBS_INCLUDED == TRUE)
399394 alarm_cancel(p_scb->codec_negotiation_timer);
400-#endif
401395
402396 close.hdr.handle = bta_ag_scb_to_idx(p_scb);
403397 close.hdr.app_id = p_scb->app_id;
@@ -762,9 +756,7 @@ void bta_ag_svc_conn_open(tBTA_AG_SCB* p_scb,
762756 evt.hdr.app_id = p_scb->app_id;
763757 evt.peer_feat = p_scb->peer_features;
764758 bdcpy(evt.bd_addr, p_scb->peer_addr);
765-#if (BTM_WBS_INCLUDED == TRUE)
766759 evt.peer_codec = p_scb->peer_codecs;
767-#endif
768760
769761 if ((p_scb->call_ind != BTA_AG_CALL_INACTIVE) ||
770762 (p_scb->callsetup_ind != BTA_AG_CALLSETUP_NONE)) {
@@ -834,7 +826,6 @@ void bta_ag_rcvd_slc_ready(tBTA_AG_SCB* p_scb,
834826 *
835827 ******************************************************************************/
836828 void bta_ag_setcodec(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data) {
837-#if (BTM_WBS_INCLUDED == TRUE)
838829 tBTA_AG_PEER_CODEC codec_type = p_data->api_setcodec.codec;
839830 tBTA_AG_VAL val;
840831
@@ -864,5 +855,4 @@ void bta_ag_setcodec(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data) {
864855 }
865856
866857 (*bta_ag_cb.p_cback)(BTA_AG_WBS_EVT, (tBTA_AG*)&val);
867-#endif
868858 }
--- a/bta/ag/bta_ag_cfg.cc
+++ b/bta/ag/bta_ag_cfg.cc
@@ -49,10 +49,10 @@
4949
5050 #ifndef BTA_AG_SCO_PKT_TYPES
5151 /* 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)
5656 #endif
5757
5858 #ifndef BTA_AG_BIND_INFO
--- a/bta/ag/bta_ag_cmd.cc
+++ b/bta/ag/bta_ag_cmd.cc
@@ -443,7 +443,6 @@ static uint8_t bta_ag_parse_chld(UNUSED_ATTR tBTA_AG_SCB* p_scb, char* p_s) {
443443 return (retval);
444444 }
445445
446-#if (BTM_WBS_INCLUDED == TRUE)
447446 /*******************************************************************************
448447 *
449448 * 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) {
492491
493492 return (retval);
494493 }
495-#endif
496494
497495 /*******************************************************************************
498496 *
@@ -830,17 +828,14 @@ void bta_ag_at_hfp_cback(tBTA_AG_SCB* p_scb, uint16_t cmd, uint8_t arg_type,
830828 tBTA_AG_SCB* ag_scb;
831829 uint32_t i, ind_id;
832830 uint32_t bia_masked_out;
833-#if (BTM_WBS_INCLUDED == TRUE)
834- tBTA_AG_PEER_CODEC codec_type, codec_sent;
835-#endif
836831 if (p_arg == NULL) {
837832 APPL_TRACE_ERROR("%s: p_arg is null, send error and return", __func__);
838833 bta_ag_send_error(p_scb, BTA_AG_ERR_INV_CHAR_IN_TSTR);
839834 return;
840835 }
841836
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);
844839
845840 memset(&val, 0, sizeof(tBTA_AG_VAL));
846841 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,
11731168 }
11741169 break;
11751170
1176-#if (BTM_WBS_INCLUDED == TRUE)
11771171 case BTA_AG_AT_BAC_EVT:
11781172 bta_ag_send_ok(p_scb);
11791173
@@ -1209,7 +1203,8 @@ void bta_ag_at_hfp_cback(tBTA_AG_SCB* p_scb, uint16_t cmd, uint8_t arg_type,
12091203 }
12101204 break;
12111205
1212- case BTA_AG_AT_BCS_EVT:
1206+ case BTA_AG_AT_BCS_EVT: {
1207+ tBTA_AG_PEER_CODEC codec_type, codec_sent;
12131208 bta_ag_send_ok(p_scb);
12141209 alarm_cancel(p_scb->codec_negotiation_timer);
12151210
@@ -1239,12 +1234,11 @@ void bta_ag_at_hfp_cback(tBTA_AG_SCB* p_scb, uint16_t cmd, uint8_t arg_type,
12391234 /* send final codec info to callback */
12401235 val.num = codec_sent;
12411236 break;
1242-
1237+ }
12431238 case BTA_AG_LOCAL_EVT_BCC:
12441239 bta_ag_send_ok(p_scb);
12451240 bta_ag_sco_open(p_scb, NULL);
12461241 break;
1247-#endif
12481242
12491243 default:
12501244 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) {
16841678 }
16851679 }
16861680
1687-#if (BTM_WBS_INCLUDED == TRUE)
16881681 /*******************************************************************************
16891682 *
16901683 * Function bta_ag_send_bcs
@@ -1722,7 +1715,6 @@ void bta_ag_send_bcs(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data) {
17221715 APPL_TRACE_DEBUG("send +BCS codec is %d", codec_uuid);
17231716 bta_ag_send_result(p_scb, BTA_AG_LOCAL_RES_BCS, NULL, codec_uuid);
17241717 }
1725-#endif
17261718
17271719 /*******************************************************************************
17281720 *
--- a/bta/ag/bta_ag_int.h
+++ b/bta/ag/bta_ag_int.h
@@ -116,11 +116,9 @@ enum {
116116
117117 /* sco states */
118118 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 */
124122 BTA_AG_SCO_OPENING_ST, /* sco connection opening */
125123 BTA_AG_SCO_OPEN_CL_ST, /* opening sco connection being closed */
126124 BTA_AG_SCO_OPEN_XFER_ST, /* opening sco connection being transferred */
@@ -198,9 +196,7 @@ typedef union {
198196 tBTA_AG_API_REGISTER api_register;
199197 tBTA_AG_API_OPEN api_open;
200198 tBTA_AG_API_RESULT api_result;
201-#if (BTM_WBS_INCLUDED == TRUE)
202199 tBTA_AG_API_SETCODEC api_setcodec;
203-#endif
204200 tBTA_AG_DISC_RESULT disc_result;
205201 tBTA_AG_RFC rfc;
206202 tBTA_AG_CI_RX_WRITE ci_rx_write;
@@ -212,12 +208,10 @@ typedef struct {
212208 uint8_t scn;
213209 } tBTA_AG_PROFILE;
214210
215-#if (BTM_WBS_INCLUDED == TRUE)
216211 typedef enum {
217212 BTA_AG_SCO_MSBC_SETTINGS_T2 = 0, /* preferred/default when codec is mSBC */
218213 BTA_AG_SCO_MSBC_SETTINGS_T1,
219214 } tBTA_AG_SCO_MSBC_SETTINGS;
220-#endif
221215
222216 /* type for each service control block */
223217 typedef struct {
@@ -261,7 +255,6 @@ typedef struct {
261255 uint32_t bia_masked_out; /* indicators HF does not want us to send */
262256 alarm_t* collision_timer;
263257 alarm_t* ring_timer;
264-#if (BTM_WBS_INCLUDED == TRUE)
265258 alarm_t* codec_negotiation_timer;
266259 tBTA_AG_PEER_CODEC peer_codecs; /* codecs for eSCO supported by the peer */
267260 tBTA_AG_PEER_CODEC sco_codec; /* codec to be used for eSCO connection */
@@ -271,7 +264,6 @@ typedef struct {
271264 bool codec_fallback; /* If sco nego fails for mSBC, fallback to CVSD */
272265 tBTA_AG_SCO_MSBC_SETTINGS
273266 codec_msbc_settings; /* settings to be used for the impending eSCO */
274-#endif
275267
276268 tBTA_AG_HF_IND
277269 peer_hf_indicators[BTA_AG_MAX_NUM_PEER_HF_IND]; /* Peer supported
@@ -284,12 +276,11 @@ typedef struct {
284276 /* type for sco data */
285277 typedef struct {
286278 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 */
293284 } tBTA_AG_SCO_CB;
294285
295286 /* 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);
389380 extern void bta_ag_sco_listen(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);
390381 extern void bta_ag_sco_open(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);
391382 extern void bta_ag_sco_close(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);
392-#if (BTM_WBS_INCLUDED == TRUE)
393383 extern void bta_ag_sco_codec_nego(tBTA_AG_SCB* p_scb, bool result);
394384 extern void bta_ag_codec_negotiate(tBTA_AG_SCB* p_scb);
395-#endif
396385 extern void bta_ag_sco_shutdown(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);
397386 extern void bta_ag_sco_conn_open(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);
398387 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);
401390 extern void bta_ag_svc_conn_open(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);
402391 extern void bta_ag_result(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);
403392 extern void bta_ag_setcodec(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);
404-#if (BTM_WBS_INCLUDED == TRUE)
405393 extern void bta_ag_send_bcs(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);
406-#endif
407394 extern void bta_ag_send_ring(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);
408395 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);
410396 extern void bta_ag_ci_rx_data(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);
411397 extern void bta_ag_rcvd_slc_ready(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);
412398
--- a/bta/ag/bta_ag_main.cc
+++ b/bta/ag/bta_ag_main.cc
@@ -194,8 +194,8 @@ const uint8_t bta_ag_st_open[][BTA_AG_NUM_COLS] = {
194194 /* RING_TOUT_EVT */ {BTA_AG_SEND_RING, BTA_AG_IGNORE, BTA_AG_OPEN_ST},
195195 /* SVC_TOUT_EVT */ {BTA_AG_START_CLOSE, BTA_AG_IGNORE, BTA_AG_CLOSING_ST},
196196 /* 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}};
199199
200200 /* state table for closing state */
201201 const uint8_t bta_ag_st_closing[][BTA_AG_NUM_COLS] = {
@@ -259,20 +259,16 @@ static tBTA_AG_SCB* bta_ag_scb_alloc(void) {
259259 /* initialize variables */
260260 p_scb->in_use = true;
261261 p_scb->sco_idx = BTM_INVALID_SCO_INDEX;
262-#if (BTM_WBS_INCLUDED == TRUE)
263262 p_scb->codec_updated = false;
264263 p_scb->peer_codecs = BTA_AG_CODEC_CVSD;
265264 p_scb->sco_codec = BTA_AG_CODEC_CVSD;
266-#endif
267265 /* set up timers */
268266 p_scb->ring_timer = alarm_new("bta_ag.scb_ring_timer");
269267 p_scb->collision_timer = alarm_new("bta_ag.scb_collision_timer");
270-#if (BTM_WBS_INCLUDED == TRUE)
271268 p_scb->codec_negotiation_timer =
272269 alarm_new("bta_ag.scb_codec_negotiation_timer");
273270 /* set eSCO mSBC setting to T2 as the preferred */
274271 p_scb->codec_msbc_settings = BTA_AG_SCO_MSBC_SETTINGS_T2;
275-#endif
276272 APPL_TRACE_DEBUG("bta_ag_scb_alloc %d", bta_ag_scb_to_idx(p_scb));
277273 break;
278274 }
@@ -281,7 +277,7 @@ static tBTA_AG_SCB* bta_ag_scb_alloc(void) {
281277 if (i == BTA_AG_NUM_SCB) {
282278 /* out of scbs */
283279 p_scb = NULL;
284- APPL_TRACE_WARNING("Out of ag scbs");
280+ APPL_TRACE_WARNING("%s: Out of scbs", __func__);
285281 }
286282 return p_scb;
287283 }
@@ -304,9 +300,7 @@ void bta_ag_scb_dealloc(tBTA_AG_SCB* p_scb) {
304300
305301 /* stop and free timers */
306302 alarm_free(p_scb->ring_timer);
307-#if (BTM_WBS_INCLUDED == TRUE)
308303 alarm_free(p_scb->codec_negotiation_timer);
309-#endif
310304 alarm_free(p_scb->collision_timer);
311305
312306 /* initialize control block */
@@ -594,9 +588,7 @@ static void bta_ag_api_enable(tBTA_AG_DATA* p_data) {
594588 /* initialize control block */
595589 for (size_t i = 0; i < BTA_AG_NUM_SCB; i++) {
596590 alarm_free(bta_ag_cb.scb[i].ring_timer);
597-#if (BTM_WBS_INCLUDED == TRUE)
598591 alarm_free(bta_ag_cb.scb[i].codec_negotiation_timer);
599-#endif
600592 alarm_free(bta_ag_cb.scb[i].collision_timer);
601593 }
602594 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,
723715 tBTA_AG_ST_TBL state_table;
724716 uint8_t action;
725717 int i;
726-
727718 #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;
730721
731722 /* Ignore displaying of AT results when not connected (Ignored in state
732723 * 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,
736729 bta_ag_state_str(p_scb->state), event,
737730 bta_ag_evt_str(event, p_data->api_result.result));
738731 }
739732 #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+ }
742737 #endif
743738
744739 event &= 0x00FF;
745740 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__);
747742 return;
748743 }
749744
@@ -763,10 +758,11 @@ void bta_ag_sm_execute(tBTA_AG_SCB* p_scb, uint16_t event,
763758 }
764759 }
765760 #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));
770766 }
771767 #endif
772768 }
@@ -786,22 +782,18 @@ bool bta_ag_hdl_event(BT_HDR* p_msg) {
786782
787783 APPL_TRACE_DEBUG("bta_ag_hdl_event: Event 0x%04x ", p_msg->event);
788784 switch (p_msg->event) {
789- /* handle enable event */
790785 case BTA_AG_API_ENABLE_EVT:
791786 bta_ag_api_enable((tBTA_AG_DATA*)p_msg);
792787 break;
793788
794- /* handle disable event */
795789 case BTA_AG_API_DISABLE_EVT:
796790 bta_ag_api_disable((tBTA_AG_DATA*)p_msg);
797791 break;
798792
799- /* handle register event */
800793 case BTA_AG_API_REGISTER_EVT:
801794 bta_ag_api_register((tBTA_AG_DATA*)p_msg);
802795 break;
803796
804- /* handle result event */
805797 case BTA_AG_API_RESULT_EVT:
806798 bta_ag_api_result((tBTA_AG_DATA*)p_msg);
807799 break;
--- a/bta/ag/bta_ag_sco.cc
+++ b/bta/ag/bta_ag_sco.cc
@@ -24,15 +24,17 @@
2424
2525 #include <stddef.h>
2626
27+#include "bt_common.h"
2728 #include "bta_ag_api.h"
2829 #include "bta_ag_co.h"
30+#include "bta_ag_int.h"
2931 #include "bta_api.h"
3032 #if (BTM_SCO_HCI_INCLUDED == TRUE)
3133 #include "bta_dm_co.h"
3234 #endif
33-#include "bt_common.h"
34-#include "bta_ag_int.h"
3535 #include "btm_api.h"
36+#include "device/include/controller.h"
37+#include "device/include/esco_parameters.h"
3638 #include "osi/include/osi.h"
3739 #include "utl.h"
3840
@@ -52,19 +54,17 @@ static char* bta_ag_sco_evt_str(uint8_t event);
5254 static char* bta_ag_sco_state_str(uint8_t state);
5355 #endif
5456
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)
5860
5961 /* sco events */
6062 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 */
6566 BTA_AG_SCO_CN_DONE_E, /* codec negotiation done */
6667 BTA_AG_SCO_REOPEN_E, /* Retry with other codec when failed */
67-#endif
6868 BTA_AG_SCO_CLOSE_E, /* close request */
6969 BTA_AG_SCO_SHUTDOWN_E, /* shutdown request */
7070 BTA_AG_SCO_CONN_OPEN_E, /* sco open */
@@ -72,63 +72,7 @@ enum {
7272 BTA_AG_SCO_CI_DATA_E /* SCO data ready */
7373 };
7474
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);
13276
13377 /*******************************************************************************
13478 *
@@ -209,37 +153,39 @@ static void bta_ag_sco_disc_cback(uint16_t sco_idx) {
209153
210154 if (handle != 0) {
211155 #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);
215160 /* SCO clean up here */
216161 bta_dm_sco_co_close();
217162 #endif
218163
219-#if (BTM_WBS_INCLUDED == TRUE)
220164 /* Restore settings */
221165 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+ }
224171
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 */
228174 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;
229176 if (bta_ag_cb.sco.p_curr_scb->codec_msbc_settings ==
230177 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__);
232179 bta_ag_cb.sco.p_curr_scb->codec_msbc_settings =
233180 BTA_AG_SCO_MSBC_SETTINGS_T1;
234181 } else {
235- APPL_TRACE_DEBUG("Fallback to CVSD settings");
182+ APPL_TRACE_DEBUG("%s: Fallback to CVSD", __func__);
236183 bta_ag_cb.sco.p_curr_scb->codec_fallback = true;
237184 }
238185 }
239186 }
240187
241188 bta_ag_cb.sco.p_curr_scb->inuse_codec = BTA_AG_CODEC_NONE;
242-#endif
243189
244190 BT_HDR* p_buf = (BT_HDR*)osi_malloc(sizeof(BT_HDR));
245191 p_buf->event = BTA_AG_SCO_CLOSE_EVT;
@@ -271,7 +217,7 @@ static void bta_ag_sco_disc_cback(uint16_t sco_idx) {
271217 static void bta_ag_sco_read_cback(uint16_t sco_inx, BT_HDR* p_data,
272218 tBTM_SCO_DATA_FLAG status) {
273219 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);
275221 }
276222
277223 /* 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,
286232 * If only_active is true, then SCO is only removed if
287233 * connected
288234 *
289- * Returns bool - true if Sco removal was started
235+ * Returns bool - true if SCO removal was started
290236 *
291237 ******************************************************************************/
292238 static bool bta_ag_remove_sco(tBTA_AG_SCB* p_scb, bool only_active) {
293- bool removed_started = false;
294- tBTM_STATUS status;
295-
296239 if (p_scb->sco_idx != BTM_INVALID_SCO_INDEX) {
297240 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);
303244 if (status == BTM_CMD_STARTED) {
304- /* Sco is connected; set current control block */
245+ /* SCO is connected; set current control block */
305246 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 */
311250 p_scb->sco_idx = BTM_INVALID_SCO_INDEX;
312251 }
313252 }
314253 }
315- return removed_started;
254+ return false;
316255 }
317256
318257 /*******************************************************************************
@@ -339,16 +278,15 @@ static void bta_ag_esco_connreq_cback(tBTM_ESCO_EVT event,
339278
340279 /* If no other SCO active, allow this one */
341280 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);
345283 bta_ag_sco_conn_rsp(p_scb, &p_data->conn_evt);
346284
347285 bta_ag_cb.sco.state = BTA_AG_SCO_OPENING_ST;
348286 bta_ag_cb.sco.p_curr_scb = p_scb;
349287 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 */
352290 APPL_TRACE_DEBUG("bta_ag_esco_connreq_cback: Begin XFER");
353291 bta_ag_cb.sco.p_xfer_scb = p_scb;
354292 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,
356294
357295 if (!bta_ag_remove_sco(bta_ag_cb.sco.p_curr_scb, true)) {
358296 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);
362299 bta_ag_cb.sco.p_xfer_scb = NULL;
363300 bta_ag_cb.sco.state = BTA_AG_SCO_LISTEN_ST;
364301
365302 bta_ag_sco_conn_rsp(p_scb, &p_data->conn_evt);
366303 }
367304 }
368- }
369- /* If error occurred send reject response immediately */
370- else {
305+ } else {
306+ /* If error occurred send reject response immediately */
371307 APPL_TRACE_WARNING(
372308 "no scb for bta_ag_esco_connreq_cback or no resources");
373309 BTM_EScoConnRsp(p_data->conn_evt.sco_inx, HCI_ERR_HOST_REJECT_RESOURCES,
374- NULL);
310+ (enh_esco_params_t*)NULL);
375311 }
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 */
379314 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,
382318 p_data->chg_evt.rx_pkt_len, p_data->chg_evt.tx_pkt_len,
383319 p_data->chg_evt.tx_interval);
384320 }
@@ -408,176 +344,188 @@ static void bta_ag_cback_sco(tBTA_AG_SCB* p_scb, uint8_t event) {
408344 *
409345 * Function bta_ag_create_sco
410346 *
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
413350 *
414351 * Returns void
415352 *
416353 ******************************************************************************/
417354 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;
430356
431- /* Make sure this sco handle is not already in use */
357+ /* Make sure this SCO handle is not already in use */
432358 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);
435361 return;
436362 }
437363
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 &&
440369 !p_scb->retry_with_sco_only)
441- esco_codec = BTM_SCO_CODEC_MSBC;
370+ esco_codec = BTA_AG_CODEC_MSBC;
442371
443372 if (p_scb->codec_fallback) {
444373 p_scb->codec_fallback = false;
445-
446374 /* Force AG to send +BCS for the next audio connection. */
447375 p_scb->codec_updated = true;
448376 }
449377
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) {
454382 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;
456384 } else {
457- codec_index = BTA_AG_ESCO_SETTING_IDX_T1;
385+ codec_index = ESCO_CODEC_MSBC_T1;
458386 }
459387 }
460388
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;
479401 }
480402 }
481403
482- /* if initiating set current scb and peer bd addr */
404+ /* If initiating, setup parameters to start SCO/eSCO connection */
483405 if (is_orig) {
406+ bta_ag_cb.sco.is_local = true;
484407 /* 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 */
486409 if (p_scb->conn_service == BTA_AG_HFP &&
487410 p_scb->peer_version >= HFP_VERSION_1_5 && !p_scb->retry_with_sco_only) {
488- BTM_SetEScoMode(BTM_LINK_TYPE_ESCO, &params);
489- /* If ESCO or EDR ESCO, retry with SCO only in case of failure */
411+ BTM_SetEScoMode(&params);
412+ /* If eSCO or EDR eSCO, retry with SCO only in case of failure */
490413 if ((params.packet_types & BTM_ESCO_LINK_ONLY_MASK) ||
491414 !((params.packet_types &
492415 ~(BTM_ESCO_LINK_ONLY_MASK | BTM_SCO_LINK_ONLY_MASK)) ^
493416 BTA_AG_NO_EDR_ESCO)) {
494-#if (BTM_WBS_INCLUDED == TRUE)
417+ /* However, do not retry with SCO when using mSBC */
495418 if (esco_codec != BTA_AG_CODEC_MSBC) {
496419 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");
502420 }
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);
507423 }
508424 } 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);
510427 p_scb->retry_with_sco_only = false;
511-
512- BTM_SetEScoMode(BTM_LINK_TYPE_SCO, &params);
428+ BTM_SetEScoMode(&params);
513429 }
514430
515431 bta_ag_cb.sco.p_curr_scb = p_scb;
516432
433+ /* save the current codec as sco_codec can be updated while SCO is open. */
434+ p_scb->inuse_codec = esco_codec;
435+
517436 /* tell sys to stop av if any */
518437 bta_sys_sco_use(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr);
519438
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;
539446
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);
547452
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+ }
551501
552502 #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);
556507 #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;
562508
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 */
571514 bta_ag_cb.sco.cur_idx = p_scb->sco_idx;
572515 }
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+ }
574524
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, &params);
526+ }
578527 }
579528
580-#if (BTM_WBS_INCLUDED == TRUE)
581529 /*******************************************************************************
582530 *
583531 * Function bta_ag_attempt_msbc_safe_settings
@@ -608,6 +556,7 @@ bool bta_ag_attempt_msbc_safe_settings(tBTA_AG_SCB* p_scb) {
608556 *
609557 ******************************************************************************/
610558 static void bta_ag_codec_negotiation_timer_cback(void* data) {
559+ APPL_TRACE_DEBUG("%s", __func__);
611560 tBTA_AG_SCB* p_scb = (tBTA_AG_SCB*)data;
612561
613562 /* Announce that codec negotiation failed. */
@@ -628,12 +577,12 @@ static void bta_ag_codec_negotiation_timer_cback(void* data) {
628577 *
629578 ******************************************************************************/
630579 void bta_ag_codec_negotiate(tBTA_AG_SCB* p_scb) {
580+ APPL_TRACE_DEBUG("%s", __func__);
631581 bta_ag_cb.sco.p_curr_scb = p_scb;
632582
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) &&
635584 (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. */
637586 bta_sys_busy(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr);
638587
639588 /* Send +BCS to the peer */
@@ -651,7 +600,6 @@ void bta_ag_codec_negotiate(tBTA_AG_SCB* p_scb) {
651600 bta_ag_sco_codec_nego(p_scb, true);
652601 }
653602 }
654-#endif /* (BTM_WBS_INCLUDED == TRUE) */
655603
656604 /*******************************************************************************
657605 *
@@ -665,22 +613,24 @@ void bta_ag_codec_negotiate(tBTA_AG_SCB* p_scb) {
665613 ******************************************************************************/
666614 static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) {
667615 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
671616 #if (BTM_SCO_HCI_INCLUDED == TRUE)
672617 BT_HDR* p_buf;
673618 #endif
619+
674620 #if (BTA_AG_SCO_DEBUG == TRUE)
675621 uint8_t in_state = p_sco->state;
676622
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+ }
681629 #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+ }
684634 #endif
685635
686636 #if (BTM_SCO_HCI_INCLUDED == TRUE)
@@ -710,8 +660,8 @@ static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) {
710660 break;
711661
712662 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);
715665 break;
716666 }
717667 break;
@@ -727,15 +677,9 @@ static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) {
727677 /* remove listening connection */
728678 bta_ag_remove_sco(p_scb, false);
729679
730-#if (BTM_WBS_INCLUDED == TRUE)
731680 /* start codec negotiation */
732681 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);
739683 break;
740684
741685 case BTA_AG_SCO_SHUTDOWN_E:
@@ -752,9 +696,10 @@ static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) {
752696
753697 case BTA_AG_SCO_CLOSE_E:
754698 /* 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
756700 */
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);
758703 break;
759704
760705 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) {
764709 break;
765710
766711 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);
768714 break;
769715 }
770716 break;
771717
772-#if (BTM_WBS_INCLUDED == TRUE)
773718 case BTA_AG_SCO_CODEC_ST:
774719 switch (event) {
775720 case BTA_AG_SCO_LISTEN_E:
@@ -813,11 +758,11 @@ static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) {
813758 break;
814759
815760 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);
817763 break;
818764 }
819765 break;
820-#endif
821766
822767 case BTA_AG_SCO_OPENING_ST:
823768 switch (event) {
@@ -829,13 +774,11 @@ static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) {
829774 }
830775 break;
831776
832-#if (BTM_WBS_INCLUDED == TRUE)
833777 case BTA_AG_SCO_REOPEN_E:
834778 /* start codec negotiation */
835779 p_sco->state = BTA_AG_SCO_CODEC_ST;
836- p_cn_scb = p_scb;
780+ bta_ag_codec_negotiate(p_scb);
837781 break;
838-#endif
839782
840783 case BTA_AG_SCO_XFER_E:
841784 /* save xfer scb */
@@ -868,7 +811,8 @@ static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) {
868811 break;
869812
870813 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);
872816 break;
873817 }
874818 break;
@@ -910,7 +854,8 @@ static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) {
910854 break;
911855
912856 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);
914859 break;
915860 }
916861 break;
@@ -945,8 +890,8 @@ static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) {
945890 break;
946891
947892 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);
950895 break;
951896 }
952897 break;
@@ -995,7 +940,8 @@ static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) {
995940 break;
996941
997942 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);
999945 break;
1000946 }
1001947 break;
@@ -1038,7 +984,8 @@ static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) {
1038984 break;
1039985
1040986 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);
1042989 break;
1043990 }
1044991 break;
@@ -1054,15 +1001,9 @@ static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) {
10541001 break;
10551002
10561003 case BTA_AG_SCO_CONN_CLOSE_E:
1057-#if (BTM_WBS_INCLUDED == TRUE)
10581004 /* start codec negotiation */
10591005 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);
10661007 break;
10671008
10681009 case BTA_AG_SCO_LISTEN_E:
@@ -1073,8 +1014,8 @@ static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) {
10731014 break;
10741015
10751016 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);
10781019 break;
10791020 }
10801021 break;
@@ -1101,29 +1042,24 @@ static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) {
11011042 p_sco->state = BTA_AG_SCO_SHUTTING_ST;
11021043 break;
11031044
1104- case BTA_AG_SCO_CONN_CLOSE_E:
1045+ case BTA_AG_SCO_CONN_CLOSE_E: {
11051046 /* closed sco; place old sco in listen mode,
11061047 take current sco out of listen, and
11071048 create originating sco for current */
11081049 bta_ag_create_sco(p_scb, false);
11091050 bta_ag_remove_sco(p_sco->p_xfer_scb, false);
11101051
1111-#if (BTM_WBS_INCLUDED == TRUE)
11121052 /* start codec negotiation */
11131053 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;
11151055 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);
11221057 break;
1058+ }
11231059
11241060 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);
11271063 break;
11281064 }
11291065 break;
@@ -1179,8 +1115,8 @@ static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) {
11791115 break;
11801116
11811117 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);
11841120 break;
11851121 }
11861122 break;
@@ -1196,12 +1132,6 @@ static void bta_ag_sco_event(tBTA_AG_SCB* p_scb, uint8_t event) {
11961132 bta_ag_sco_evt_str(event));
11971133 }
11981134 #endif
1199-
1200-#if (BTM_WBS_INCLUDED == TRUE)
1201- if (p_cn_scb) {
1202- bta_ag_codec_negotiate(p_cn_scb);
1203- }
1204-#endif
12051135 }
12061136
12071137 /*******************************************************************************
@@ -1286,27 +1216,21 @@ void bta_ag_sco_open(tBTA_AG_SCB* p_scb, UNUSED_ATTR tBTA_AG_DATA* p_data) {
12861216 ******************************************************************************/
12871217 void bta_ag_sco_close(tBTA_AG_SCB* p_scb, UNUSED_ATTR tBTA_AG_DATA* p_data) {
12881218 /* 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. */
12921221 if ((p_scb->sco_idx != BTM_INVALID_SCO_INDEX) ||
12931222 (bta_ag_cb.sco.state == BTA_AG_SCO_CODEC_ST))
1294-#else
1295- if (p_scb->sco_idx != BTM_INVALID_SCO_INDEX)
1296-#endif
12971223 {
12981224 APPL_TRACE_DEBUG("bta_ag_sco_close: sco_inx = %d", p_scb->sco_idx);
12991225 bta_ag_sco_event(p_scb, BTA_AG_SCO_CLOSE_E);
13001226 }
13011227 }
13021228
1303-#if (BTM_WBS_INCLUDED == TRUE)
1304-
13051229 /*******************************************************************************
13061230 *
13071231 * Function bta_ag_sco_codec_nego
13081232 *
1309- * Description
1233+ * Description Handles result of eSCO codec negotiation
13101234 *
13111235 *
13121236 * Returns void
@@ -1314,14 +1238,17 @@ void bta_ag_sco_close(tBTA_AG_SCB* p_scb, UNUSED_ATTR tBTA_AG_DATA* p_data) {
13141238 ******************************************************************************/
13151239 void bta_ag_sco_codec_nego(tBTA_AG_SCB* p_scb, bool result) {
13161240 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);
13181244 p_scb->codec_updated = false;
1319-
13201245 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);
13221249 bta_ag_sco_event(p_scb, BTA_AG_SCO_CLOSE_E);
1250+ }
13231251 }
1324-#endif
13251252
13261253 /*******************************************************************************
13271254 *
@@ -1353,13 +1280,6 @@ void bta_ag_sco_conn_open(tBTA_AG_SCB* p_scb,
13531280
13541281 bta_sys_sco_open(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr);
13551282
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-
13631283 #if (BTM_SCO_HCI_INCLUDED == TRUE)
13641284 /* open SCO codec if SCO is routed through transport */
13651285 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,
13701290 bta_ag_cback_sco(p_scb, BTA_AG_AUDIO_OPEN_EVT);
13711291
13721292 p_scb->retry_with_sco_only = false;
1373-#if (BTM_WBS_INCLUDED == TRUE)
13741293 /* reset to mSBC T2 settings as the preferred */
13751294 p_scb->codec_msbc_settings = BTA_AG_SCO_MSBC_SETTINGS_T2;
1376-#endif
13771295 }
13781296
13791297 /*******************************************************************************
@@ -1388,13 +1306,10 @@ void bta_ag_sco_conn_open(tBTA_AG_SCB* p_scb,
13881306 ******************************************************************************/
13891307 void bta_ag_sco_conn_close(tBTA_AG_SCB* p_scb,
13901308 UNUSED_ATTR tBTA_AG_DATA* p_data) {
1391- uint16_t handle = bta_ag_scb_to_idx(p_scb);
1392-
13931309 /* clear current scb */
13941310 bta_ag_cb.sco.p_curr_scb = NULL;
13951311 p_scb->sco_idx = BTM_INVALID_SCO_INDEX;
13961312
1397-#if (BTM_WBS_INCLUDED == TRUE)
13981313 /* codec_fallback is set when AG is initiator and connection failed for mSBC.
13991314 */
14001315 /* 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,
14061321 * eSCO */
14071322 bta_ag_create_sco(p_scb, true);
14081323 }
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
14161324 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
14231325 /* 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
14261326 bta_ag_sco_event(p_scb, BTA_AG_SCO_CONN_CLOSE_E);
14271327
14281328 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,
14371337
14381338 /* call app callback */
14391339 bta_ag_cback_sco(p_scb, BTA_AG_AUDIO_CLOSE_EVT);
1440-#if (BTM_WBS_INCLUDED == TRUE)
14411340 p_scb->codec_msbc_settings = BTA_AG_SCO_MSBC_SETTINGS_T2;
1442-#endif
14431341 }
14441342 p_scb->retry_with_sco_only = false;
14451343 }
@@ -1456,71 +1354,29 @@ void bta_ag_sco_conn_close(tBTA_AG_SCB* p_scb,
14561354 ******************************************************************************/
14571355 void bta_ag_sco_conn_rsp(tBTA_AG_SCB* p_scb,
14581356 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);
14651363
14661364 if (bta_ag_cb.sco.state == BTA_AG_SCO_LISTEN_ST ||
14671365 bta_ag_cb.sco.state == BTA_AG_SCO_CLOSE_XFER_ST ||
14681366 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-
14921367 /* tell sys to stop av if any */
14931368 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
15001369 /* 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-
15061370 #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);
15141373 #endif
1515- } else
1516- hci_status = HCI_ERR_HOST_REJECT_DEVICE;
1374+ }
15171375
1518-#if (BTM_WBS_INCLUDED == TRUE)
15191376 /* If SCO open was initiated from HS, it must be CVSD */
15201377 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);
15241380 }
15251381
15261382 /*******************************************************************************
@@ -1541,29 +1397,6 @@ void bta_ag_ci_sco_data(UNUSED_ATTR tBTA_AG_SCB* p_scb,
15411397 }
15421398
15431399 /*******************************************************************************
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-/*******************************************************************************
15671400 * Debugging functions
15681401 ******************************************************************************/
15691402
@@ -1576,12 +1409,10 @@ static char* bta_ag_sco_evt_str(uint8_t event) {
15761409 return "Open Request";
15771410 case BTA_AG_SCO_XFER_E:
15781411 return "Transfer Request";
1579-#if (BTM_WBS_INCLUDED == TRUE)
15801412 case BTA_AG_SCO_CN_DONE_E:
15811413 return "Codec Negotiation Done";
15821414 case BTA_AG_SCO_REOPEN_E:
15831415 return "Reopen Request";
1584-#endif
15851416 case BTA_AG_SCO_CLOSE_E:
15861417 return "Close Request";
15871418 case BTA_AG_SCO_SHUTDOWN_E:
@@ -1603,10 +1434,8 @@ static char* bta_ag_sco_state_str(uint8_t state) {
16031434 return "Shutdown";
16041435 case BTA_AG_SCO_LISTEN_ST:
16051436 return "Listening";
1606-#if (BTM_WBS_INCLUDED == TRUE)
16071437 case BTA_AG_SCO_CODEC_ST:
16081438 return "Codec Negotiation";
1609-#endif
16101439 case BTA_AG_SCO_OPENING_ST:
16111440 return "Opening";
16121441 case BTA_AG_SCO_OPEN_CL_ST:
@@ -1628,4 +1457,4 @@ static char* bta_ag_sco_state_str(uint8_t state) {
16281457 }
16291458 }
16301459
1631-#endif
1460+#endif /* (BTA_AG_SCO_DEBUG) */
--- a/bta/dm/bta_dm_act.cc
+++ b/bta/dm/bta_dm_act.cc
@@ -3920,11 +3920,11 @@ bool bta_dm_check_if_only_hd_connected(BD_ADDR peer_addr) {
39203920 !bdcmp(bta_dm_conn_srvcs.conn_srvc[j].peer_bdaddr, peer_addr)) {
39213921 APPL_TRACE_DEBUG("%s: Another profile (id=%d) is connected", __func__,
39223922 bta_dm_conn_srvcs.conn_srvc[j].id);
3923- return FALSE;
3923+ return false;
39243924 }
39253925 }
39263926
3927- return TRUE;
3927+ return true;
39283928 }
39293929
39303930 /*******************************************************************************
--- a/bta/hf_client/bta_hf_client_sco.cc
+++ b/bta/hf_client/bta_hf_client_sco.cc
@@ -20,50 +20,14 @@
2020
2121 #include "bt_trace.h"
2222 #include "bt_utils.h"
23+#include "bta_ag_api.h"
2324 #include "bta_hf_client_int.h"
25+#include "device/include/esco_parameters.h"
2426 #include "osi/include/osi.h"
2527
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)
6731
6832 enum {
6933 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) {
138102 ******************************************************************************/
139103 static void bta_hf_client_sco_conn_rsp(tBTA_HF_CLIENT_CB* client_cb,
140104 tBTM_ESCO_CONN_REQ_EVT_DATA* p_data) {
141- tBTM_ESCO_PARAMS resp;
105+ enh_esco_params_t resp;
142106 uint8_t hci_status = HCI_SUCCESS;
143107
144108 APPL_TRACE_DEBUG("%s", __func__);
145109
146110 if (client_cb->sco_state == BTA_HF_CLIENT_SCO_LISTEN_ST) {
147111 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);
149113 } 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);
151118 }
152119
153120 /* tell sys to stop av if any */
@@ -255,7 +222,6 @@ static void bta_hf_client_sco_create(tBTA_HF_CLIENT_CB* client_cb,
255222 bool is_orig) {
256223 tBTM_STATUS status;
257224 uint8_t* p_bd_addr = NULL;
258- tBTM_ESCO_PARAMS params;
259225
260226 APPL_TRACE_DEBUG("%s: %d", __func__, is_orig);
261227
@@ -266,14 +232,14 @@ static void bta_hf_client_sco_create(tBTA_HF_CLIENT_CB* client_cb,
266232 return;
267233 }
268234
269- params = bta_hf_client_esco_params[1];
235+ enh_esco_params_t params = esco_parameters_for_codec(ESCO_CODEC_MSBC_T1);
270236
271237 /* if initiating set current scb and peer bd addr */
272238 if (is_orig) {
273239 /* Attempt to use eSCO if remote host supports HFP >= 1.5 */
274240 if (client_cb->peer_version >= HFP_VERSION_1_5 &&
275241 !client_cb->retry_with_sco_only) {
276- BTM_SetEScoMode(BTM_LINK_TYPE_ESCO, &params);
242+ BTM_SetEScoMode(&params);
277243 /* If ESCO or EDR ESCO, retry with SCO only in case of failure */
278244 if ((params.packet_types & BTM_ESCO_LINK_ONLY_MASK) ||
279245 !((params.packet_types &
@@ -287,7 +253,7 @@ static void bta_hf_client_sco_create(tBTA_HF_CLIENT_CB* client_cb,
287253 APPL_TRACE_API("retrying with SCO only");
288254 client_cb->retry_with_sco_only = false;
289255
290- BTM_SetEScoMode(BTM_LINK_TYPE_SCO, &params);
256+ BTM_SetEScoMode(&params);
291257 }
292258
293259 /* tell sys to stop av if any */
--- a/bta/include/bta_ag_api.h
+++ b/bta/include/bta_ag_api.h
@@ -165,7 +165,6 @@ typedef uint16_t tBTA_AG_PEER_FEAT;
165165
166166 /* HFP peer supported codec masks */
167167 // TODO(google) This should use common definitions
168-// in hci/include/hci_audio.h
169168 #define BTA_AG_CODEC_NONE BTM_SCO_CODEC_NONE
170169 #define BTA_AG_CODEC_CVSD BTM_SCO_CODEC_CVSD /* CVSD */
171170 #define BTA_AG_CODEC_MSBC BTM_SCO_CODEC_MSBC /* mSBC */
@@ -292,9 +291,7 @@ typedef struct {
292291 #define BTA_AG_MIC_EVT 8 /* Microphone volume changed */
293292 #define BTA_AG_AT_CKPD_EVT 9 /* CKPD from the HS */
294293 #define BTA_AG_DISABLE_EVT 30 /* AG disabled */
295-#if (BTM_WBS_INCLUDED == TRUE)
296294 #define BTA_AG_WBS_EVT 31 /* SCO codec info */
297-#endif
298295 /* Values below are for HFP only */
299296 #define BTA_AG_AT_A_EVT 10 /* Answer a call */
300297 #define BTA_AG_AT_D_EVT 11 /* Place a call using number or memory dial */
--- a/bta/include/bta_ag_co.h
+++ b/bta/include/bta_ag_co.h
@@ -25,7 +25,6 @@
2525 #define BTA_AG_CO_H
2626
2727 #include "bta_ag_api.h"
28-#include "hci/include/hci_audio.h"
2928
3029 /*******************************************************************************
3130 *
@@ -44,34 +43,6 @@ extern void bta_ag_co_init(void);
4443
4544 /*******************************************************************************
4645 *
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- *
7546 * Function bta_ag_co_data_open
7647 *
7748 * Description This function is executed by AG when a service level
--- a/bta/include/bta_dm_co.h
+++ b/bta/include/bta_dm_co.h
@@ -25,26 +25,12 @@
2525 #define BTA_DM_CO_H
2626
2727 #include "bta_sys.h"
28+#include "btm_api.h"
2829
2930 #ifndef BTA_SCO_OUT_PKT_SIZE
3031 #define BTA_SCO_OUT_PKT_SIZE BTM_SCO_DATA_SIZE_MAX
3132 #endif
3233
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-
4834 /*****************************************************************************
4935 * Function Declarations
5036 ****************************************************************************/
@@ -135,25 +121,6 @@ extern void bta_dm_co_loc_oob(bool valid, BT_OCTET16 c, BT_OCTET16 r);
135121 ******************************************************************************/
136122 extern void bta_dm_co_rmt_oob(BD_ADDR bd_addr);
137123
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-
157124 /*******************************************************************************
158125 *
159126 * Function bta_dm_sco_co_open
--- a/bta/sys/bta_sys_main.cc
+++ b/bta/sys/bta_sys_main.cc
@@ -462,7 +462,7 @@ void bta_sys_event(BT_HDR* p_msg) {
462462 uint8_t id;
463463 bool freebuf = true;
464464
465- APPL_TRACE_EVENT("BTA got event 0x%x", p_msg->event);
465+ APPL_TRACE_EVENT("%s: Event 0x%x", __func__, p_msg->event);
466466
467467 /* get subsystem id from event */
468468 id = (uint8_t)(p_msg->event >> 8);
@@ -471,7 +471,7 @@ void bta_sys_event(BT_HDR* p_msg) {
471471 if ((id < BTA_ID_MAX) && (bta_sys_cb.reg[id] != NULL)) {
472472 freebuf = (*bta_sys_cb.reg[id]->evt_hdlr)(p_msg);
473473 } else {
474- APPL_TRACE_WARNING("BTA got unregistered event id %d", id);
474+ APPL_TRACE_WARNING("%s: Received unregistered event id %d", __func__, id);
475475 }
476476
477477 if (freebuf) {
--- a/btif/Android.bp
+++ b/btif/Android.bp
@@ -6,6 +6,7 @@ btifCommonIncludes = [
66 "system/bt/bta/sys",
77 "system/bt/bta/dm",
88 "system/bt/btcore/include",
9+ "system/bt/device/include",
910 "system/bt/include",
1011 "system/bt/stack/include",
1112 "system/bt/stack/l2cap",
--- a/btif/BUILD.gn
+++ b/btif/BUILD.gn
@@ -82,6 +82,7 @@ static_library("btif") {
8282 "//bta/include",
8383 "//bta/sys",
8484 "//btcore/include",
85+ "//device/include",
8586 "//embdrv/sbc/encoder/include",
8687 "//embdrv/sbc/decoder/include",
8788 "//hci/include",
--- a/btif/co/bta_ag_co.cc
+++ b/btif/co/bta_ag_co.cc
@@ -19,8 +19,9 @@
1919 #define LOG_TAG "bt_btif_bta_ag"
2020
2121 #include "bta/include/bta_ag_co.h"
22+#include "bta/ag/bta_ag_int.h"
2223 #include "bta/include/bta_ag_api.h"
23-#include "hci/include/hci_audio.h"
24+#include "bta/include/bta_ag_ci.h"
2425 #include "osi/include/osi.h"
2526
2627 /*******************************************************************************
@@ -40,70 +41,6 @@ void bta_ag_co_init(void) { BTM_WriteVoiceSettings(AG_VOICE_SETTINGS); }
4041
4142 /*******************************************************************************
4243 *
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- *
10744 * Function bta_ag_co_data_open
10845 *
10946 * Description This function is executed by AG when a service level
--- a/btif/co/bta_dm_co.cc
+++ b/btif/co/bta_dm_co.cc
@@ -182,48 +182,6 @@ void bta_dm_co_rmt_oob(BD_ADDR bd_addr) {
182182 static void btui_sco_codec_callback(uint16_t event, uint16_t sco_handle) {
183183 bta_dm_sco_ci_data_ready(event, sco_handle);
184184 }
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-}
227185
228186 /*******************************************************************************
229187 *
--- a/btif/src/btif_hf.cc
+++ b/btif/src/btif_hf.cc
@@ -67,7 +67,6 @@
6767 #define BTIF_HF_SECURITY (BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT)
6868 #endif
6969
70-#if (BTM_WBS_INCLUDED == TRUE)
7170 #ifndef BTIF_HF_FEATURES
7271 #define BTIF_HF_FEATURES \
7372 (BTA_AG_FEAT_3WAY | BTA_AG_FEAT_ECNR | BTA_AG_FEAT_REJECT | \
@@ -75,14 +74,6 @@
7574 BTA_AG_FEAT_CODEC | BTA_AG_FEAT_HF_IND | BTA_AG_FEAT_ESCO | \
7675 BTA_AG_FEAT_UNAT)
7776 #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
8677
8778 /* HF features supported at runtime */
8879 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) {
508499 &btif_hf_cb[idx].connected_bda);
509500 break;
510501
511-#if (BTM_WBS_INCLUDED == TRUE)
512502 case BTA_AG_WBS_EVT:
513503 BTIF_TRACE_DEBUG(
514504 "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) {
524514 &btif_hf_cb[idx].connected_bda);
525515 }
526516 break;
527-#endif
517+
528518 /* Java needs to send OK/ERROR for these commands */
529519 case BTA_AG_AT_CHLD_EVT:
530520 HAL_CBACK(bt_hf_callbacks, chld_cmd_cb,
@@ -557,15 +547,14 @@ static void btif_hf_upstreams_evt(uint16_t event, char* p_param) {
557547 break;
558548 case BTA_AG_AT_BAC_EVT:
559549 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,
562551 then
563552 we should set the BTA AG Codec to mSBC. This would trigger a +BCS to mSBC
564553 at the time
565554 of SCO connection establishment */
566555 if ((btif_conf_hf_force_wbs == true) &&
567556 (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",
569558 __func__);
570559 BTA_AgSetCodec(btif_hf_cb[idx].handle, BTA_AG_CODEC_MSBC);
571560 } else {
@@ -573,15 +562,15 @@ static void btif_hf_upstreams_evt(uint16_t event, char* p_param) {
573562 __func__);
574563 BTA_AgSetCodec(btif_hf_cb[idx].handle, BTA_AG_CODEC_CVSD);
575564 }
576-#endif
577565 break;
578566 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 */
582571 HAL_CBACK(
583572 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,
585574 &btif_hf_cb[idx].connected_bda);
586575 break;
587576
@@ -1309,7 +1298,7 @@ static bt_status_t phone_state_change(int num_active, int num_held,
13091298 ag_res.audio_handle = BTA_AG_HANDLE_SCO_NO_CHANGE;
13101299 /* Addition call setup with the Active call
13111300 ** CIND response should have been updated.
1312- ** just open SCO conenction.
1301+ ** just open SCO connection.
13131302 */
13141303 if (call_setup_state != BTHF_CALL_STATE_IDLE)
13151304 res = BTA_AG_MULTI_CALL_RES;
--- a/btif/src/btif_rc.cc
+++ b/btif/src/btif_rc.cc
@@ -1123,7 +1123,7 @@ bool btif_rc_get_connected_peer(BD_ADDR peer_addr) {
11231123 p_dev = get_connected_device(idx);
11241124 if (p_dev != NULL && (p_dev->rc_connected == TRUE)) {
11251125 bdcpy(peer_addr, p_dev->rc_addr);
1126- return TRUE;
1126+ return true;
11271127 }
11281128 }
11291129 return false;
--- a/btif/src/btif_sock_sco.cc
+++ b/btif/src/btif_sock_sco.cc
@@ -32,6 +32,7 @@
3232 #include <hardware/bt_sock.h>
3333
3434 #include "btif_common.h"
35+#include "device/include/esco_parameters.h"
3536 #include "osi/include/allocator.h"
3637 #include "osi/include/list.h"
3738 #include "osi/include/log.h"
@@ -63,17 +64,6 @@ typedef struct {
6364 bool connect_completed;
6465 } sco_socket_t;
6566
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-
7767 static sco_socket_t* sco_socket_establish_locked(bool is_listening,
7868 const bt_bdaddr_t* bd_addr,
7969 int* sock_fd);
@@ -100,7 +90,8 @@ bt_status_t btsock_sco_init(thread_t* thread_) {
10090 if (!sco_sockets) return BT_STATUS_FAIL;
10191
10292 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(&params);
10495
10596 return BT_STATUS_SUCCESS;
10697 }
@@ -145,7 +136,7 @@ static sco_socket_t* sco_socket_establish_locked(bool is_listening,
145136 sco_socket_t* sco_socket = NULL;
146137 socket_t* socket = NULL;
147138 tBTM_STATUS status;
148-
139+ enh_esco_params_t params;
149140 if (socketpair(AF_LOCAL, SOCK_STREAM, 0, pair) == -1) {
150141 LOG_ERROR(LOG_TAG, "%s unable to allocate socket pair: %s", __func__,
151142 strerror(errno));
@@ -158,9 +149,10 @@ static sco_socket_t* sco_socket_establish_locked(bool is_listening,
158149 goto error;
159150 }
160151
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);
164156 if (status != BTM_CMD_STARTED) {
165157 LOG_ERROR(LOG_TAG, "%s unable to create SCO socket: %d", __func__, status);
166158 goto error;
--- a/btif/src/btif_util.cc
+++ b/btif/src/btif_util.cc
@@ -270,9 +270,7 @@ const char* dump_hf_event(uint16_t event) {
270270 CASE_RETURN_STR(BTA_AG_MIC_EVT)
271271 CASE_RETURN_STR(BTA_AG_AT_CKPD_EVT)
272272 CASE_RETURN_STR(BTA_AG_DISABLE_EVT)
273-#if (BTM_WBS_INCLUDED == TRUE)
274273 CASE_RETURN_STR(BTA_AG_WBS_EVT)
275-#endif
276274 CASE_RETURN_STR(BTA_AG_AT_A_EVT)
277275 CASE_RETURN_STR(BTA_AG_AT_D_EVT)
278276 CASE_RETURN_STR(BTA_AG_AT_CHLD_EVT)
--- a/device/Android.bp
+++ b/device/Android.bp
@@ -15,6 +15,7 @@ cc_library_static {
1515 ],
1616 srcs: [
1717 "src/controller.cc",
18+ "src/esco_parameters.cc",
1819 "src/interop.cc",
1920 ],
2021 shared_libs: [
--- a/device/BUILD.gn
+++ b/device/BUILD.gn
@@ -17,6 +17,7 @@
1717 static_library("device") {
1818 sources = [
1919 "src/controller.cc",
20+ "src/esco_parameters.cc",
2021 "src/interop.cc",
2122 ]
2223
--- a/device/include/controller.h
+++ b/device/include/controller.h
@@ -49,6 +49,8 @@ typedef struct controller_t {
4949 bool (*supports_rssi_with_inquiry_results)(void);
5050 bool (*supports_extended_inquiry_response)(void);
5151 bool (*supports_master_slave_role_switch)(void);
52+ bool (*supports_enhanced_setup_synchronous_connection)(void);
53+ bool (*supports_enhanced_accept_synchronous_connection)(void);
5254
5355 bool (*supports_ble)(void);
5456 bool (*supports_ble_packet_extension)(void);
--- /dev/null
+++ b/device/include/esco_parameters.h
@@ -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);
--- a/device/src/controller.cc
+++ b/device/src/controller.cc
@@ -357,6 +357,16 @@ static bool supports_master_slave_role_switch(void) {
357357 return HCI_SWITCH_SUPPORTED(features_classic[0].as_array);
358358 }
359359
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+
360370 static bool supports_ble(void) {
361371 CHECK(readable);
362372 return ble_supported;
@@ -504,6 +514,8 @@ static const controller_t interface = {
504514 supports_rssi_with_inquiry_results,
505515 supports_extended_inquiry_response,
506516 supports_master_slave_role_switch,
517+ supports_enhanced_setup_synchronous_connection,
518+ supports_enhanced_accept_synchronous_connection,
507519
508520 supports_ble,
509521 supports_ble_packet_extension,
--- /dev/null
+++ b/device/src/esco_parameters.cc
@@ -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+}
--- a/hci/Android.bp
+++ b/hci/Android.bp
@@ -19,7 +19,6 @@ cc_library_static {
1919 "src/btsnoop_mem.cc",
2020 "src/btsnoop_net.cc",
2121 "src/buffer_allocator.cc",
22- "src/hci_audio.cc",
2322 "src/hci_inject.cc",
2423 "src/hci_layer.cc",
2524 "src/hci_layer_android.cc",
--- a/hci/BUILD.gn
+++ b/hci/BUILD.gn
@@ -20,7 +20,6 @@ static_library("hci") {
2020 "src/btsnoop_mem.cc",
2121 "src/btsnoop_net.cc",
2222 "src/buffer_allocator.cc",
23- "src/hci_audio.cc",
2423 "src/hci_inject.cc",
2524 "src/hci_layer.cc",
2625 "src/hci_layer_linux.cc",
--- a/hci/include/bt_vendor_lib.h
+++ b/hci/include/bt_vendor_lib.h
@@ -19,6 +19,7 @@
1919 #ifndef BT_VENDOR_LIB_H
2020 #define BT_VENDOR_LIB_H
2121
22+#include <stdbool.h>
2223 #include <stdint.h>
2324 #include <sys/cdefs.h>
2425 #include <sys/types.h>
@@ -240,6 +241,7 @@ typedef struct {
240241 uint16_t handle;
241242 uint16_t peer_codec;
242243 uint16_t state;
244+ bool use_enhanced_sco;
243245 } bt_vendor_op_audio_state_t;
244246
245247 /*
--- a/hci/include/hci_audio.h
+++ /dev/null
@@ -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);
--- a/hci/src/hci_audio.cc
+++ /dev/null
@@ -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-}
--- a/include/bt_target.h
+++ b/include/bt_target.h
@@ -104,10 +104,10 @@
104104 #endif
105105
106106 #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)
111111 #endif
112112
113113 #ifndef BTA_AV_RET_TOUT
@@ -301,14 +301,6 @@
301301 #define BTM_SCO_HCI_INCLUDED FALSE /* TRUE includes SCO over HCI code */
302302 #endif
303303
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-
312304 /* This is used to work around a controller bug that doesn't like Disconnect
313305 * issued while there is a role switch in progress
314306 */
--- a/stack/btm/btm_devctl.cc
+++ b/stack/btm/btm_devctl.cc
@@ -96,9 +96,9 @@ void btm_dev_init(void) {
9696 BTM_ACL_PKT_TYPES_MASK_DH5 + BTM_ACL_PKT_TYPES_MASK_DM5;
9797
9898 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;
102102 }
103103
104104 /*******************************************************************************
@@ -296,49 +296,43 @@ static void btm_decode_ext_features_page(uint8_t page_number,
296296 btm_cb.sco_cb.esco_supported = false;
297297 #endif
298298 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;
300300
301301 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;
303303
304304 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;
306306 }
307307
308308 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;
310310
311311 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;
313313
314314 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;
317316 if (btm_cb.btm_sco_pkt_types_supported & BTM_ESCO_LINK_ONLY_MASK) {
318317 btm_cb.sco_cb.esco_supported = true;
319318
320319 /* Add in EDR related eSCO types */
321320 if (HCI_EDR_ESCO_2MPS_SUPPORTED(p_features)) {
322321 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;
325323 } else {
326324 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);
329326 }
330327
331328 if (HCI_EDR_ESCO_3MPS_SUPPORTED(p_features)) {
332329 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;
335331 } else {
336332 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);
339334 }
340335 }
341-#endif
342336
343337 BTM_TRACE_DEBUG("Local supported SCO packet types: 0x%04x",
344338 btm_cb.btm_sco_pkt_types_supported);
--- a/stack/btm/btm_int.h
+++ b/stack/btm/btm_int.h
@@ -35,6 +35,8 @@
3535 #include "rfcdefs.h"
3636
3737 #include "btm_api.h"
38+#include "device/include/esco_parameters.h"
39+
3840 #include "btm_ble_int.h"
3941 #include "btm_int_types.h"
4042 #include "smp_api.h"
@@ -158,7 +160,7 @@ extern bool btm_is_sco_active(uint16_t handle);
158160 extern void btm_remove_sco_links(BD_ADDR bda);
159161 extern bool btm_is_sco_active_by_bdaddr(BD_ADDR remote_bda);
160162
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);
162164 extern uint16_t btm_find_scb_by_handle(uint16_t handle);
163165 extern void btm_sco_flush_sco_data(uint16_t sco_inx);
164166
--- a/stack/btm/btm_int_types.h
+++ b/stack/btm/btm_int_types.h
@@ -305,9 +305,8 @@ typedef void(tBTM_SCO_IND_CBACK)(uint16_t sco_inx);
305305 (HCI_PKT_TYPES_MASK_HV1 | HCI_PKT_TYPES_MASK_HV2 | HCI_PKT_TYPES_MASK_HV3)
306306
307307 /* 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)
311310
312311 #define BTM_SCO_2_ESCO(scotype) \
313312 ((uint16_t)(((scotype)&BTM_SCO_PKT_TYPE_MASK) >> 5))
@@ -316,21 +315,21 @@ typedef void(tBTM_SCO_IND_CBACK)(uint16_t sco_inx);
316315
317316 /* Define masks for supported and exception 2.0 SCO packet types
318317 */
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)
323322
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)
327326
328327 #define BTM_SCO_ROUTE_UNKNOWN 0xff
329328
330329 /* Define the structure that contains (e)SCO data */
331330 typedef struct {
332331 tBTM_ESCO_CBACK* p_esco_cback; /* Callback for eSCO events */
333- tBTM_ESCO_PARAMS setup;
332+ enh_esco_params_t setup;
334333 tBTM_ESCO_DATA data; /* Connection complete information */
335334 uint8_t hci_status;
336335 } tBTM_ESCO_INFO;
@@ -356,26 +355,17 @@ typedef struct {
356355 tBTM_SCO_IND_CBACK* app_sco_ind_cb;
357356 #if (BTM_SCO_HCI_INCLUDED == TRUE)
358357 tBTM_SCO_DATA_CB* p_data_cb; /* Callback for SCO data over HCI */
359- uint32_t xmit_window_size; /* Total SCO window in bytes */
360358 #endif
361359 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;
364361 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 */
374364 } tSCO_CB;
375365
376366 #if (BTM_SCO_INCLUDED == TRUE)
377367 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,
379369 tBTM_SCO_CB* p_conn_cb, tBTM_SCO_CB* p_disc_cb);
380370 extern void btm_reject_sco_link(uint16_t sco_inx);
381371 extern void btm_sco_chk_pend_rolechange(uint16_t hci_handle);
--- a/stack/btm/btm_sco.cc
+++ b/stack/btm/btm_sco.cc
@@ -32,6 +32,7 @@
3232 #include "btm_int.h"
3333 #include "btu.h"
3434 #include "device/include/controller.h"
35+#include "device/include/esco_parameters.h"
3536 #include "hcidefs.h"
3637 #include "hcimsgs.h"
3738 #include "osi/include/osi.h"
@@ -56,17 +57,7 @@
5657 /* L O C A L F U N C T I O N P R O T O T Y P E S */
5758 /******************************************************************************/
5859
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);
7061
7162 /*******************************************************************************
7263 *
@@ -107,13 +98,11 @@ void btm_sco_init(void) {
10798 for (int i = 0; i < BTM_MAX_SCO_LINKS; i++)
10899 btm_cb.sco_cb.sco_db[i].xmit_data_q = fixed_queue_new(SIZE_MAX);
109100 #endif
110-
111101 /* Initialize nonzero defaults */
112102 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;
117106 }
118107
119108 /*******************************************************************************
@@ -133,11 +122,9 @@ void btm_sco_init(void) {
133122 *
134123 ******************************************************************************/
135124 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) {
137126 #if (BTM_MAX_SCO_LINKS > 0)
138127 tSCO_CONN* p_sco = NULL;
139- tBTM_ESCO_PARAMS* p_setup;
140- uint16_t temp_pkt_types;
141128
142129 if (sco_inx < BTM_MAX_SCO_LINKS) p_sco = &btm_cb.sco_cb.sco_db[sco_inx];
143130
@@ -147,52 +134,72 @@ static void btm_esco_conn_rsp(uint16_t sco_inx, uint8_t hci_status, BD_ADDR bda,
147134 p_sco->state = (p_sco->state == SCO_ST_W4_CONN_RSP) ? SCO_ST_LISTENING
148135 : SCO_ST_UNUSED;
149136 }
150-
151137 if (!btm_cb.sco_cb.esco_supported) {
152138 btsnd_hcic_reject_conn(bda, hci_status);
153139 } else {
154140 btsnd_hcic_reject_esco_conn(bda, hci_status);
155141 }
156- } else /* Connection is being accepted */
157- {
142+ } else {
143+ /* Connection is being accepted */
158144 p_sco->state = SCO_ST_CONNECTING;
159- p_setup = &p_sco->esco.setup;
145+ enh_esco_params_t* p_setup = &p_sco->esco.setup;
160146 /* If parameters not specified use the default */
161- if (p_parms)
147+ if (p_parms) {
162148 *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) */
165151 *p_setup = btm_cb.sco_cb.def_esco_parms;
166152 }
167153
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);
170157
171158 /* Make sure at least one eSCO packet type is sent, else might confuse peer
172159 */
173160 /* Taking this out to confirm with BQB tests
174161 ** Real application would like to include this though, as many devices
175162 ** 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))
177164 {
178- temp_pkt_types |= BTM_SCO_PKT_TYPES_MASK_EV3;
165+ temp_packet_types |= BTM_SCO_PKT_TYPES_MASK_EV3;
179166 }
180167 */
181168 /* If SCO request, remove eSCO packet types (conformance) */
182169 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;
185172 } else {
186173 /* OR in any exception packet types */
187- temp_pkt_types |=
174+ temp_packet_types |=
188175 ((p_setup->packet_types & BTM_SCO_EXCEPTION_PKTS_MASK) |
189176 (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_EXCEPTION_PKTS_MASK));
190177 }
191178
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+ }
196203 }
197204 #endif
198205 }
@@ -328,12 +335,12 @@ tBTM_STATUS BTM_WriteScoData(uint16_t sco_inx, BT_HDR* p_buf) {
328335 } else {
329336 osi_free(p_buf);
330337
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);
333340 status = BTM_UNKNOWN_ADDR;
334341 }
335342
336- return (status);
343+ return status;
337344 }
338345 #else
339346 tBTM_STATUS BTM_WriteScoData(UNUSED_ATTR uint16_t sco_inx,
@@ -354,50 +361,49 @@ tBTM_STATUS BTM_WriteScoData(UNUSED_ATTR uint16_t sco_inx,
354361 *
355362 ******************************************************************************/
356363 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) {
360365 tACL_CONN* p_acl;
361366
362367 /* Send connect request depending on version of spec */
363368 if (!btm_cb.sco_cb.esco_supported) {
364369 btsnd_hcic_add_SCO_conn(acl_handle, BTM_ESCO_2_SCO(p_setup->packet_types));
365370 } 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);
368374
369375 /* OR in any exception packet types */
370- temp_pkt_types |=
376+ temp_packet_types |=
371377 ((p_setup->packet_types & BTM_SCO_EXCEPTION_PKTS_MASK) |
372378 (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_EXCEPTION_PKTS_MASK));
373379
374380 /* Finally, remove EDR eSCO if the remote device doesn't support it */
375381 /* UPF25: Only SCO was brought up in this case */
376382 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];
380386 if (!HCI_EDR_ESCO_2MPS_SUPPORTED(p_acl->peer_lmp_feature_pages[0])) {
381387 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);
384390 }
385391 if (!HCI_EDR_ESCO_3MPS_SUPPORTED(p_acl->peer_lmp_feature_pages[0])) {
386392 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);
389395 }
390396
391397 /* Check to see if BR/EDR Secure Connections is being used
392398 ** If so, we cannot use SCO-only packet types (HFP 1.7)
393399 */
394400 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);
396402 BTM_TRACE_DEBUG("%s: SCO Conn: pkt_types after removing SCO (0x%04x)",
397- __func__, temp_pkt_types);
403+ __func__, temp_packet_types);
398404
399405 /* Return error if no packet types left */
400- if (temp_pkt_types == 0) {
406+ if (temp_packet_types == 0) {
401407 BTM_TRACE_ERROR("%s: SCO Conn (BR/EDR SC): No packet types available",
402408 __func__);
403409 return (BTM_WRONG_MODE);
@@ -409,16 +415,41 @@ static tBTM_STATUS btm_send_connect_request(uint16_t acl_handle,
409415 }
410416 }
411417
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+ }
422453 }
423454
424455 return (BTM_CMD_STARTED);
@@ -449,7 +480,7 @@ void btm_set_sco_ind_cback(tBTM_SCO_IND_CBACK* sco_ind_cb) {
449480 * Returns void
450481 *
451482 ******************************************************************************/
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,
453484 tBTM_SCO_CB* p_conn_cb, tBTM_SCO_CB* p_disc_cb) {
454485 #if (BTM_MAX_SCO_LINKS > 0)
455486 tSCO_CONN* p_sco;
@@ -513,11 +544,10 @@ tBTM_STATUS BTM_CreateSco(BD_ADDR remote_bda, bool is_orig, uint16_t pkt_types,
513544 uint16_t* p_sco_inx, tBTM_SCO_CB* p_conn_cb,
514545 tBTM_SCO_CB* p_disc_cb) {
515546 #if (BTM_MAX_SCO_LINKS > 0)
516- tBTM_ESCO_PARAMS* p_setup;
547+ enh_esco_params_t* p_setup;
517548 tSCO_CONN* p = &btm_cb.sco_cb.sco_db[0];
518549 uint16_t xx;
519550 uint16_t acl_handle = 0;
520- uint16_t temp_pkt_types;
521551 tACL_CONN* p_acl;
522552
523553 #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,
530560 *p_sco_inx = BTM_INVALID_SCO_INDEX;
531561
532562 /* If originating, ensure that there is an ACL connection to the BD Address */
563+
533564 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+ }
537578 }
538579
539580 if (remote_bda) {
@@ -542,19 +583,17 @@ tBTM_STATUS BTM_CreateSco(BD_ADDR remote_bda, bool is_orig, uint16_t pkt_types,
542583 if (((p->state == SCO_ST_CONNECTING) || (p->state == SCO_ST_LISTENING) ||
543584 (p->state == SCO_ST_PEND_UNPARK)) &&
544585 (!memcmp(p->esco.data.bd_addr, remote_bda, BD_ADDR_LEN))) {
545- return (BTM_BUSY);
586+ return BTM_BUSY;
546587 }
547588 }
548589 } else {
549590 /* Support only 1 wildcard BD address at a time */
550591 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;
553593 }
554594 }
555595
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 */
558597 for (xx = 0, p = &btm_cb.sco_cb.sco_db[0]; xx < BTM_MAX_SCO_LINKS;
559598 xx++, p++) {
560599 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,
585624 } else
586625 p->rem_bd_known = false;
587626
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-
592627 p_setup = &p->esco.setup;
593628 *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);
601629
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;
602633 /* OR in any exception packet types */
603634 if (controller_get_interface()->get_bt_version()->hci_version >=
604635 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);
612639 }
613640
614- p_setup->packet_types = temp_pkt_types;
615641 p->p_conn_cb = p_conn_cb;
616642 p->p_disc_cb = p_disc_cb;
617643 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,
633659 if (p->state != SCO_ST_PEND_UNPARK &&
634660 p->state != SCO_ST_PEND_ROLECHANGE) {
635661 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);
640664
641665 if ((btm_send_connect_request(acl_handle, p_setup)) !=
642666 BTM_CMD_STARTED)
@@ -649,13 +673,13 @@ tBTM_STATUS BTM_CreateSco(BD_ADDR remote_bda, bool is_orig, uint16_t pkt_types,
649673
650674 *p_sco_inx = xx;
651675
652- return (BTM_CMD_STARTED);
676+ return BTM_CMD_STARTED;
653677 }
654678 }
655679
656680 #endif
657681 /* If here, all SCO blocks in use */
658- return (BTM_NO_RESOURCES);
682+ return BTM_NO_RESOURCES;
659683 }
660684
661685 #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) {
683707
684708 {
685709 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);
689713
690714 if ((btm_send_connect_request(acl_handle, &p->esco.setup)) ==
691715 BTM_CMD_STARTED)
@@ -919,8 +943,8 @@ void btm_sco_connected(uint8_t hci_status, BD_ADDR bda, uint16_t hci_handle,
919943 if (spt) {
920944 parms.packet_types = p->esco.setup.packet_types;
921945 /* 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;
924948
925949 BTM_ChangeEScoLinkParms(xx, &parms);
926950 }
@@ -1140,8 +1164,8 @@ tBTM_STATUS BTM_SetScoPacketTypes(uint16_t sco_inx, uint16_t pkt_types) {
11401164 parms.packet_types = pkt_types;
11411165
11421166 /* 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;
11451169
11461170 return (BTM_ChangeEScoLinkParms(sco_inx, &parms));
11471171 #else
@@ -1291,43 +1315,27 @@ uint8_t* BTM_ReadScoBdAddr(uint16_t sco_inx) {
12911315 * BTM_BUSY if there are one or more active (e)SCO links.
12921316 *
12931317 ******************************************************************************/
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;
12971320
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;
13171323 } 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);
13191326 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__);
13221330 }
13231331
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);
13291337
1330- return (BTM_SUCCESS);
1338+ return BTM_SUCCESS;
13311339 }
13321340
13331341 /*******************************************************************************
@@ -1385,7 +1393,7 @@ tBTM_STATUS BTM_ReadEScoLinkParms(uint16_t sco_inx, tBTM_ESCO_DATA* p_parms) {
13851393 #if (BTM_MAX_SCO_LINKS > 0)
13861394 uint8_t index;
13871395
1388- BTM_TRACE_API("BTM_ReadEScoLinkParms -> sco_inx 0x%04x", sco_inx);
1396+ BTM_TRACE_API("%s: -> sco_inx 0x%04x", __func__, sco_inx);
13891397
13901398 if (sco_inx < BTM_MAX_SCO_LINKS &&
13911399 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) {
13961404 if (sco_inx == BTM_FIRST_ACTIVE_SCO_INDEX) {
13971405 for (index = 0; index < BTM_MAX_SCO_LINKS; index++) {
13981406 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);
14011408 *p_parms = btm_cb.sco_cb.sco_db[index].esco.data;
14021409 return (BTM_SUCCESS);
14031410 }
@@ -1434,17 +1441,17 @@ tBTM_STATUS BTM_ReadEScoLinkParms(uint16_t sco_inx, tBTM_ESCO_DATA* p_parms) {
14341441 tBTM_STATUS BTM_ChangeEScoLinkParms(uint16_t sco_inx,
14351442 tBTM_CHG_ESCO_PARAMS* p_parms) {
14361443 #if (BTM_MAX_SCO_LINKS > 0)
1437- tBTM_ESCO_PARAMS* p_setup;
1438- tSCO_CONN* p_sco;
1439- uint16_t temp_pkt_types;
14401444
14411445 /* Make sure sco handle is valid and on an active link */
14421446 if (sco_inx >= BTM_MAX_SCO_LINKS ||
14431447 btm_cb.sco_cb.sco_db[sco_inx].state != SCO_ST_CONNECTED)
14441448 return (BTM_WRONG_MODE);
14451449
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;
14481455
14491456 /* If SCO connection OR eSCO not supported just send change packet types */
14501457 if (p_sco->esco.data.link_type == BTM_LINK_TYPE_SCO ||
@@ -1453,34 +1460,60 @@ tBTM_STATUS BTM_ChangeEScoLinkParms(uint16_t sco_inx,
14531460 p_parms->packet_types &
14541461 (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_LINK_ONLY_MASK);
14551462
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);
14591468
14601469 btsnd_hcic_change_conn_type(p_sco->hci_handle,
14611470 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);
14651476
14661477 /* OR in any exception packet types */
1467- temp_pkt_types |=
1478+ temp_packet_types |=
14681479 ((p_parms->packet_types & BTM_SCO_EXCEPTION_PKTS_MASK) |
14691480 (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_EXCEPTION_PKTS_MASK));
1481+ p_setup->packet_types = temp_packet_types;
14701482
1471- BTM_TRACE_API("BTM_ChangeEScoLinkParms -> eSCO Link for handle 0x%04x",
1483+ BTM_TRACE_API("%s -> eSCO Link for handle 0x%04x", __func__,
14721484 p_sco->hci_handle);
14731485 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);
14841517 }
14851518
14861519 return (BTM_CMD_STARTED);
@@ -1508,7 +1541,7 @@ tBTM_STATUS BTM_ChangeEScoLinkParms(uint16_t sco_inx,
15081541 *
15091542 ******************************************************************************/
15101543 void BTM_EScoConnRsp(uint16_t sco_inx, uint8_t hci_status,
1511- tBTM_ESCO_PARAMS* p_parms) {
1544+ enh_esco_params_t* p_parms) {
15121545 #if (BTM_MAX_SCO_LINKS > 0)
15131546 if (sco_inx < BTM_MAX_SCO_LINKS &&
15141547 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,
15281561 * Returns tBTM_SCO_TYPE
15291562 *
15301563 ******************************************************************************/
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) {
15321565 #if (BTM_MAX_SCO_LINKS > 0)
15331566 *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;
15371567 #endif
15381568 }
15391569
@@ -1656,6 +1686,114 @@ bool btm_is_sco_active_by_bdaddr(BD_ADDR remote_bda) {
16561686 #endif
16571687 return (false);
16581688 }
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+
16591797 #else /* SCO_EXCLUDED == TRUE (Link in stubs) */
16601798
16611799 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) {
16741812 }
16751813 uint8_t* BTM_ReadScoBdAddr(uint16_t sco_inx) { return ((uint8_t*)NULL); }
16761814 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) {
16781816 return (BTM_MODE_UNSUPPORTED);
16791817 }
16801818 tBTM_STATUS BTM_RegForEScoEvts(uint16_t sco_inx,
@@ -1689,7 +1827,7 @@ tBTM_STATUS BTM_ChangeEScoLinkParms(uint16_t sco_inx,
16891827 return (BTM_MODE_UNSUPPORTED);
16901828 }
16911829 void BTM_EScoConnRsp(uint16_t sco_inx, uint8_t hci_status,
1692- tBTM_ESCO_PARAMS* p_parms) {}
1830+ enh_esco_params_t* p_parms) {}
16931831 uint8_t BTM_GetNumScoLinks(void) { return (0); }
16941832
16951833 #endif /* If SCO is being used */
--- a/stack/btu/btu_hcif.cc
+++ b/stack/btu/btu_hcif.cc
@@ -1145,13 +1145,14 @@ static void btu_hcif_hdl_command_status(uint16_t opcode, uint8_t status,
11451145
11461146 #if (BTM_SCO_INCLUDED == TRUE)
11471147 case HCI_SETUP_ESCO_CONNECTION:
1148+ case HCI_ENH_SETUP_ESCO_CONNECTION:
11481149 /* read handle out of stored command */
11491150 if (p_cmd != NULL) {
11501151 p_cmd++;
11511152 STREAM_TO_UINT16(handle, p_cmd);
11521153
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 */
11551156 if (btm_is_sco_active(handle))
11561157 btm_esco_proc_conn_chg(status, handle, 0, 0, 0, 0);
11571158 else
--- a/stack/hcic/hcicmds.cc
+++ b/stack/hcic/hcicmds.cc
@@ -431,7 +431,8 @@ void btsnd_hcic_read_lmp_handle(uint16_t handle) {
431431 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
432432 }
433433
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,
435436 uint16_t max_latency, uint16_t voice,
436437 uint8_t retrans_effort, uint16_t packet_types) {
437438 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,
444445 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_SETUP_ESCO);
445446
446447 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);
449450 UINT16_TO_STREAM(pp, max_latency);
450451 UINT16_TO_STREAM(pp, voice);
451452 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,
454455 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
455456 }
456457
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,
460462 uint16_t packet_types) {
461463 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
462464 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,
468470 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_ACCEPT_ESCO);
469471
470472 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);
473475 UINT16_TO_STREAM(pp, max_latency);
474476 UINT16_TO_STREAM(pp, content_fmt);
475477 UINT8_TO_STREAM(pp, retrans_effort);
@@ -1009,6 +1011,104 @@ void btsnd_hcic_io_cap_req_reply(BD_ADDR bd_addr, uint8_t capability,
10091011 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
10101012 }
10111013
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+
10121112 void btsnd_hcic_io_cap_req_neg_reply(BD_ADDR bd_addr, uint8_t err_code) {
10131113 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
10141114 uint8_t* pp = (uint8_t*)(p + 1);
--- a/stack/include/btm_api.h
+++ b/stack/include/btm_api.h
@@ -26,6 +26,7 @@
2626 #define BTM_API_H
2727
2828 #include "bt_target.h"
29+#include "device/include/esco_parameters.h"
2930 #include "hcidefs.h"
3031 #include "sdp_api.h"
3132
@@ -1110,8 +1111,7 @@ extern uint16_t BTM_ReadScoDiscReason(void);
11101111 * BTM_BUSY if there are one or more active (e)SCO links.
11111112 *
11121113 ******************************************************************************/
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);
11151115
11161116 /*******************************************************************************
11171117 *
@@ -1207,7 +1207,7 @@ extern tBTM_STATUS BTM_ChangeEScoLinkParms(uint16_t sco_inx,
12071207 *
12081208 ******************************************************************************/
12091209 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);
12111211
12121212 /*******************************************************************************
12131213 *
@@ -2010,7 +2010,7 @@ extern uint8_t BTM_GetEirUuidList(uint8_t* p_eir, size_t eir_len,
20102010 *
20112011 *
20122012 ******************************************************************************/
2013-extern tBTM_STATUS BTM_ConfigScoPath(tBTM_SCO_ROUTE_TYPE path,
2013+extern tBTM_STATUS BTM_ConfigScoPath(esco_data_path_t path,
20142014 tBTM_SCO_DATA_CB* p_sco_data_cb,
20152015 tBTM_SCO_PCM_PARAM* p_pcm_param,
20162016 bool err_data_rpt);
--- a/stack/include/btm_api_types.h
+++ b/stack/include/btm_api_types.h
@@ -20,6 +20,7 @@
2020 #define BTM_API_TYPES_H
2121
2222 #include "bt_target.h"
23+#include "device/include/esco_parameters.h"
2324 #include "hcidefs.h"
2425 #include "smp_api_types.h"
2526
@@ -910,34 +911,17 @@ typedef void(tBTM_ACL_DB_CHANGE_CB)(BD_ADDR p_bda, DEV_CLASS p_dc,
910911 /* Define first active SCO index */
911912 #define BTM_FIRST_ACTIVE_SCO_INDEX BTM_MAX_SCO_LINKS
912913
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)
932919
933920 #define BTM_SCO_LINK_ALL_PKT_MASK \
934921 (BTM_SCO_LINK_ONLY_MASK | BTM_ESCO_LINK_ONLY_MASK)
935922
936923 #define BTM_VALID_SCO_ALL_PKT_TYPE HCI_VALID_SCO_ALL_PKT_TYPE
937924
938-/* Passed in BTM_CreateSco if the packet type parameter should be ignored */
939-#define BTM_IGNORE_SCO_PKT_TYPE 0
940-
941925 /***************
942926 * SCO Types
943927 ***************/
@@ -946,32 +930,15 @@ typedef void(tBTM_ACL_DB_CHANGE_CB)(BD_ADDR p_bda, DEV_CLASS p_dc,
946930 typedef uint8_t tBTM_SCO_TYPE;
947931
948932 /*******************
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-/*******************
956933 * SCO Codec Types
957934 *******************/
958935 // TODO(google) This should use common definitions
959-// in hci/include/hci_audio.h
960936 #define BTM_SCO_CODEC_NONE 0x0000
961937 #define BTM_SCO_CODEC_CVSD 0x0001
962938 #define BTM_SCO_CODEC_MSBC 0x0002
963939 typedef uint16_t tBTM_SCO_CODEC_TYPE;
964940
965941 /*******************
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-/*******************
975942 * SCO Voice Settings
976943 *******************/
977944 #define BTM_VOICE_SETTING_CVSD \
@@ -1000,20 +967,6 @@ typedef void(tBTM_SCO_CB)(uint16_t sco_inx);
1000967 typedef void(tBTM_SCO_DATA_CB)(uint16_t sco_inx, BT_HDR* p_data,
1001968 tBTM_SCO_DATA_FLAG status);
1002969
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-
1017970 /***************
1018971 * eSCO Types
1019972 ***************/
@@ -1022,20 +975,13 @@ typedef void(tBTM_SCO_DATA_CB)(uint16_t sco_inx, BT_HDR* p_data,
1022975 #define BTM_ESCO_CONN_REQ_EVT 2
1023976 typedef uint8_t tBTM_ESCO_EVT;
1024977
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+ */
1035981 typedef struct {
1036- uint16_t max_latency;
982+ uint16_t max_latency_ms;
1037983 uint16_t packet_types;
1038- uint8_t retrans_effort;
984+ uint8_t retransmission_effort;
1039985 } tBTM_CHG_ESCO_PARAMS;
1040986
1041987 /* Returned by BTM_ReadEScoLinkParms() */
--- a/stack/include/hcidefs.h
+++ b/stack/include/hcidefs.h
@@ -1077,37 +1077,24 @@
10771077 HCI_PKT_TYPES_MASK_DM3 | HCI_PKT_TYPES_MASK_DH3 | \
10781078 HCI_PKT_TYPES_MASK_DM5 | HCI_PKT_TYPES_MASK_DH5)) != 0))
10791079
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-
10941080 /* Packet type should be one of valid but at least one should be specified for
10951081 * 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)) && \
11061093 ((t) != 0))
11071094
11081095 #define HCI_VALID_SCO_ALL_PKT_TYPE(t) \
11091096 (((((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 | \
11111098 HCI_ESCO_PKT_TYPES_MASK_HV3 | HCI_ESCO_PKT_TYPES_MASK_EV3 | \
11121099 HCI_ESCO_PKT_TYPES_MASK_EV4 | HCI_ESCO_PKT_TYPES_MASK_EV5)) == 0)) && \
11131100 ((t) != 0))
@@ -3006,13 +2993,13 @@ typedef struct {
30062993 /* Supported Commands (Byte 29) */
30072994 #define HCI_SUPP_COMMANDS_ENH_SETUP_SYNCH_CONN_MASK 0x08
30082995 #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) \
30102997 ((x)[HCI_SUPP_COMMANDS_ENH_SETUP_SYNCH_CONN_OFF] & \
30112998 HCI_SUPP_COMMANDS_ENH_SETUP_SYNCH_CONN_MASK)
30122999
30133000 #define HCI_SUPP_COMMANDS_ENH_ACCEPT_SYNCH_CONN_MASK 0x10
30143001 #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) \
30163003 ((x)[HCI_SUPP_COMMANDS_ENH_ACCEPT_SYNCH_CONN_OFF] & \
30173004 HCI_SUPP_COMMANDS_ENH_ACCEPT_SYNCH_CONN_MASK)
30183005
--- a/stack/include/hcimsgs.h
+++ b/stack/include/hcimsgs.h
@@ -21,6 +21,7 @@
2121
2222 #include "bt_target.h"
2323 #include "bt_types.h"
24+#include "device/include/esco_parameters.h"
2425 #include "hcidefs.h"
2526
2627 #include <base/callback_forward.h>
@@ -222,10 +223,11 @@ extern void btsnd_hcic_rmt_ver_req(
222223 extern void btsnd_hcic_read_rmt_clk_offset(
223224 uint16_t handle); /* Remote Clock Offset */
224225 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,
229231 uint16_t packet_types);
230232 #define HCIC_PARAM_SIZE_SETUP_ESCO 17
231233
@@ -237,11 +239,10 @@ extern void btsnd_hcic_setup_esco_conn(uint16_t handle, uint32_t tx_bw,
237239 #define HCI_SETUP_ESCO_RETRAN_EFF_OFF 14
238240 #define HCI_SETUP_ESCO_PKT_TYPES_OFF 15
239241
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);
245246 #define HCIC_PARAM_SIZE_ACCEPT_ESCO 21
246247
247248 #define HCI_ACCEPT_ESCO_BDADDR_OFF 0
@@ -517,6 +518,9 @@ extern void btsnd_hcic_write_scan_enable(uint8_t flag); /* Write Scan Enable */
517518 extern void btsnd_hcic_write_pagescan_cfg(
518519 uint16_t interval, uint16_t window); /* Write Page Scan Activity */
519520
521+#define HCIC_PARAM_SIZE_ENH_SET_ESCO_CONN 59
522+#define HCIC_PARAM_SIZE_ENH_ACC_ESCO_CONN 63
523+
520524 #define HCIC_PARAM_SIZE_WRITE_PAGESCAN_CFG 4
521525
522526 #define HCI_SCAN_CFG_INTERVAL_OFF 0
@@ -607,6 +611,14 @@ extern void btsnd_hcic_write_inqscan_type(
607611 extern void btsnd_hcic_write_inquiry_mode(
608612 uint8_t type); /* Write Inquiry Mode */
609613
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+
610622 #define HCI_DATA_HANDLE_MASK 0x0FFF
611623
612624 #define HCID_GET_HANDLE_EVENT(p) \
--- a/stack/include/sdpdefs.h
+++ b/stack/include/sdpdefs.h
@@ -286,10 +286,8 @@
286286
287287 #define UUID_SERVCLASS_TEST_SERVER 0x9000 /* Test Group UUID */
288288
289-#if (BTM_WBS_INCLUDED == TRUE)
290289 #define UUID_CODEC_CVSD 0x0001 /* CVSD */
291290 #define UUID_CODEC_MSBC 0x0002 /* mSBC */
292-#endif
293291
294292 #define UUID_HF_IND_ENHANCED_DRIVER_SAFETY 0x0001 /* Enhanced Safety */
295293 #define UUID_HF_IND_BATTERY_LEVEL_STATUS 0x0002 /* Battery Status */