2 #include "AudioConfig.h"
3 #include "AudioTools/Buffers.h"
4 #include "AudioTools/AudioLogger.h"
5 #include "AudioBasic/Collections/Allocator.h"
7 #if defined(USE_CONCURRENCY)
9 # include <freertos/stream_buffer.h>
10 # include "freertos/FreeRTOS.h"
12 # include "FreeRTOS.h"
13 # include "stream_buffer.h"
32 BufferRTOS(
size_t xStreamBufferSizeBytes,
size_t xTriggerLevel = 1,
33 TickType_t writeMaxWait = portMAX_DELAY,
34 TickType_t readMaxWait = portMAX_DELAY,
37 readWait = readMaxWait;
38 writeWait = writeMaxWait;
39 current_size = xStreamBufferSizeBytes;
40 trigger_level = xTriggerLevel;
41 p_allocator = &allocator;
43 if (current_size > 0) {
52 if (current_size != size) {
59 void setReadMaxWait(TickType_t ticks) { readWait = ticks; }
61 void setWriteMaxWait(TickType_t ticks) { writeWait = ticks; }
63 void setWriteFromISR(
bool active) { write_from_isr = active; }
65 void setReadFromISR(
bool active) { read_from_isr = active; }
77 xHigherPriorityTaskWoken = pdFALSE;
78 int result = xStreamBufferReceiveFromISR(xStreamBuffer, (
void *)data,
80 &xHigherPriorityTaskWoken);
84 portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
88 return xStreamBufferReceive(xStreamBuffer, (
void *)data,
sizeof(T) * len,
94 LOGD(
"%s: %d", LOG_METHOD, len);
96 xHigherPriorityTaskWoken = pdFALSE;
98 xStreamBufferSendFromISR(xStreamBuffer, (
void *)data,
sizeof(T) * len,
99 &xHigherPriorityTaskWoken);
101 portYIELD_FROM_ISR();
103 portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
107 return xStreamBufferSend(xStreamBuffer, (
void *)data,
sizeof(T) * len,
114 LOGE(
"peek not implmented");
120 return xStreamBufferIsFull(xStreamBuffer) == pdTRUE;
123 bool isEmpty() {
return xStreamBufferIsEmpty(xStreamBuffer) == pdTRUE; }
132 void reset()
override { xStreamBufferReset(xStreamBuffer); }
136 return xStreamBufferBytesAvailable(xStreamBuffer);
141 return xStreamBufferSpacesAvailable(xStreamBuffer);
146 LOGE(
"address() not implemented");
150 size_t size() {
return current_size; }
153 StreamBufferHandle_t xStreamBuffer =
nullptr;
154 StaticStreamBuffer_t static_stream_buffer;
155 uint8_t *p_data =
nullptr;
156 Allocator *p_allocator =
nullptr;
157 BaseType_t xHigherPriorityTaskWoken = pdFALSE;
158 int readWait = portMAX_DELAY;
159 int writeWait = portMAX_DELAY;
160 bool read_from_isr =
false;
161 bool write_from_isr =
false;
162 size_t current_size = 0;
163 size_t trigger_level = 0;
168 if (current_size == 0)
return true;
171 if (p_data ==
nullptr) {
172 p_data = (uint8_t *)p_allocator->allocate((current_size + 1) *
sizeof(T));
174 if (p_data ==
nullptr)
return false;
177 if (xStreamBuffer ==
nullptr) {
178 xStreamBuffer = xStreamBufferCreateStatic(current_size, trigger_level,
179 p_data, &static_stream_buffer);
181 if (xStreamBuffer ==
nullptr)
return false;
189 if (xStreamBuffer !=
nullptr) vStreamBufferDelete(xStreamBuffer);
190 p_allocator->free(p_data);
193 xStreamBuffer =
nullptr;
199 using SynchronizedBufferRTOS = BufferRTOS<T>;