Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 23e0bcd8 authored by Satish Kodishala's avatar Satish Kodishala Committed by Pavlin Radoslavov
Browse files

Use the correct AVDTP version-specific features

Failure:
A2DP is not reconnected after power cycling DUT BT.

Root cause:
AVDTP v1.3 feature request (AVDT_GetAllCapReq) sent by DUT
as remote supports the same, but this 1.3 feature is not
completely supported by DUT which leads to erroneous behavior.

Fix:
Use AVDT_GetAllCapReq request only when both host and remote
AVDTP version are 1.3 and above.

Test: 1.Pair to CarKit; 2.Connect to CarKit; 3.Do BT power cycle @ DUT
Bug: 35657623
Change-Id: I66c2d7d8fe8506b74282bcca93595e1cbf5c2565
parent 189ab311
Loading
Loading
Loading
Loading
+3 −2
Original line number Original line Diff line number Diff line
@@ -387,7 +387,8 @@ static bool bta_av_next_getcap(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {
      /* we got a stream; get its capabilities */
      /* we got a stream; get its capabilities */
      if (p_scb->p_cap == NULL)
      if (p_scb->p_cap == NULL)
        p_scb->p_cap = (tAVDT_CFG*)osi_malloc(sizeof(tAVDT_CFG));
        p_scb->p_cap = (tAVDT_CFG*)osi_malloc(sizeof(tAVDT_CFG));
      if (p_scb->avdt_version >= AVDT_VERSION_SYNC) {
      if ((p_scb->avdt_version >= AVDT_VERSION_1_3) &&
          (A2DP_GetAvdtpVersion() >= AVDT_VERSION_1_3)) {
        p_req = AVDT_GetAllCapReq;
        p_req = AVDT_GetAllCapReq;
      } else {
      } else {
        p_req = AVDT_GetCapReq;
        p_req = AVDT_GetCapReq;
@@ -1261,7 +1262,7 @@ void bta_av_setconfig_rsp(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {
    p_scb->num_seps = num;
    p_scb->num_seps = num;


    if (p_scb->cur_psc_mask & AVDT_PSC_DELAY_RPT)
    if (p_scb->cur_psc_mask & AVDT_PSC_DELAY_RPT)
      p_scb->avdt_version = AVDT_VERSION_SYNC;
      p_scb->avdt_version = AVDT_VERSION_1_3;


    if (A2DP_GetCodecType(p_scb->cfg.codec_info) == A2DP_MEDIA_CT_SBC ||
    if (A2DP_GetCodecType(p_scb->cfg.codec_info) == A2DP_MEDIA_CT_SBC ||
        num > 1) {
        num > 1) {
+2 −0
Original line number Original line Diff line number Diff line
@@ -377,3 +377,5 @@ void A2DP_Init(void) {
  a2dp_cb.trace_level = BT_TRACE_LEVEL_NONE;
  a2dp_cb.trace_level = BT_TRACE_LEVEL_NONE;
#endif
#endif
}
}

uint16_t A2DP_GetAvdtpVersion() { return a2dp_cb.avdt_sdp_ver; }
+11 −0
Original line number Original line Diff line number Diff line
@@ -161,6 +161,17 @@ extern tA2DP_STATUS A2DP_FindService(uint16_t service_uuid,
                                     tA2DP_SDP_DB_PARAMS* p_db,
                                     tA2DP_SDP_DB_PARAMS* p_db,
                                     tA2DP_FIND_CBACK* p_cback);
                                     tA2DP_FIND_CBACK* p_cback);


/******************************************************************************
 *
 * Function         A2DP_GetAvdtpVersion()
 *
 * Description      Gets the local version of AVDTP
 *
 * Returns          The local version of AVDTP.
 *
 *****************************************************************************/
extern uint16_t A2DP_GetAvdtpVersion(void);

/******************************************************************************
/******************************************************************************
 *
 *
 * Function         A2DP_SetTraceLevel
 * Function         A2DP_SetTraceLevel
+1 −1
Original line number Original line Diff line number Diff line
@@ -34,7 +34,7 @@
#ifndef AVDT_VERSION
#ifndef AVDT_VERSION
#define AVDT_VERSION 0x0102
#define AVDT_VERSION 0x0102
#endif
#endif
#define AVDT_VERSION_SYNC 0x0103
#define AVDT_VERSION_1_3 0x0103


/* Maximum size in bytes of the codec capabilities information element. */
/* Maximum size in bytes of the codec capabilities information element. */
#define AVDT_CODEC_SIZE 20
#define AVDT_CODEC_SIZE 20