arduino-audio-tools
All Classes Namespaces Files Functions Variables Typedefs Enumerations Friends 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 void resize(int bufferSize, int bufferCount) {
28 TRACED();
29 if (buffer_size == bufferSize && buffer_count == bufferCount){
30 return;
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 }
52 }
53 }
54
55 void setReadMaxWait(TickType_t ticks){
56 available_buffers.setReadMaxWait(ticks);
57 filled_buffers.setReadMaxWait(ticks);
58 }
59
60 void setWriteMaxWait(TickType_t ticks){
61 available_buffers.setWriteMaxWait(ticks);
62 filled_buffers.setWriteMaxWait(ticks);
63 }
64
65 size_t size() {
66 return max_size;
67 }
68
69 int bufferCountFilled() {
70 return filled_buffers.size();
71 }
72
73 int bufferCountEmpty() {
74 return available_buffers.size();
75 }
76
77protected:
78 QueueRTOS<BaseBuffer<T>*> available_buffers{0,portMAX_DELAY,0};
79 QueueRTOS<BaseBuffer<T>*> filled_buffers{0,portMAX_DELAY,0};
80 size_t max_size;
81 size_t read_max_wait, write_max_wait;
82 int buffer_size = 0, buffer_count = 0;
83
85 void cleanup(){
86 TRACED();
87 BaseBuffer<T>* buffer = nullptr;;
88 while (available_buffers.dequeue(buffer)){
89 delete buffer;
90 }
91 while (filled_buffers.dequeue(buffer)){
92 delete buffer;
93 }
94 }
95
96 BaseBuffer<T> *getNextAvailableBuffer() {
97 TRACED();
98 BaseBuffer<T>* result;
99 return available_buffers.dequeue(result) ? result : nullptr;
100 }
101
102 bool addAvailableBuffer(BaseBuffer<T> *buffer) {
103 TRACED();
104 return available_buffers.enqueue(buffer);
105 }
106
107 BaseBuffer<T> *getNextFilledBuffer() {
108 TRACED();
109 BaseBuffer<T>* result;
110 return filled_buffers.dequeue(result) ? result : nullptr;
111 }
112
113 bool addFilledBuffer(BaseBuffer<T> *buffer) {
114 TRACED();
115 return filled_buffers.enqueue(buffer);
116 }
117};
118
119using SynchronizedNBufferRTOS = SynchronizedNBufferRTOST<uint8_t>;
120using SynchronizedNBuffer = SynchronizedNBufferRTOS;
121
122} // namespace audio_tools
Shared functionality of all buffers.
Definition Buffers.h:26
A lock free N buffer. If count=2 we create a DoubleBuffer, if count=3 a TripleBuffer etc.
Definition Buffers.h:616
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:175
NBuffer which uses some RTOS queues to manage the available and filled buffers.
Definition SynchronizedNBufferRTOS.h:15
void cleanup()
Removes all allocated buffers.
Definition SynchronizedNBufferRTOS.h:85
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10