{
LOG_DEBUG("%s\n", __FUNCTION__);
- btc_a2dp_stop_media_task();
-
btc_dm_disable_service(BTA_A2DP_SOURCE_SERVICE_ID);
#if (BTA_AV_SINK_INCLUDED == TRUE)
btc_dm_disable_service(BTA_A2DP_SINK_SERVICE_ID);
/* Also shut down the AV state machine */
btc_sm_shutdown(btc_av_cb.sm_handle);
btc_av_cb.sm_handle = NULL;
+
+ btc_a2dp_stop_media_task();
}
/*******************************************************************************
#include "bt_utils.h"
#include "esp_a2dp_api.h"
#include "mutex.h"
+#include "future.h"
+#include <assert.h>
// #if (BTA_AV_SINK_INCLUDED == TRUE)
#include "oi_codec_sbc.h"
static tBTC_MEDIA_CB btc_media_cb;
static int media_task_running = MEDIA_TASK_STATE_OFF;
+static future_t *media_task_future = NULL;
static fixed_queue_t *btc_media_cmd_msg_queue = NULL;
static xTaskHandle xBtcMediaTaskHandle = NULL;
static QueueHandle_t xBtcMediaDataQueue = NULL;
APPL_TRACE_EVENT("## A2DP STOP MEDIA THREAD ##\n");
// Exit thread
+ media_task_running = MEDIA_TASK_STATE_SHUTTING_DOWN;
+ media_task_future = future_new();
+ assert(media_task_future);
btc_media_ctrl_post(SIG_MEDIA_TASK_CLEAN_UP);
- // TODO: wait until CLEAN up is done, then do task delete
+ future_await(media_task_future);
+ media_task_future = NULL;
+
vTaskDelete(xBtcMediaTaskHandle);
xBtcMediaTaskHandle = NULL;
}
while ((p_msg = (tBT_SBC_HDR *)fixed_queue_try_peek_first(btc_media_cb.RxSbcQ)) != NULL ) {
+ if (media_task_running != MEDIA_TASK_STATE_ON){
+ return;
+ }
+
btc_media_task_handle_inc_media(p_msg);
p_msg = (tBT_SBC_HDR *)fixed_queue_try_dequeue(btc_media_cb.RxSbcQ);
if ( p_msg == NULL ) {
static void btc_media_thread_cleanup(UNUSED_ATTR void *context)
{
- /* make sure no channels are restarted while shutting down */
- media_task_running = MEDIA_TASK_STATE_SHUTTING_DOWN;
-
btc_media_cb.data_channel_open = FALSE;
/* Clear media task flag */
media_task_running = MEDIA_TASK_STATE_OFF;
fixed_queue_free(btc_media_cb.RxSbcQ, osi_free_func);
+
+ future_ready(media_task_future, NULL);
}
/*******************************************************************************
{
tBT_SBC_HDR *p_msg;
+ if (media_task_running != MEDIA_TASK_STATE_ON){
+ return 0;
+ }
+
if (btc_media_cb.rx_flush == TRUE) { /* Flush enabled, do not enque*/
return fixed_queue_length(btc_media_cb.RxSbcQ);
}