]> granicus.if.org Git - esp-idf/commitdiff
component/bt: Fix bug of a2dp sink cleanup bug when connected
authorbaohongde <baohongde@espressif.com>
Mon, 12 Mar 2018 10:15:56 +0000 (18:15 +0800)
committerbot <bot@espressif.com>
Wed, 14 Mar 2018 06:27:26 +0000 (06:27 +0000)
components/bt/bluedroid/btc/profile/std/a2dp/btc_a2dp_sink.c
components/bt/bluedroid/btc/profile/std/a2dp/btc_av.c

index d52391a8684bd88d94fa839e889184da2daaa9c1..28de53691e576d69896c73256ccce9817dfd35e0 100644 (file)
@@ -40,6 +40,8 @@
 #include "esp_a2dp_api.h"
 #include "oi_codec_sbc.h"
 #include "oi_status.h"
+#include "future.h"
+#include <assert.h>
 
 #if (BTC_AV_SINK_INCLUDED == TRUE)
 
@@ -119,6 +121,7 @@ static void btc_a2dp_sink_data_ready(UNUSED_ATTR void *context);
 
 static tBTC_A2DP_SINK_CB btc_aa_snk_cb;
 static int btc_a2dp_sink_state = BTC_A2DP_SINK_STATE_OFF;
+static future_t *btc_a2dp_sink_future = NULL;
 static xTaskHandle  btc_aa_snk_task_hdl = NULL;
 static QueueHandle_t btc_aa_snk_data_queue = NULL;
 static QueueHandle_t btc_aa_snk_ctrl_queue = NULL;
@@ -285,7 +288,12 @@ void btc_a2dp_sink_shutdown(void)
     APPL_TRACE_EVENT("## A2DP SINK STOP MEDIA THREAD ##\n");
 
     // Exit thread
+    btc_a2dp_sink_state = BTC_A2DP_SINK_STATE_SHUTTING_DOWN;
+    btc_a2dp_sink_future = future_new();
+    assert(btc_a2dp_sink_future);
     btc_a2dp_sink_ctrl_post(BTC_MEDIA_TASK_SINK_CLEAN_UP, NULL);
+    future_await(btc_a2dp_sink_future);
+    btc_a2dp_sink_future = NULL;
 
     vTaskDelete(btc_aa_snk_task_hdl);
     btc_aa_snk_task_hdl = NULL;
@@ -410,6 +418,9 @@ static void btc_a2dp_sink_data_ready(UNUSED_ATTR void *context)
         }
 
         while ((p_msg = (tBT_SBC_HDR *)fixed_queue_try_peek_first(btc_aa_snk_cb.RxSbcQ)) != NULL ) {
+            if (btc_a2dp_sink_state != BTC_A2DP_SINK_STATE_ON){
+                return;
+            }
             btc_a2dp_sink_handle_inc_media(p_msg);
             p_msg = (tBT_SBC_HDR *)fixed_queue_try_dequeue(btc_aa_snk_cb.RxSbcQ);
             if ( p_msg == NULL ) {
@@ -693,6 +704,10 @@ UINT8 btc_a2dp_sink_enque_buf(BT_HDR *p_pkt)
 {
     tBT_SBC_HDR *p_msg;
 
+    if (btc_a2dp_sink_state != BTC_A2DP_SINK_STATE_ON){
+        return 0;
+    }
+
     if (btc_aa_snk_cb.rx_flush == TRUE) { /* Flush enabled, do not enque*/
         return fixed_queue_length(btc_aa_snk_cb.RxSbcQ);
     }
@@ -754,9 +769,6 @@ static void btc_a2dp_sink_thread_init(UNUSED_ATTR void *context)
 
 static void btc_a2dp_sink_thread_cleanup(UNUSED_ATTR void *context)
 {
-    /* make sure no channels are restarted while shutting down */
-    btc_a2dp_sink_state = BTC_A2DP_SINK_STATE_SHUTTING_DOWN;
-
     btc_a2dp_control_set_datachnl_stat(FALSE);
     /* Clear task flag */
     btc_a2dp_sink_state = BTC_A2DP_SINK_STATE_OFF;
@@ -764,6 +776,8 @@ static void btc_a2dp_sink_thread_cleanup(UNUSED_ATTR void *context)
     btc_a2dp_control_cleanup();
 
     fixed_queue_free(btc_aa_snk_cb.RxSbcQ, osi_free_func);
+
+    future_ready(btc_a2dp_sink_future, NULL);
 }
 
 #endif /* BTC_AV_SINK_INCLUDED */
index 1ac3b96e262f0ec7c1b38d5f89bb80b6d786ccfc..3d54d79770f1bccdce64439fc6605ef96627fb54 100644 (file)
@@ -1022,10 +1022,6 @@ static void clean_up(int service_id)
 #if BTC_AV_SRC_INCLUDED
         btc_a2dp_source_shutdown();
 #endif /* BTC_AV_SRC_INCLUDED */
-    } else if (service_id == BTA_A2DP_SINK_SERVICE_ID) {
-#if BTC_AV_SINK_INCLUDED
-        btc_a2dp_sink_shutdown();
-#endif /* BTC_AV_SINK_INCLUDED */
     }
 
     btc_dm_disable_service(BTA_A2DP_SOURCE_SERVICE_ID);
@@ -1037,6 +1033,12 @@ static void clean_up(int service_id)
     /* Also shut down the AV state machine */
     btc_sm_shutdown(btc_av_cb.sm_handle);
     btc_av_cb.sm_handle = NULL;
+
+    if (service_id == BTA_A2DP_SINK_SERVICE_ID) {
+#if BTC_AV_SINK_INCLUDED
+        btc_a2dp_sink_shutdown();
+#endif /* BTC_AV_SINK_INCLUDED */
+    }
 }
 
 /*******************************************************************************