#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)
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;
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;
}
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 ) {
{
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);
}
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;
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 */
#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);
/* 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 */
+ }
}
/*******************************************************************************