From fb691de015099129aff952cf32a145cbce68299d Mon Sep 17 00:00:00 2001 From: Pavlin Radoslavov Date: Tue, 15 May 2018 19:21:03 -0700 Subject: [PATCH] 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 Merged-In: I8048a1bf6df6d4d6291bf3570a95b5182af15b6a (cherry picked from commit 1200c75df85ac3d4f49b91039334077ada60e0cb) --- bta/av/bta_av_aact.cc | 30 +++++++++--------------------- bta/av/bta_av_int.h | 1 - bta/av/bta_av_main.cc | 40 ---------------------------------------- btif/co/bta_av_co.cc | 10 ++++++---- 4 files changed, 15 insertions(+), 66 deletions(-) diff --git a/bta/av/bta_av_aact.cc b/bta/av/bta_av_aact.cc index 89d9523e5..1bc6ad4b5 100644 --- a/bta/av/bta_av_aact.cc +++ b/bta/av/bta_av_aact.cc @@ -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: diff --git a/bta/av/bta_av_int.h b/bta/av/bta_av_int.h index e5f0b5ada..d6401de30 100644 --- a/bta/av/bta_av_int.h +++ b/bta/av/bta_av_int.h @@ -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); diff --git a/bta/av/bta_av_main.cc b/bta/av/bta_av_main.cc index b1cde50f5..f04d205bc 100644 --- a/bta/av/bta_av_main.cc +++ b/bta/av/bta_av_main.cc @@ -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 diff --git a/btif/co/bta_av_co.cc b/btif/co/bta_av_co.cc index d2f8b192a..61477446e 100644 --- a/btif/co/bta_av_co.cc +++ b/btif/co/bta_av_co.cc @@ -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 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() { -- 2.11.0