From 190bd80f3d04f37d4e15a49f31a5b60bd89fbbce Mon Sep 17 00:00:00 2001 From: xiongweichao Date: Thu, 23 Dec 2021 20:45:09 +0800 Subject: [PATCH 1/4] Fixed a2dp source audio data packet congestion causing choppy audio in a2dp sink --- .../host/bluedroid/btc/profile/std/a2dp/btc_a2dp_control.c | 4 +--- components/bt/host/bluedroid/btc/profile/std/a2dp/btc_av.c | 7 +++++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/components/bt/host/bluedroid/btc/profile/std/a2dp/btc_a2dp_control.c b/components/bt/host/bluedroid/btc/profile/std/a2dp/btc_a2dp_control.c index 732ab503f8..3dd1134895 100644 --- a/components/bt/host/bluedroid/btc/profile/std/a2dp/btc_a2dp_control.c +++ b/components/bt/host/bluedroid/btc/profile/std/a2dp/btc_a2dp_control.c @@ -146,10 +146,8 @@ void btc_a2dp_control_media_ctrl(esp_a2d_media_ctrl_t ctrl) break; case ESP_A2D_MEDIA_CTRL_START: if (btc_av_stream_ready() == TRUE ) { - /* post start event and wait for audio path to open */ + /* post start event */ btc_dispatch_sm_event(BTC_AV_START_STREAM_REQ_EVT, NULL, 0); - - btc_a2dp_dispatch_datapath_evt(BTC_AV_DATAPATH_OPEN_EVT); #if (BTC_AV_SINK_INCLUDED == TRUE) if (btc_av_get_peer_sep() == AVDT_TSEP_SRC && btc_av_get_service_id() == BTA_A2DP_SINK_SERVICE_ID) { btc_a2dp_control_command_ack(ESP_A2D_MEDIA_CTRL_ACK_SUCCESS); diff --git a/components/bt/host/bluedroid/btc/profile/std/a2dp/btc_av.c b/components/bt/host/bluedroid/btc/profile/std/a2dp/btc_av.c index a614f72eaf..1ff744ce67 100644 --- a/components/bt/host/bluedroid/btc/profile/std/a2dp/btc_av.c +++ b/components/bt/host/bluedroid/btc/profile/std/a2dp/btc_av.c @@ -451,7 +451,7 @@ static BOOLEAN btc_av_state_opening_handler(btc_sm_event_t event, void *p_data) av_state = BTC_AV_STATE_OPENED; } else { BTC_TRACE_WARNING("BTA_AV_OPEN_EVT::FAILED status: %d\n", p_bta_data->open.status); - + conn_stat = ESP_A2D_CONNECTION_STATE_DISCONNECTED; av_state = BTC_AV_STATE_IDLE; } @@ -681,6 +681,9 @@ static BOOLEAN btc_av_state_opened_handler(btc_sm_event_t event, void *p_data) /* pending start flag will be cleared when exit current state */ } #endif /* BTC_AV_SRC_INCLUDED */ + /* wait for audio path to open */ + btc_a2dp_control_datapath_ctrl(BTC_AV_DATAPATH_OPEN_EVT); + btc_sm_change_state(btc_av_cb.sm_handle, BTC_AV_STATE_STARTED); } break; @@ -1470,7 +1473,7 @@ void btc_a2dp_call_handler(btc_msg_t *msg) } case BTC_AV_SINK_API_DISCONNECT_EVT: { CHECK_BTAV_INIT(); - btc_av_disconn_req_t disconn_req; + btc_av_disconn_req_t disconn_req; memcpy(&disconn_req.target_bda, &arg->disconn, sizeof(bt_bdaddr_t)); btc_sm_dispatch(btc_av_cb.sm_handle, BTC_AV_DISCONNECT_REQ_EVT, &disconn_req); break; From cf2f2a44c771a9387ab8419d502990a265d0e12c Mon Sep 17 00:00:00 2001 From: xiongweichao Date: Thu, 23 Dec 2021 21:54:10 +0800 Subject: [PATCH 2/4] Fixed the crash caused by calling esp_a2d_media_ctrl(ESP_A2D_MEDIA_CTRL_START) after stream started --- .../bt/host/bluedroid/btc/profile/std/a2dp/btc_a2dp_control.c | 1 - 1 file changed, 1 deletion(-) diff --git a/components/bt/host/bluedroid/btc/profile/std/a2dp/btc_a2dp_control.c b/components/bt/host/bluedroid/btc/profile/std/a2dp/btc_a2dp_control.c index 3dd1134895..4113d4c087 100644 --- a/components/bt/host/bluedroid/btc/profile/std/a2dp/btc_a2dp_control.c +++ b/components/bt/host/bluedroid/btc/profile/std/a2dp/btc_a2dp_control.c @@ -154,7 +154,6 @@ void btc_a2dp_control_media_ctrl(esp_a2d_media_ctrl_t ctrl) } #endif } else if (btc_av_stream_started_ready()) { - btc_a2dp_dispatch_datapath_evt(BTC_AV_DATAPATH_OPEN_EVT); btc_a2dp_control_command_ack(ESP_A2D_MEDIA_CTRL_ACK_SUCCESS); } else { btc_a2dp_control_command_ack(ESP_A2D_MEDIA_CTRL_ACK_FAILURE); From 45b9b12c040cd9f0e6cd4c1baa429aec5fd40a75 Mon Sep 17 00:00:00 2001 From: xiongweichao Date: Fri, 24 Dec 2021 11:29:27 +0800 Subject: [PATCH 3/4] remove btc_a2dp_dispatch_datapath_evt and event --- .../btc/profile/std/a2dp/btc_a2dp_control.c | 16 ---------------- .../host/bluedroid/btc/profile/std/a2dp/btc_av.c | 4 ---- .../bluedroid/btc/profile/std/include/btc_av.h | 3 --- 3 files changed, 23 deletions(-) diff --git a/components/bt/host/bluedroid/btc/profile/std/a2dp/btc_a2dp_control.c b/components/bt/host/bluedroid/btc/profile/std/a2dp/btc_a2dp_control.c index 4113d4c087..9803b84d63 100644 --- a/components/bt/host/bluedroid/btc/profile/std/a2dp/btc_a2dp_control.c +++ b/components/bt/host/bluedroid/btc/profile/std/a2dp/btc_a2dp_control.c @@ -96,22 +96,6 @@ void btc_a2dp_control_set_datachnl_stat(BOOLEAN open) btc_aa_ctrl_cb.data_channel_open = open; } -static void btc_a2dp_dispatch_datapath_evt(uint32_t dp_evt) -{ - btc_msg_t msg; - msg.sig = BTC_SIG_API_CALL; - msg.pid = BTC_PID_A2DP; - msg.act = BTC_AV_DATAPATH_CTRL_EVT; - - btc_av_args_t arg; - memset(&arg, 0, sizeof(btc_av_args_t)); - arg.dp_evt = dp_evt; - - /* Switch to BTC context */ - APPL_TRACE_DEBUG("%s sig %u act %u, dp_evt %u\n", __func__, msg.sig, msg.act, arg.dp_evt); - btc_transfer_context(&msg, &arg, sizeof(btc_av_args_t), NULL); -} - void btc_a2dp_control_media_ctrl(esp_a2d_media_ctrl_t ctrl) { APPL_TRACE_DEBUG("BTC MEDIA (A2DP-DATA) EVENT %u", ctrl); diff --git a/components/bt/host/bluedroid/btc/profile/std/a2dp/btc_av.c b/components/bt/host/bluedroid/btc/profile/std/a2dp/btc_av.c index 1ff744ce67..8aa6e51b5d 100644 --- a/components/bt/host/bluedroid/btc/profile/std/a2dp/btc_av.c +++ b/components/bt/host/bluedroid/btc/profile/std/a2dp/btc_av.c @@ -1512,10 +1512,6 @@ void btc_a2dp_call_handler(btc_msg_t *msg) btc_a2dp_control_media_ctrl(arg->ctrl); break; } - case BTC_AV_DATAPATH_CTRL_EVT: { - btc_a2dp_control_datapath_ctrl(arg->dp_evt); - break; - } case BTC_AV_CONNECT_REQ_EVT: btc_sm_dispatch(btc_av_cb.sm_handle, msg->act, (char *)msg->arg); break; diff --git a/components/bt/host/bluedroid/btc/profile/std/include/btc_av.h b/components/bt/host/bluedroid/btc/profile/std/include/btc_av.h index 553f0ddec7..9de7185b5a 100644 --- a/components/bt/host/bluedroid/btc/profile/std/include/btc_av.h +++ b/components/bt/host/bluedroid/btc/profile/std/include/btc_av.h @@ -79,7 +79,6 @@ typedef enum { BTC_AV_SRC_API_REG_DATA_CB_EVT, #endif /* BTC_AV_SRC_INCLUDED */ BTC_AV_API_MEDIA_CTRL_EVT, - BTC_AV_DATAPATH_CTRL_EVT, } btc_av_act_t; /* btc_av_args_t */ @@ -104,8 +103,6 @@ typedef union { #endif /* BTC_AV_SRC_INCLUDED */ // BTC_AV_API_MEDIA_CTRL_EVT esp_a2d_media_ctrl_t ctrl; - // BTC_AV_DATAPATH_CTRL_EVT - uint32_t dp_evt; } btc_av_args_t; /******************************************************************************* From f41d77cce987672be47f84c5d148b80fa99cd16a Mon Sep 17 00:00:00 2001 From: xiongweichao Date: Thu, 6 Jan 2022 14:10:18 +0800 Subject: [PATCH 4/4] btc_a2dp_control_set_datachnl_stat is only used by a2dp sink --- .../bt/host/bluedroid/btc/profile/std/a2dp/btc_a2dp_control.c | 4 +++- .../bt/host/bluedroid/btc/profile/std/a2dp/btc_a2dp_source.c | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/components/bt/host/bluedroid/btc/profile/std/a2dp/btc_a2dp_control.c b/components/bt/host/bluedroid/btc/profile/std/a2dp/btc_a2dp_control.c index 9803b84d63..4aa129ec0b 100644 --- a/components/bt/host/bluedroid/btc/profile/std/a2dp/btc_a2dp_control.c +++ b/components/bt/host/bluedroid/btc/profile/std/a2dp/btc_a2dp_control.c @@ -33,7 +33,7 @@ #if BTC_AV_INCLUDED typedef struct { - BOOLEAN data_channel_open; + BOOLEAN data_channel_open; /* used only by A2DP sink */ UINT8 a2dp_cmd_pending; /* we can have max one command pending */ } tBTC_AA_CTRL_CB; @@ -83,7 +83,9 @@ static void btc_a2dp_datapath_open(void) btc_a2dp_source_encoder_update(); } #endif +#if (BTC_AV_SINK_INCLUDED == TRUE) btc_aa_ctrl_cb.data_channel_open = TRUE; +#endif } BOOLEAN btc_a2dp_control_get_datachnl_stat(void) diff --git a/components/bt/host/bluedroid/btc/profile/std/a2dp/btc_a2dp_source.c b/components/bt/host/bluedroid/btc/profile/std/a2dp/btc_a2dp_source.c index c66ac28be8..fe37f704d0 100644 --- a/components/bt/host/bluedroid/btc/profile/std/a2dp/btc_a2dp_source.c +++ b/components/bt/host/bluedroid/btc/profile/std/a2dp/btc_a2dp_source.c @@ -1579,7 +1579,6 @@ static void btc_a2dp_source_thread_init(UNUSED_ATTR void *context) static void btc_a2dp_source_thread_cleanup(UNUSED_ATTR void *context) { - btc_a2dp_control_set_datachnl_stat(FALSE); /* Clear media task flag */ btc_a2dp_source_state = BTC_A2DP_SOURCE_STATE_OFF;