OSDN Git Service

Don't update the MTU across multiple A2DP connections that are open
authorPavlin Radoslavov <pavlin@google.com>
Wed, 16 May 2018 02:21:03 +0000 (19:21 -0700)
committerPavlin Radoslavov <pavlin@google.com>
Wed, 16 May 2018 21:00:13 +0000 (14:00 -0700)
Remove function bta_av_chk_mtu() that updates the MTU to the smallest
value across all open A2DP connections, because that function is not needed.
Such MTU update is problematic for Multi-A2DP, because some codecs cannot
be initialized/used if the MTU is too small. E.g., for LDAC the
MTU value used for the codec initialization must be at least 679.

Bug: 79675742
Test: Manual - (1)Connect Bose QC35; (2)Connect Sony SRS-XB2; (3)Play music
Change-Id: I8048a1bf6df6d4d6291bf3570a95b5182af15b6a
Merged-In: I8048a1bf6df6d4d6291bf3570a95b5182af15b6a
(cherry picked from commit 1200c75df85ac3d4f49b91039334077ada60e0cb)

bta/av/bta_av_aact.cc
bta/av/bta_av_int.h
bta/av/bta_av_main.cc
btif/co/bta_av_co.cc

index 89d9523..1bc6ad4 100644 (file)
@@ -1193,7 +1193,6 @@ void bta_av_setconfig_rsp(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {
 void bta_av_str_opened(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {
   tBTA_AV_CONN_CHG msg;
   uint8_t* p;
-  uint16_t mtu;
 
   APPL_TRACE_DEBUG("%s: peer %s handle: %d", __func__,
                    p_scb->PeerAddress().ToString().c_str(), p_scb->hndl);
@@ -1209,10 +1208,8 @@ void bta_av_str_opened(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {
 
   p_scb->stream_mtu =
       p_data->str_msg.msg.open_ind.peer_mtu - AVDT_MEDIA_HDR_SIZE;
-  mtu = bta_av_chk_mtu(p_scb, p_scb->stream_mtu);
-  APPL_TRACE_DEBUG("%s: l2c_cid: 0x%x stream_mtu: %d mtu: %d", __func__,
-                   p_scb->l2c_cid, p_scb->stream_mtu, mtu);
-  if (mtu == 0 || mtu > p_scb->stream_mtu) mtu = p_scb->stream_mtu;
+  APPL_TRACE_DEBUG("%s: l2c_cid: 0x%x stream_mtu: %d", __func__, p_scb->l2c_cid,
+                   p_scb->stream_mtu);
 
   /* Set the media channel as high priority */
   L2CA_SetTxPriority(p_scb->l2c_cid, L2CAP_CHNL_PRIORITY_HIGH);
@@ -1222,7 +1219,7 @@ void bta_av_str_opened(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {
   memset(&p_scb->q_info, 0, sizeof(tBTA_AV_Q_INFO));
 
   p_scb->l2c_bufs = 0;
-  p_scb->p_cos->open(p_scb->hndl, p_scb->PeerAddress(), mtu);
+  p_scb->p_cos->open(p_scb->hndl, p_scb->PeerAddress(), p_scb->stream_mtu);
 
   {
     /* TODO check if other audio channel is open.
@@ -1605,13 +1602,8 @@ void bta_av_set_use_rc(tBTA_AV_SCB* p_scb, UNUSED_ATTR tBTA_AV_DATA* p_data) {
  *
  ******************************************************************************/
 void bta_av_cco_close(tBTA_AV_SCB* p_scb, UNUSED_ATTR tBTA_AV_DATA* p_data) {
-  uint16_t mtu;
-
   APPL_TRACE_DEBUG("%s: peer %s handle:%d", __func__,
                    p_scb->PeerAddress().ToString().c_str(), p_scb->hndl);
-
-  mtu = bta_av_chk_mtu(p_scb, BTA_AV_MAX_A2DP_MTU);
-
   p_scb->p_cos->close(p_scb->hndl, p_scb->PeerAddress());
 }
 
@@ -2582,11 +2574,10 @@ void bta_av_rcfg_str_ok(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {
     // p_data could be NULL if the reconfig was triggered by the local device
     p_scb->stream_mtu =
         p_data->str_msg.msg.open_ind.peer_mtu - AVDT_MEDIA_HDR_SIZE;
-    uint16_t mtu = bta_av_chk_mtu(p_scb, p_scb->stream_mtu);
-    APPL_TRACE_DEBUG("%s: l2c_cid: 0x%x stream_mtu: %d mtu: %d", __func__,
-                     p_scb->l2c_cid, p_scb->stream_mtu, mtu);
-    if (mtu == 0 || mtu > p_scb->stream_mtu) mtu = p_scb->stream_mtu;
-    p_scb->p_cos->update_mtu(p_scb->hndl, p_scb->PeerAddress(), mtu);
+    APPL_TRACE_DEBUG("%s: l2c_cid: 0x%x stream_mtu: %d", __func__,
+                     p_scb->l2c_cid, p_scb->stream_mtu);
+    p_scb->p_cos->update_mtu(p_scb->hndl, p_scb->PeerAddress(),
+                             p_scb->stream_mtu);
   }
 
   /* rc listen */
@@ -3103,7 +3094,6 @@ void bta_av_offload_req(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {
     (*bta_av_cb.p_cback)(BTA_AV_OFFLOAD_START_RSP_EVT, &bta_av_data);
   }
   /* TODO(eisenbach): RE-IMPLEMENT USING VSC OR HAL EXTENSION
-  uint16_t mtu = bta_av_chk_mtu(p_scb, p_scb->stream_mtu);
   else if (bta_av_cb.audio_open_cnt == 1 &&
              p_scb->seps[p_scb->sep_idx].tsep == AVDT_TSEP_SRC &&
              p_scb->chnl == BTA_AV_CHNL_AUDIO) {
@@ -3120,8 +3110,7 @@ void bta_av_offload_req(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {
 
       a2dp_offload_start.bta_av_handle = p_scb->hndl;
       a2dp_offload_start.xmit_quota = BTA_AV_A2DP_OFFLOAD_XMIT_QUOTA;
-      a2dp_offload_start.stream_mtu =
-          (mtu < p_scb->stream_mtu) ? mtu : p_scb->stream_mtu;
+      a2dp_offload_start.stream_mtu = p_scb->stream_mtu;
       a2dp_offload_start.local_cid = p_scb->l2c_cid;
       a2dp_offload_start.is_flushable = true;
       a2dp_offload_start.stream_source =
@@ -3175,8 +3164,7 @@ static void bta_av_offload_codec_builder(tBTA_AV_SCB* p_scb,
   btav_a2dp_codec_index_t codec_index =
       A2DP_SourceCodecIndex(p_scb->cfg.codec_info);
   uint32_t codec_type = 0;
-  uint16_t mtu = bta_av_chk_mtu(p_scb, p_scb->stream_mtu);
-  if (mtu == 0 || mtu > p_scb->stream_mtu) mtu = p_scb->stream_mtu;
+  uint16_t mtu = p_scb->stream_mtu;
   APPL_TRACE_DEBUG("%s:codec_index = %d", __func__, codec_index);
   switch (codec_index) {
     case BTAV_A2DP_CODEC_INDEX_SOURCE_SBC:
index e5f0b5a..d6401de 100644 (file)
@@ -659,7 +659,6 @@ extern void bta_av_sink_data_cback(uint8_t handle, BT_HDR* p_pkt,
 extern tBTA_AV_SCB* bta_av_hndl_to_scb(uint16_t handle);
 extern bool bta_av_chk_start(tBTA_AV_SCB* p_scb);
 extern void bta_av_restore_switch(void);
-extern uint16_t bta_av_chk_mtu(tBTA_AV_SCB* p_scb, uint16_t mtu);
 extern void bta_av_conn_cback(uint8_t handle, const RawAddress& bd_addr,
                               uint8_t event, tAVDT_CTRL* p_data,
                               uint8_t scb_index);
index b1cde50..f04d205 100644 (file)
@@ -1082,46 +1082,6 @@ bool bta_av_link_role_ok(tBTA_AV_SCB* p_scb, uint8_t bits) {
 
 /*******************************************************************************
  *
- * Function         bta_av_chk_mtu
- *
- * Description      if this is audio channel, check if more than one audio
- *                  channel is connected.
- *
- * Returns          The smallest mtu of the connected audio channels
- *
- ******************************************************************************/
-uint16_t bta_av_chk_mtu(tBTA_AV_SCB* p_scb, UNUSED_ATTR uint16_t mtu) {
-  uint16_t ret_mtu = BTA_AV_MAX_A2DP_MTU;
-  tBTA_AV_SCB* p_scbi;
-  int i;
-  uint8_t mask;
-
-  /* TODO_MV mess with the mtu according to the number of EDR/non-EDR headsets
-   */
-  if (p_scb->chnl == BTA_AV_CHNL_AUDIO) {
-    if (bta_av_cb.audio_open_cnt >= 2) {
-      /* more than one audio channel is connected */
-      for (i = 0; i < BTA_AV_NUM_STRS; i++) {
-        p_scbi = bta_av_cb.p_scb[i];
-        if ((p_scb != p_scbi) && p_scbi &&
-            (p_scbi->chnl == BTA_AV_CHNL_AUDIO)) {
-          mask = BTA_AV_HNDL_TO_MSK(i);
-          APPL_TRACE_DEBUG("%s: [%d] mtu: %d, mask:0x%x", __func__, i,
-                           p_scbi->stream_mtu, mask);
-          if (bta_av_cb.conn_audio & mask) {
-            if (ret_mtu > p_scbi->stream_mtu) ret_mtu = p_scbi->stream_mtu;
-          }
-        }
-      }
-    }
-    APPL_TRACE_DEBUG("%s: count:%d, conn_audio:0x%x, ret:%d", __func__,
-                     bta_av_cb.audio_open_cnt, bta_av_cb.conn_audio, ret_mtu);
-  }
-  return ret_mtu;
-}
-
-/*******************************************************************************
- *
  * Function         bta_av_dup_audio_buf
  *
  * Description      dup the audio data to the q_info.a2dp of other audio
index d2f8b19..6147744 100644 (file)
@@ -1403,10 +1403,7 @@ void BtaAvCo::GetPeerEncoderParameters(
     const RawAddress& peer_address,
     tA2DP_ENCODER_INIT_PEER_PARAMS* p_peer_params) {
   uint16_t min_mtu = 0xFFFF;
-
-  APPL_TRACE_DEBUG("%s: peer_address=%s", __func__,
-                   peer_address.ToString().c_str());
-  CHECK(p_peer_params != nullptr);
+  CHECK(p_peer_params != nullptr) << "Peer address " << peer_address;
 
   std::lock_guard<std::recursive_mutex> lock(codec_lock_);
 
@@ -1421,6 +1418,11 @@ void BtaAvCo::GetPeerEncoderParameters(
   p_peer_params->is_peer_edr = btif_av_is_peer_edr(peer_address);
   p_peer_params->peer_supports_3mbps =
       btif_av_peer_supports_3mbps(peer_address);
+  APPL_TRACE_DEBUG(
+      "%s: peer_address=%s peer_mtu=%d is_peer_edr=%s peer_supports_3mbps=%s",
+      __func__, peer_address.ToString().c_str(), p_peer_params->peer_mtu,
+      logbool(p_peer_params->is_peer_edr).c_str(),
+      logbool(p_peer_params->peer_supports_3mbps).c_str());
 }
 
 const tA2DP_ENCODER_INTERFACE* BtaAvCo::GetSourceEncoderInterface() {