arduino-audio-tools
Loading...
Searching...
No Matches
SynchronizedNBufferRTOS.h
1#pragma once
2#include "AudioToolsConfig.h"
3#include "QueueRTOS.h"
4
5#define DEFAULT_BUFFER_WAIT 1000
6
7namespace audio_tools {
8
16template <typename T>
18public:
19 SynchronizedNBufferRTOST(int bufferSize, int bufferCount, int writeMaxWait=DEFAULT_BUFFER_WAIT, int readMaxWait=DEFAULT_BUFFER_WAIT) {
20 TRACED();
21 read_max_wait = readMaxWait;
22 write_max_wait = writeMaxWait;
23 resize(bufferSize, bufferCount);
24 }
26 cleanup();
27 }
28
29 bool resize(int bufferSize, int bufferCount) {
30 TRACED();
31 if (buffer_size == bufferSize && buffer_count == bufferCount){
32 return true;
33 }
34
35 max_size = bufferSize * bufferCount;
36 NBuffer<T>::buffer_count = bufferCount;
37 NBuffer<T>::buffer_size = bufferSize;
38
39 cleanup();
40 available_buffers.resize(bufferCount);
41 filled_buffers.resize(bufferCount);
42
43 setReadMaxWait(read_max_wait);
44 setWriteMaxWait(write_max_wait);
45
46 // setup buffers
47 for (int j = 0; j < bufferCount; j++) {
48 BaseBuffer<T> *tmp = new SingleBuffer<T>(bufferSize);
49 if (tmp != nullptr) {
50 available_buffers.enqueue(tmp);
51 } else {
52 LOGE("Not Enough Memory for buffer %d", j);
53 return false;
54 }
55 }
56 return true;
57 }
58
59 void setReadMaxWait(TickType_t ticks){
60 available_buffers.setReadMaxWait(ticks);
61 filled_buffers.setReadMaxWait(ticks);
62 }
63
64 void setWriteMaxWait(TickType_t ticks){
65 available_buffers.setWriteMaxWait(ticks);
66 filled_buffers.setWriteMaxWait(ticks);
67 }
68
69 size_t size() {
70 return max_size;
71 }
72
74 return filled_buffers.size();
75 }
76
78 return available_buffers.size();
79 }
80
81protected:
82 QueueRTOS<BaseBuffer<T>*> available_buffers{0,DEFAULT_BUFFER_WAIT,0};
83 QueueRTOS<BaseBuffer<T>*> filled_buffers{0,DEFAULT_BUFFER_WAIT,0};
84 size_t max_size;
85 size_t read_max_wait, write_max_wait;
86 int buffer_size = 0, buffer_count = 0;
87
89 void cleanup(){
90 TRACED();
91 BaseBuffer<T>* buffer = nullptr;;
92 while (available_buffers.dequeue(buffer)){
93 delete buffer;
94 }
95 while (filled_buffers.dequeue(buffer)){
96 delete buffer;
97 }
98 }
99
100 BaseBuffer<T> *getNextAvailableBuffer() {
101 TRACED();
102 BaseBuffer<T>* result;
103 return available_buffers.dequeue(result) ? result : nullptr;
104 }
105
106 bool addAvailableBuffer(BaseBuffer<T> *buffer) {
107 TRACED();
108 return available_buffers.enqueue(buffer);
109 }
110
111 BaseBuffer<T> *getNextFilledBuffer() {
112 TRACED();
113 BaseBuffer<T>* result;
114 return filled_buffers.dequeue(result) ? result : nullptr;
115 }
116
117 bool addFilledBuffer(BaseBuffer<T> *buffer) {
118 TRACED();
119 return filled_buffers.enqueue(buffer);
120 }
121};
122
126
130
131} // 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:663
FIFO Queue whch is based on the FreeRTOS queue API. The default allocator will allocate the memory fr...
Definition QueueRTOS.h:27
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:17
size_t size()
Provides the total capacity (=buffer size * buffer count)
Definition SynchronizedNBufferRTOS.h:69
void cleanup()
Removes all allocated buffers.
Definition SynchronizedNBufferRTOS.h:89
int bufferCountFilled()
Provides the number of entries that are available to read.
Definition SynchronizedNBufferRTOS.h:73
int bufferCountEmpty()
Provides the number of entries that are available to write.
Definition SynchronizedNBufferRTOS.h:77
bool resize(int bufferSize, int bufferCount)
Resize the buffers by defining a new buffer size and buffer count.
Definition SynchronizedNBufferRTOS.h:29
SynchronizedNBufferRTOST< uint8_t > SynchronizedNBufferRTOS
RTOS synchronized buffer for managing multiple audio buffers.
Definition SynchronizedNBufferRTOS.h:125
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10