arduino-audio-tools
Loading...
Searching...
No Matches
SynchronizedNBufferRTOS.h
Go to the documentation of this file.
1#pragma once
2#include "AudioToolsConfig.h"
3#include "QueueRTOS.h"
4
5#define DEFAULT_BUFFER_WAIT 1000
6
7namespace audio_tools {
8
25template <typename T>
27 public:
36
38
39 bool resize(size_t bufferSize, int bufferCount) {
40 TRACED();
41 if (NBuffer<T>::buffer_size == (int)bufferSize &&
42 NBuffer<T>::buffer_count == bufferCount) {
43 return true;
44 }
45 LOGW("resize: bufferSize=%d, bufferCount=%d", (int)bufferSize, bufferCount);
46
47 // Update parent's tracking fields
48 NBuffer<T>::buffer_count = bufferCount;
49 NBuffer<T>::buffer_size = bufferSize;
50
51 // Clear held pointers so we don't dangle after cleanup
54
55 // Free old blocks and resize the RTOS queues
56 cleanup();
57 available_queue_.resize(bufferCount);
58 filled_queue_.resize(bufferCount);
60
61 // Allocate new blocks into the available queue
62 for (int j = 0; j < bufferCount; j++) {
63 BaseBuffer<T>* tmp = new SingleBuffer<T>(bufferSize);
64 if (tmp == nullptr) {
65 LOGE("Not enough memory for buffer %d", j);
66 return false;
67 }
68 available_queue_.enqueue(tmp);
69 }
70 return true;
71 }
72
78
84
86
87 int bufferCountFilled() { return filled_queue_.size(); }
88
89 int bufferCountEmpty() { return available_queue_.size(); }
90
91 protected:
96
101 available_queue_.setReadMaxWait(write_max_wait_); // writer gets free block
102 available_queue_.setWriteMaxWait(read_max_wait_); // reader returns drained block
103 filled_queue_.setWriteMaxWait(write_max_wait_); // writer submits filled block
104 filled_queue_.setReadMaxWait(read_max_wait_); // reader gets filled block
105 }
106
107 void cleanup() {
108 TRACED();
109 BaseBuffer<T>* buffer = nullptr;
110 while (available_queue_.dequeue(buffer)) {
111 delete buffer;
112 }
113 while (filled_queue_.dequeue(buffer)) {
114 delete buffer;
115 }
116 }
117
118 // ── Virtual overrides that route NBuffer's block management through
119 // FreeRTOS queues instead of the non-thread-safe QueueFromVector. ────
120
122 TRACED();
123 BaseBuffer<T>* result = nullptr;
124 return available_queue_.dequeue(result) ? result : nullptr;
125 }
126
127 bool addAvailableBuffer(BaseBuffer<T>* buffer) override {
128 TRACED();
129 return available_queue_.enqueue(buffer);
130 }
131
133 TRACED();
134 BaseBuffer<T>* result = nullptr;
135 return filled_queue_.dequeue(result) ? result : nullptr;
136 }
137
138 bool addFilledBuffer(BaseBuffer<T>* buffer) override {
139 TRACED();
140 return filled_queue_.enqueue(buffer);
141 }
142};
143
147
151
152} // namespace audio_tools
#define LOGW(...)
Definition AudioLoggerIDF.h:29
#define TRACED()
Definition AudioLoggerIDF.h:31
#define LOGE(...)
Definition AudioLoggerIDF.h:30
uint32_t TickType_t
Definition QueueZephyr.h:11
#define DEFAULT_BUFFER_WAIT
Definition SynchronizedNBufferRTOS.h:5
Shared functionality of all buffers.
Definition Buffers.h:23
A lock free N buffer. If count=2 we create a DoubleBuffer, if count=3 a TripleBuffer etc.
Definition Buffers.h:675
FIFO Queue whch is based on the FreeRTOS queue API. The default allocator will allocate the memory fr...
Definition QueueRTOS.h:30
A simple Buffer implementation which just uses a (dynamically sized) array.
Definition Buffers.h:184
NBuffer which uses FreeRTOS queues to manage the available and filled buffers, making it safe for cro...
Definition SynchronizedNBufferRTOS.h:26
bool addFilledBuffer(BaseBuffer< T > *buffer) override
Definition SynchronizedNBufferRTOS.h:138
size_t size()
Provides the total capacity (=buffer size * buffer count)
Definition SynchronizedNBufferRTOS.h:85
bool addAvailableBuffer(BaseBuffer< T > *buffer) override
Definition SynchronizedNBufferRTOS.h:127
void applyWaitTimes()
Definition SynchronizedNBufferRTOS.h:100
TickType_t write_max_wait_
Definition SynchronizedNBufferRTOS.h:94
void cleanup()
Definition SynchronizedNBufferRTOS.h:107
int bufferCountFilled()
Provides the number of entries that are available to read.
Definition SynchronizedNBufferRTOS.h:87
void setWriteMaxWait(TickType_t ticks)
Set how long the writer waits for a free block (0 = non-blocking)
Definition SynchronizedNBufferRTOS.h:74
BaseBuffer< T > * getNextAvailableBuffer() override
Definition SynchronizedNBufferRTOS.h:121
QueueRTOS< BaseBuffer< T > * > filled_queue_
Definition SynchronizedNBufferRTOS.h:93
int bufferCountEmpty()
Provides the number of entries that are available to write.
Definition SynchronizedNBufferRTOS.h:89
TickType_t read_max_wait_
Definition SynchronizedNBufferRTOS.h:95
void setReadMaxWait(TickType_t ticks)
Set how long the reader waits for a filled block (0 = non-blocking)
Definition SynchronizedNBufferRTOS.h:80
BaseBuffer< T > * getNextFilledBuffer() override
Definition SynchronizedNBufferRTOS.h:132
SynchronizedNBufferRTOST(int bufferSize, int bufferCount, TickType_t writeMaxWait=1000, TickType_t readMaxWait=1000)
Definition SynchronizedNBufferRTOS.h:28
bool resize(size_t bufferSize, int bufferCount)
Resize the buffers by defining a new buffer size and buffer count.
Definition SynchronizedNBufferRTOS.h:39
QueueRTOS< BaseBuffer< T > * > available_queue_
Definition SynchronizedNBufferRTOS.h:92
~SynchronizedNBufferRTOST()
Definition SynchronizedNBufferRTOS.h:37
SynchronizedNBufferRTOST< uint8_t > SynchronizedNBufferRTOS
RTOS synchronized buffer for managing multiple audio buffers.
Definition SynchronizedNBufferRTOS.h:146
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10
size_t writeData(Print *p_out, T *data, int samples, int maxSamples=512)
Definition AudioTypes.h:508