arduino-audio-tools
All Classes Namespaces Files Functions Variables Typedefs Enumerations Friends Macros Modules Pages
SynchronizedNBufferRTOS.h
1#pragma once
2#include "AudioToolsConfig.h"
3#include "QueueRTOS.h"
4
5namespace audio_tools {
6
14template <typename T>
16public:
17 SynchronizedNBufferRTOST(int bufferSize, int bufferCount, int writeMaxWait=portMAX_DELAY, int readMaxWait=portMAX_DELAY) {
18 TRACED();
19 read_max_wait = readMaxWait;
20 write_max_wait = writeMaxWait;
21 resize(bufferSize, bufferCount);
22 }
24 cleanup();
25 }
26
27 bool resize(int bufferSize, int bufferCount) {
28 TRACED();
29 if (buffer_size == bufferSize && buffer_count == bufferCount){
30 return true;
31 }
32
33 max_size = bufferSize * bufferCount;
34 NBuffer<T>::buffer_count = bufferCount;
35 NBuffer<T>::buffer_size = bufferSize;
36
37 cleanup();
38 available_buffers.resize(bufferCount);
39 filled_buffers.resize(bufferCount);
40
41 setReadMaxWait(read_max_wait);
42 setWriteMaxWait(write_max_wait);
43
44 // setup buffers
45 for (int j = 0; j < bufferCount; j++) {
46 BaseBuffer<T> *tmp = new SingleBuffer<T>(bufferSize);
47 if (tmp != nullptr) {
48 available_buffers.enqueue(tmp);
49 } else {
50 LOGE("Not Enough Memory for buffer %d", j);
51 return false;
52 }
53 }
54 return true;
55 }
56
57 void setReadMaxWait(TickType_t ticks){
58 available_buffers.setReadMaxWait(ticks);
59 filled_buffers.setReadMaxWait(ticks);
60 }
61
62 void setWriteMaxWait(TickType_t ticks){
63 available_buffers.setWriteMaxWait(ticks);
64 filled_buffers.setWriteMaxWait(ticks);
65 }
66
67 size_t size() {
68 return max_size;
69 }
70
72 return filled_buffers.size();
73 }
74
76 return available_buffers.size();
77 }
78
79protected:
80 QueueRTOS<BaseBuffer<T>*> available_buffers{0,portMAX_DELAY,0};
81 QueueRTOS<BaseBuffer<T>*> filled_buffers{0,portMAX_DELAY,0};
82 size_t max_size;
83 size_t read_max_wait, write_max_wait;
84 int buffer_size = 0, buffer_count = 0;
85
87 void cleanup(){
88 TRACED();
89 BaseBuffer<T>* buffer = nullptr;;
90 while (available_buffers.dequeue(buffer)){
91 delete buffer;
92 }
93 while (filled_buffers.dequeue(buffer)){
94 delete buffer;
95 }
96 }
97
98 BaseBuffer<T> *getNextAvailableBuffer() {
99 TRACED();
100 BaseBuffer<T>* result;
101 return available_buffers.dequeue(result) ? result : nullptr;
102 }
103
104 bool addAvailableBuffer(BaseBuffer<T> *buffer) {
105 TRACED();
106 return available_buffers.enqueue(buffer);
107 }
108
109 BaseBuffer<T> *getNextFilledBuffer() {
110 TRACED();
111 BaseBuffer<T>* result;
112 return filled_buffers.dequeue(result) ? result : nullptr;
113 }
114
115 bool addFilledBuffer(BaseBuffer<T> *buffer) {
116 TRACED();
117 return filled_buffers.enqueue(buffer);
118 }
119};
120
121using SynchronizedNBufferRTOS = SynchronizedNBufferRTOST<uint8_t>;
122using SynchronizedNBuffer = SynchronizedNBufferRTOS;
123
124} // namespace audio_tools
Shared functionality of all buffers.
Definition Buffers.h:22
A lock free N buffer. If count=2 we create a DoubleBuffer, if count=3 a TripleBuffer etc.
Definition Buffers.h:648
FIFO Queue whch is based on the FreeRTOS queue API. The default allocator will allocate the memory fr...
Definition QueueRTOS.h:25
A simple Buffer implementation which just uses a (dynamically sized) array.
Definition Buffers.h:172
NBuffer which uses some RTOS queues to manage the available and filled buffers.
Definition SynchronizedNBufferRTOS.h:15
size_t size()
Provides the total capacity (=buffer size * buffer count)
Definition SynchronizedNBufferRTOS.h:67
void cleanup()
Removes all allocated buffers.
Definition SynchronizedNBufferRTOS.h:87
int bufferCountFilled()
Provides the number of entries that are available to read.
Definition SynchronizedNBufferRTOS.h:71
int bufferCountEmpty()
Provides the number of entries that are available to write.
Definition SynchronizedNBufferRTOS.h:75
bool resize(int bufferSize, int bufferCount)
Resize the buffers by defining a new buffer size and buffer count.
Definition SynchronizedNBufferRTOS.h:27
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10