diff options
-rw-r--r-- | device/include/interop.h | 11 | ||||
-rw-r--r-- | device/include/interop_database.h | 5 | ||||
-rw-r--r-- | stack/avdt/avdt_l2c.c | 19 |
3 files changed, 33 insertions, 2 deletions
diff --git a/device/include/interop.h b/device/include/interop.h index e2ca682a3..b5cbdd6e5 100644 --- a/device/include/interop.h +++ b/device/include/interop.h @@ -32,7 +32,16 @@ typedef enum { // requiring multiple retries to complete pairing. To avoid degrading the user // experience for those devices, automatically re-try pairing if page // timeouts are received during pairing. - INTEROP_AUTO_RETRY_PAIRING + INTEROP_AUTO_RETRY_PAIRING, + + // Some headsets have audio jitter issues because of increased re-transmissions as the + // 3 Mbps packets have a lower link margin, and are more prone to interference. We can + // disable 3DH packets (use only 2DH packets) for the ACL link to improve sensitivity + // when streaming A2DP audio to the headset. Air sniffer logs show reduced + // re-transmissions after switching to 2DH packets. + // + // Disable 3Mbps packets and use only 2Mbps packets for ACL links when streaming audio. + INTEROP_2MBPS_LINK_ONLY } interop_feature_t; // Check if a given |addr| matches a known interoperability workaround as identified diff --git a/device/include/interop_database.h b/device/include/interop_database.h index 4f95be916..77ee40cb3 100644 --- a/device/include/interop_database.h +++ b/device/include/interop_database.h @@ -43,5 +43,8 @@ static const interop_entry_t interop_database[] = { {{0x80, 0xe4, 0xda, 0x70, 0,0}, 4, INTEROP_DISABLE_LE_SECURE_CONNECTIONS}, // BMW car kits (Harman/Becker) - {{0x9c, 0xdf, 0x03, 0,0,0}, 3, INTEROP_AUTO_RETRY_PAIRING} + {{0x9c, 0xdf, 0x03, 0,0,0}, 3, INTEROP_AUTO_RETRY_PAIRING}, + + // Jaybird Family + {{0x00, 0x18, 0x91, 0,0,0}, 3, INTEROP_2MBPS_LINK_ONLY} }; diff --git a/stack/avdt/avdt_l2c.c b/stack/avdt/avdt_l2c.c index dbdfc082d..4ea5d67da 100644 --- a/stack/avdt/avdt_l2c.c +++ b/stack/avdt/avdt_l2c.c @@ -33,6 +33,7 @@ #include "l2cdefs.h" #include "btm_api.h" #include "btm_int.h" +#include "device/include/interop.h" /* callback function declarations */ @@ -202,6 +203,15 @@ void avdt_l2c_connect_ind_cback(BD_ADDR bd_addr, UINT16 lcid, UINT16 psm, UINT8 p_tbl->state = AVDT_AD_ST_SEC_ACP; p_tbl->cfg_flags = AVDT_L2C_CFG_CONN_ACP; + if (interop_match(INTEROP_2MBPS_LINK_ONLY, (const bt_bdaddr_t *)&bd_addr)) { + // Disable 3DH packets for AVDT ACL to improve sensitivity on HS + tACL_CONN *p_acl_cb = btm_bda_to_acl(bd_addr, BT_TRANSPORT_BR_EDR); + btm_set_packet_types(p_acl_cb, (btm_cb.btm_acl_pkt_types_supported | + HCI_PKT_TYPES_MASK_NO_3_DH1 | + HCI_PKT_TYPES_MASK_NO_3_DH3 | + HCI_PKT_TYPES_MASK_NO_3_DH5)); + } + /* Check the security */ rc = btm_sec_mx_access_request (bd_addr, AVDT_PSM, FALSE, BTM_SEC_PROTO_AVDT, @@ -321,6 +331,15 @@ void avdt_l2c_connect_cfm_cback(UINT16 lcid, UINT16 result) p_tbl->lcid = lcid; p_tbl->cfg_flags = AVDT_L2C_CFG_CONN_INT; + if (interop_match(INTEROP_2MBPS_LINK_ONLY, (const bt_bdaddr_t *) &p_ccb->peer_addr)) { + // Disable 3DH packets for AVDT ACL to improve sensitivity on HS + tACL_CONN *p_acl_cb = btm_bda_to_acl(p_ccb->peer_addr, BT_TRANSPORT_BR_EDR); + btm_set_packet_types(p_acl_cb, (btm_cb.btm_acl_pkt_types_supported | + HCI_PKT_TYPES_MASK_NO_3_DH1 | + HCI_PKT_TYPES_MASK_NO_3_DH3 | + HCI_PKT_TYPES_MASK_NO_3_DH5)); + } + /* Check the security */ btm_sec_mx_access_request (p_ccb->peer_addr, AVDT_PSM, TRUE, BTM_SEC_PROTO_AVDT, |