3 #include "AudioConfig.h"
4 #include "AudioTools/AudioTypes.h"
5 #include "AudioTools/Buffers.h"
6 #include "AudioTools/AudioLogger.h"
8 #if defined(USE_CONCURRENCY)
10 # include "freertos/FreeRTOS.h"
11 # include "Concurrency/QueueRTOS.h"
12 # if ESP_IDF_VERSION_MAJOR >= 4
13 # include <freertos/stream_buffer.h>
16 # include "stream_buffer.h"
19 #include "LockGuard.h"
44 return p_buffer->read();
52 for (
int j = 0; j < lenResult; j++) {
53 data[j] = p_buffer->read();
59 LOGD(
"%s: %d", LOG_METHOD, len);
62 for (
int j = 0; j < len; j++) {
63 if (p_buffer->write(data[j]) == 0) {
75 return p_buffer->peek();
79 bool isFull()
override {
return p_buffer->isFull(); }
81 bool isEmpty() {
return available() == 0; }
87 return p_buffer->write(data);
101 return p_buffer->available();
108 return p_buffer->availableForWrite();
114 return p_buffer->address();
118 return p_buffer->size();
122 BaseBuffer<T> *p_buffer =
nullptr;
123 Mutex *p_mutex =
nullptr;
133 template <
typename T>
136 SynchronizedNBuffer(
int bufferSize,
int bufferCount,
int writeMaxWait=portMAX_DELAY,
int readMaxWait=portMAX_DELAY) {
138 max_size = bufferSize * bufferCount;
142 available_buffers.resize(bufferCount);
143 filled_buffers.resize(bufferCount);
145 setReadMaxWait(readMaxWait);
146 setWriteMaxWait(writeMaxWait);
150 for (
int j = 0; j < bufferCount; j++) {
152 if (tmp !=
nullptr) {
153 available_buffers.enqueue(tmp);
155 LOGE(
"Not Enough Memory for buffer %d", j);
160 void setReadMaxWait(TickType_t ticks){
161 available_buffers.setReadMaxWait(ticks);
162 filled_buffers.setReadMaxWait(ticks);
165 void setWriteMaxWait(TickType_t ticks){
166 available_buffers.setWriteMaxWait(ticks);
167 filled_buffers.setWriteMaxWait(ticks);
182 return available_buffers.dequeue(result) ? result :
nullptr;
187 return available_buffers.enqueue(buffer);
193 return filled_buffers.dequeue(result) ? result :
nullptr;
198 return filled_buffers.enqueue(buffer);