Skip to content

Commit 13bb1ca

Browse files
committed
New QueueFromVector class
1 parent 7434afc commit 13bb1ca

File tree

5 files changed

+134
-57
lines changed

5 files changed

+134
-57
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#include "AudioTools.h"
2+
3+
//Queue<int> q;
4+
QueueFromVector<int> q{0,10};
5+
6+
void setup(){
7+
Serial.begin(115200);
8+
assert(q.empty());
9+
10+
for (int j=0;j<10;j++){
11+
q.enqueue(j);
12+
assert(!q.empty());
13+
assert(q.size()==j+1);
14+
}
15+
int number;
16+
for (int j=0;j<10;j++){
17+
q.dequeue(number);
18+
assert(number == j);
19+
assert(q.size()==10-(j+1));
20+
}
21+
assert(q.empty());
22+
}
23+
24+
void loop(){}

src/AudioBasic/Collections.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,6 @@
99
#include "AudioBasic/Collections/List.h"
1010
#include "AudioBasic/Collections/Stack.h"
1111
#include "AudioBasic/Collections/Queue.h"
12+
#include "AudioBasic/Collections/QueueFromVector.h"
1213
#include "AudioBasic/Collections/BitVector.h"
1314
#include "AudioBasic/Collections/Slice.h"
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
#pragma once
2+
#include "AudioBasic/Collections/List.h"
3+
4+
namespace audio_tools {
5+
6+
/**
7+
* @brief FIFO Queue which is based on a Vector
8+
* @ingroup collections
9+
* @author Phil Schatzmann
10+
* @copyright GPLv3
11+
* @tparam T
12+
*/
13+
template <class T>
14+
class QueueFromVector {
15+
public:
16+
QueueFromVector(T empty, size_t size) {
17+
null_value = empty;
18+
resize(size);
19+
};
20+
21+
bool enqueue(T& data){
22+
if (is_full())
23+
return false;
24+
vector[_size++] = data;
25+
return true;
26+
}
27+
28+
bool peek(T& data){
29+
if (_size <= 0 ) {
30+
data = null_value;
31+
return false;
32+
}
33+
data = vector[0];
34+
return true;
35+
}
36+
37+
bool dequeue(T& data){
38+
if (_size <= 0 ) {
39+
data = null_value;
40+
return false;
41+
}
42+
data = vector[0];
43+
memmove(&vector[0], &vector[1], _size*sizeof(T));
44+
vector[_size--] = null_value;
45+
return true;
46+
}
47+
48+
size_t size() {
49+
return _size;
50+
}
51+
52+
bool resize(size_t size) {
53+
if (!vector.resize(size)){
54+
return false;
55+
}
56+
_size = size;
57+
return clear();
58+
}
59+
60+
bool clear() {
61+
for (int j=0;j<_size;j++){
62+
vector[j] = null_value;
63+
}
64+
_size = 0;
65+
return true;
66+
}
67+
68+
bool empty() {
69+
return _size == 0;
70+
}
71+
72+
bool is_full() {
73+
return _size >= vector.size();
74+
}
75+
76+
void setAllocator(Allocator &allocator){
77+
vector.setAllocator(allocator);
78+
}
79+
80+
protected:
81+
Vector<T> vector;
82+
size_t _size = 0;
83+
int empty_pos = 0;
84+
T null_value;
85+
};
86+
87+
}

src/AudioTools/Buffers.h

Lines changed: 14 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -690,39 +690,26 @@ class NBuffer : public BaseBuffer<T> {
690690
return *actual_read_buffer;
691691
}
692692

693-
int bufferCountFilled() {
694-
int result = 0;
695-
for (int j = 0; j < buffer_count; j++) {
696-
if (filled_buffers[j] != nullptr) {
697-
result++;
698-
}
699-
}
700-
return result;
693+
virtual int bufferCountFilled() {
694+
return filled_buffers.size();
701695
}
702696

703-
int bufferCountEmpty() {
704-
int result = 0;
705-
for (int j = 0; j < buffer_count; j++) {
706-
if (avaliable_buffers[j] != nullptr) {
707-
result++;
708-
}
709-
}
710-
return result;
697+
virtual int bufferCountEmpty() {
698+
return available_buffers.size();
711699
}
712700

713-
void resize(int size, int count) {
701+
virtual void resize(int size, int count) {
714702
if (buffer_size==size && buffer_count == count)
715703
return;
716704
freeMemory();
717705
filled_buffers.resize(count);
718-
avaliable_buffers.resize(count);
706+
available_buffers.resize(count);
719707

720-
write_buffer_count = 0;
721708
buffer_count = count;
722709
buffer_size = size;
723710
for (int j = 0; j < count; j++) {
724-
avaliable_buffers[j] = new SingleBuffer<T>(size);
725-
if (avaliable_buffers[j] == nullptr) {
711+
available_buffers[j] = new SingleBuffer<T>(size);
712+
if (available_buffers[j] == nullptr) {
726713
LOGE("Not Enough Memory for buffer %d", j);
727714
}
728715
}
@@ -733,11 +720,10 @@ class NBuffer : public BaseBuffer<T> {
733720
protected:
734721
int buffer_size = 0;
735722
uint16_t buffer_count = 0;
736-
uint16_t write_buffer_count = 0;
737723
BaseBuffer<T> *actual_read_buffer = nullptr;
738724
BaseBuffer<T> *actual_write_buffer = nullptr;
739-
Vector<BaseBuffer<T> *> avaliable_buffers;
740-
Vector<BaseBuffer<T> *> filled_buffers;
725+
QueueFromVector<BaseBuffer<T> *> available_buffers{nullptr,0};
726+
QueueFromVector<BaseBuffer<T> *> filled_buffers{nullptr,0};
741727
unsigned long start_time = 0;
742728
unsigned long sample_count = 0;
743729

@@ -774,50 +760,22 @@ class NBuffer : public BaseBuffer<T> {
774760

775761
virtual BaseBuffer<T> *getNextAvailableBuffer() {
776762
BaseBuffer<T> *result = nullptr;
777-
for (int j = 0; j < buffer_count; j++) {
778-
result = avaliable_buffers[j];
779-
if (result != nullptr) {
780-
avaliable_buffers[j] = nullptr;
781-
break;
782-
}
783-
}
763+
available_buffers.dequeue(result);
784764
return result;
785765
}
786766

787767
virtual bool addAvailableBuffer(BaseBuffer<T> *buffer) {
788-
bool result = false;
789-
for (int j = 0; j < buffer_count; j++) {
790-
if (avaliable_buffers[j] == nullptr) {
791-
avaliable_buffers[j] = buffer;
792-
result = true;
793-
break;
794-
}
795-
}
796-
return result;
768+
return available_buffers.enqueue(buffer);
797769
}
798770

799771
virtual BaseBuffer<T> *getNextFilledBuffer() {
800772
BaseBuffer<T> *result = nullptr;
801-
if (write_buffer_count > 0) {
802-
// get oldest entry
803-
result = filled_buffers[0];
804-
// move data by 1 entry to the left
805-
for (int j = 0; j < write_buffer_count - 1; j++)
806-
filled_buffers[j] = filled_buffers[j + 1];
807-
// clear last enty
808-
filled_buffers[write_buffer_count - 1] = nullptr;
809-
write_buffer_count--;
810-
}
773+
filled_buffers.dequeue(result);
811774
return result;
812775
}
813776

814777
virtual bool addFilledBuffer(BaseBuffer<T> *buffer) {
815-
bool result = false;
816-
if (write_buffer_count < buffer_count) {
817-
filled_buffers[write_buffer_count++] = buffer;
818-
result = true;
819-
}
820-
return result;
778+
return filled_buffers.enqueue(buffer);
821779
}
822780
};
823781

src/Concurrency/SynchronizedBuffers.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,6 @@ class SynchronizedNBuffer : public NBuffer<T> {
160160
setWriteMaxWait(write_max_wait);
161161

162162
// setup buffers
163-
NBuffer<T>::write_buffer_count = 0;
164163
for (int j = 0; j < bufferCount; j++) {
165164
BaseBuffer<T> *tmp = new SingleBuffer<T>(bufferSize);
166165
if (tmp != nullptr) {
@@ -185,6 +184,14 @@ class SynchronizedNBuffer : public NBuffer<T> {
185184
return max_size;
186185
}
187186

187+
int bufferCountFilled() {
188+
return filled_buffers.size();
189+
}
190+
191+
int bufferCountEmpty() {
192+
return available_buffers.size();
193+
}
194+
188195
protected:
189196
QueueRTOS<BaseBuffer<T>*> available_buffers{0,portMAX_DELAY,0};
190197
QueueRTOS<BaseBuffer<T>*> filled_buffers{0,portMAX_DELAY,0};

0 commit comments

Comments
 (0)