summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--device/include/interop.h11
-rw-r--r--device/include/interop_database.h3
-rw-r--r--stack/avdt/avdt_l2c.c19
3 files changed, 32 insertions, 1 deletions
diff --git a/device/include/interop.h b/device/include/interop.h
index 7765ce814..6632e5b7a 100644
--- a/device/include/interop.h
+++ b/device/include/interop.h
@@ -37,7 +37,16 @@ typedef enum {
// Devices requiring this workaround do not handle Bluetooth Absolute Volume
// control correctly, leading to undesirable (potentially harmful) volume levels
// or general lack of controlability.
- INTEROP_DISABLE_ABSOLUTE_VOLUME
+ INTEROP_DISABLE_ABSOLUTE_VOLUME,
+
+ // 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 2e5c7db22..99a986561 100644
--- a/device/include/interop_database.h
+++ b/device/include/interop_database.h
@@ -60,4 +60,7 @@ static const interop_entry_t interop_database[] = {
// VW Car Kit - not enough granularity with volume
{{0x00, 0x26, 0x7e, 0,0,0}, 3, INTEROP_DISABLE_ABSOLUTE_VOLUME},
+
+ // 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,