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

Commit fafb4c3c authored by yamei du's avatar yamei du Committed by Yamei Du
Browse files

A2DP: Skip A2DP SDP for IOT devices

Some A2DP sink devices don't respond SDP request during A2DP
reconnection. Add an IOT device list for these devices to avoid
A2DP reconnection issue

Test: m com.android.btservices
Test: Manual. Trigger A2DP reconnection from peer device.

Change-Id: Id42f41dd008571fae771564e89f5c4f1c5cf4782
parent 61be53f0
Loading
Loading
Loading
Loading
+28 −15
Original line number Diff line number Diff line
@@ -535,7 +535,8 @@ static void bta_av_a2dp_sdp_cback(bool found, tA2DP_Service* p_service,
    log::error("BTA_AV_SDP_DISC_FAIL_EVT: peer_addr={}",
               ADDRESS_TO_LOGGABLE_CSTR(p_scb->PeerAddress()));
  }
  if (found && (p_service != NULL)) {
  if (found) {
    if (p_service != NULL) {
      p_scb->SetAvdtpVersion(p_service->avdt_version);
      DEVICE_IOT_CONFIG_ADDR_SET_HEX_IF_GREATER(
          p_scb->PeerAddress(), IOT_CONF_KEY_A2DP_VERSION,
@@ -551,6 +552,7 @@ static void bta_av_a2dp_sdp_cback(bool found, tA2DP_Service* p_service,
                    ADDRESS_TO_LOGGABLE_CSTR(p_scb->PeerAddress()));
        }
      }
    }
  } else {
    p_scb->SetAvdtpVersion(0);
  }
@@ -815,11 +817,22 @@ void bta_av_do_disc_a2dp(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {

  bta_sys_app_open(BTA_ID_AV, p_scb->app_id, p_scb->PeerAddress());

  p_scb->uuid_int = p_data->api_open.uuid;
  if (p_scb->AvdtpVersion() != 0
      && interop_match_addr_or_name(
              INTEROP_A2DP_SKIP_SDP_DURING_RECONNECTION,
              &p_scb->PeerAddress(),
              &btif_storage_get_remote_device_property)) {
    log::info("Skip SDP with valid AVDTP version 0x%04x",
              p_scb->AvdtpVersion());
    bta_av_a2dp_sdp_cback(true, nullptr, p_scb->PeerAddress());
    return;
  }

  /* set up parameters */
  db_params.db_len = BTA_AV_DISC_BUF_SIZE;
  db_params.num_attr = 3;
  db_params.p_attrs = attr_list;
  p_scb->uuid_int = p_data->api_open.uuid;
  p_scb->sdp_discovery_started = true;
  if (p_scb->uuid_int == UUID_SERVCLASS_AUDIO_SINK)
    sdp_uuid = UUID_SERVCLASS_AUDIO_SOURCE;
+7 −0
Original line number Diff line number Diff line
@@ -865,3 +865,10 @@ EPG = Name_Based
[INTEROP_MULTIPLE_HOGP_SERVICE_CHOOSE_THIRD]
0X046D-0XBB00 = Vndr_Prdt_Based
0X046D-0XBB01 = Vndr_Prdt_Based

# Some A2DP sink devices don't respond SDP request during A2DP reconnection. Skip SDP for
# these devices.
[INTEROP_A2DP_SKIP_SDP_DURING_RECONNECTION]
CANZ = Name_Based
BSK30 = Name_Based
BSK10 = Name_Based
+3 −0
Original line number Diff line number Diff line
@@ -350,6 +350,9 @@ typedef enum {
  // Some LE HID devices contain more than one HOGP service.
  INTEROP_MULTIPLE_HOGP_SERVICE_CHOOSE_THIRD,

  // Som A2DP sink devices don't respond SDP request during A2DP reconnection
  INTEROP_A2DP_SKIP_SDP_DURING_RECONNECTION,

  END_OF_INTEROP_LIST
} interop_feature_t;

+1 −0
Original line number Diff line number Diff line
@@ -404,6 +404,7 @@ static const char* interop_feature_string_(const interop_feature_t feature) {
    CASE_RETURN_STR(INTEROP_INSERT_CALL_WHEN_SCO_START);
    CASE_RETURN_STR(INTEROP_DELAY_AUTH);
    CASE_RETURN_STR(INTEROP_MULTIPLE_HOGP_SERVICE_CHOOSE_THIRD);
    CASE_RETURN_STR(INTEROP_A2DP_SKIP_SDP_DURING_RECONNECTION);
  }
  return UNKNOWN_INTEROP_FEATURE;
}