|
|
@@ -16,6 +16,8 @@
|
|
|
#include "freertos/task.h"
|
|
|
#include "esp_log.h"
|
|
|
#include "bt_app_core.h"
|
|
|
+#include "driver/i2s.h"
|
|
|
+#include "freertos/ringbuf.h"
|
|
|
|
|
|
static void bt_app_task_handler(void *arg);
|
|
|
static bool bt_app_send_msg(bt_app_msg_t *msg);
|
|
|
@@ -23,6 +25,8 @@ static void bt_app_work_dispatched(bt_app_msg_t *msg);
|
|
|
|
|
|
static xQueueHandle s_bt_app_task_queue = NULL;
|
|
|
static xTaskHandle s_bt_app_task_handle = NULL;
|
|
|
+static xTaskHandle s_bt_i2s_task_handle = NULL;
|
|
|
+static RingbufHandle_t ringbuf_i2s = NULL;;
|
|
|
|
|
|
bool bt_app_work_dispatch(bt_app_cb_t p_cback, uint16_t event, void *p_params, int param_len, bt_app_copy_cb_t p_copy_cback)
|
|
|
{
|
|
|
@@ -111,3 +115,50 @@ void bt_app_task_shut_down(void)
|
|
|
s_bt_app_task_queue = NULL;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+static void bt_i2s_task_handler(void *arg)
|
|
|
+{
|
|
|
+ uint8_t *data = NULL;
|
|
|
+ size_t item_size = 0;
|
|
|
+ size_t bytes_written = 0;
|
|
|
+
|
|
|
+ for (;;) {
|
|
|
+ data = (uint8_t *)xRingbufferReceive(ringbuf_i2s, &item_size, (portTickType)portMAX_DELAY);
|
|
|
+ if (item_size != 0){
|
|
|
+ i2s_write(0, data, item_size, &bytes_written, portMAX_DELAY);
|
|
|
+ vRingbufferReturnItem(ringbuf_i2s,(void *)data);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void bt_i2s_task_start_up(void)
|
|
|
+{
|
|
|
+ ringbuf_i2s = xRingbufferCreate(8 * 1024, RINGBUF_TYPE_BYTEBUF);
|
|
|
+ if(ringbuf_i2s == NULL){
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ xTaskCreate(bt_i2s_task_handler, "BtI2ST", 1024, NULL, configMAX_PRIORITIES - 3, &s_bt_i2s_task_handle);
|
|
|
+ return;
|
|
|
+}
|
|
|
+
|
|
|
+void bt_i2s_task_shut_down(void)
|
|
|
+{
|
|
|
+ if (s_bt_i2s_task_handle) {
|
|
|
+ vTaskDelete(s_bt_i2s_task_handle);
|
|
|
+ s_bt_i2s_task_handle = NULL;
|
|
|
+ }
|
|
|
+
|
|
|
+ vRingbufferDelete(ringbuf_i2s);
|
|
|
+ ringbuf_i2s = NULL;
|
|
|
+}
|
|
|
+
|
|
|
+size_t write_ringbuf(const uint8_t *data, size_t size)
|
|
|
+{
|
|
|
+ BaseType_t done = xRingbufferSend(ringbuf_i2s, (void *)data, size, (portTickType)portMAX_DELAY);
|
|
|
+ if(done){
|
|
|
+ return size;
|
|
|
+ } else {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+}
|