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

Commit 1dd444f1 authored by Pavlin Radoslavov's avatar Pavlin Radoslavov
Browse files

Don't update the MTU across multiple A2DP connections that are open

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
parent 7d8cdcbb
Loading
Loading
Loading
Loading
+9 −21
Original line number Diff line number Diff line
@@ -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:
+0 −1
Original line number Diff line number Diff line
@@ -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);
+0 −40
Original line number Diff line number Diff line
@@ -1080,46 +1080,6 @@ bool bta_av_link_role_ok(tBTA_AV_SCB* p_scb, uint8_t bits) {
  return is_ok;
}

/*******************************************************************************
 *
 * 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
+6 −4
Original line number Diff line number Diff line
@@ -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() {