Skip to content

Commit 726210a

Browse files
committed
Corrections for Buffer
1 parent c5d7d68 commit 726210a

File tree

6 files changed

+103
-39
lines changed

6 files changed

+103
-39
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#include "AudioTools.h"
2+
3+
void test(BaseBuffer<int16_t> &b, const char* title){
4+
Serial.println(title);
5+
assert(b.isEmpty());
6+
for (int j=0;j<200;j++){
7+
assert(b.write(j));
8+
}
9+
assert(b.isFull());
10+
for (int j=0;j<200;j++){
11+
int16_t v = b.read();
12+
assert(v==j);
13+
}
14+
assert(b.isEmpty());
15+
int16_t array[200];
16+
for (int j=0;j<200;j++){
17+
array[j] = j;
18+
}
19+
assert(b.writeArray(array, 200)==200);
20+
assert(b.readArray(array,200)==200);
21+
for (int j=0;j<200;j++){
22+
assert(array[j]==j);
23+
}
24+
25+
Serial.println("Test OK");
26+
}
27+
28+
void setup(){
29+
SingleBuffer<int16_t> b1(200);
30+
RingBuffer<int16_t> b2(200);
31+
NBuffer<int16_t> b3(50,4);
32+
33+
test(b1,"SingleBuffer");
34+
test(b2,"RingBuffer");
35+
test(b3,"NBuffer");
36+
37+
Serial.println("Tests OK");
38+
}
39+
40+
void loop(){}

examples/tests/basic/test-queue/test-queue.ino

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@
22
#include "Concurrency/QueueLockFree.h"
33

44
// select the queue implementation:
5-
//Queue<int> q;
6-
//QueueFromVector<int> q{10, 0};
7-
QueueLockFree<int> q(10);
5+
Queue<int> q1;
6+
QueueFromVector<int> q2{10, 0};
7+
QueueLockFree<int> q3(10);
88

9-
void setup(){
10-
Serial.begin(115200);
9+
template <typename T>
10+
void test(T &q, const char* cls){
11+
Serial.println(cls);
1112
assert(q.empty());
1213

1314
for (int j=0;j<10;j++){
@@ -22,6 +23,15 @@ void setup(){
2223
assert(q.size()==10-(j+1));
2324
}
2425
assert(q.empty());
26+
Serial.println("-> ok");
27+
}
28+
29+
void setup() {
30+
Serial.begin(115200);
31+
test<Queue<int>>(q1,"Queue");
32+
test<QueueFromVector<int>>(q2,"QueueFromVector");
33+
test<QueueLockFree<int>>(q3,"QueueLockFree");
34+
Serial.println("all tests passed");
2535
}
2636

2737
void loop(){}

src/AudioBasic/Collections/QueueFromVector.h

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,56 +21,57 @@ class QueueFromVector {
2121
bool enqueue(T& data){
2222
if (is_full())
2323
return false;
24-
vector[_size++] = data;
24+
vector[_end_pos++] = data;
2525
return true;
2626
}
2727

2828
bool peek(T& data){
29-
if (_size <= 0 ) {
29+
if (_end_pos <= 0 ) {
3030
data = null_value;
31+
_end_pos = 0;
3132
return false;
3233
}
3334
data = vector[0];
3435
return true;
3536
}
3637

3738
bool dequeue(T& data){
38-
if (_size <= 0 ) {
39+
if (_end_pos <= 0 ) {
3940
data = null_value;
41+
_end_pos = 0;
4042
return false;
4143
}
4244
data = vector[0];
43-
memmove(&vector[0], &vector[1], _size*sizeof(T));
44-
vector[_size--] = null_value;
45+
memmove(&vector[0], &vector[1], (_end_pos-1)*sizeof(T));
46+
vector[_end_pos--] = null_value;
4547
return true;
4648
}
4749

4850
size_t size() {
49-
return _size;
51+
return _end_pos < 0 ? 0 : _end_pos;
5052
}
5153

5254
bool resize(size_t size) {
5355
if (!vector.resize(size)){
5456
return false;
5557
}
56-
_size = size;
5758
return clear();
5859
}
5960

6061
bool clear() {
61-
for (int j=0;j<_size;j++){
62+
for (int j=0;j<vector.size();j++){
6263
vector[j] = null_value;
6364
}
64-
_size = 0;
65+
_end_pos = 0;
6566
return true;
6667
}
6768

6869
bool empty() {
69-
return _size == 0;
70+
return _end_pos == 0;
7071
}
7172

7273
bool is_full() {
73-
return _size >= vector.size();
74+
return _end_pos >= vector.size();
7475
}
7576

7677
size_t capacity() { return vector.capacity(); }
@@ -81,7 +82,7 @@ class QueueFromVector {
8182

8283
protected:
8384
Vector<T> vector;
84-
size_t _size = 0;
85+
int32_t _end_pos = 0;
8586
int empty_pos = 0;
8687
T null_value;
8788
};

src/AudioTools/Buffers.h

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -167,8 +167,7 @@ class SingleBuffer : public BaseBuffer<T> {
167167
* @param size
168168
*/
169169
SingleBuffer(int size) {
170-
this->max_size = size;
171-
buffer.resize(max_size);
170+
buffer.resize(size);
172171
reset();
173172
}
174173

@@ -187,7 +186,7 @@ class SingleBuffer : public BaseBuffer<T> {
187186

188187
bool write(T sample) override {
189188
bool result = false;
190-
if (current_write_pos < max_size) {
189+
if (current_write_pos < buffer.size()) {
191190
buffer[current_write_pos++] = sample;
192191
result = true;
193192
}
@@ -215,7 +214,7 @@ class SingleBuffer : public BaseBuffer<T> {
215214
return max(result, 0);
216215
}
217216

218-
int availableForWrite() override { return max_size - current_write_pos; }
217+
int availableForWrite() override { return buffer.size() - current_write_pos; }
219218

220219
bool isFull() override { return availableForWrite() <= 0; }
221220

@@ -256,20 +255,19 @@ class SingleBuffer : public BaseBuffer<T> {
256255
/// If we load values directly into the address we need to set the avialeble
257256
/// size
258257
size_t setAvailable(size_t available_size) {
259-
size_t result = min(available_size, (size_t) max_size);
258+
size_t result = min(available_size, (size_t) buffer.size());
260259
current_read_pos = 0;
261260
current_write_pos = result;
262261
return result;
263262
}
264263

265264

266-
size_t size() { return max_size; }
265+
size_t size() { return buffer.size(); }
267266

268267
void resize(int size) {
269268
if (buffer.size() != size) {
270269
TRACED();
271270
buffer.resize(size);
272-
max_size = size;
273271
}
274272
}
275273

@@ -279,7 +277,6 @@ class SingleBuffer : public BaseBuffer<T> {
279277
}
280278

281279
protected:
282-
int max_size = 0;
283280
int current_read_pos = 0;
284281
int current_write_pos = 0;
285282
bool owns_buffer = true;
@@ -607,7 +604,8 @@ class NBuffer : public BaseBuffer<T> {
607604
if (start_time == 0l) {
608605
start_time = millis();
609606
}
610-
sample_count++;
607+
if (result)
608+
sample_count++;
611609

612610
return result;
613611
}
@@ -624,8 +622,7 @@ class NBuffer : public BaseBuffer<T> {
624622
if (result == 0) {
625623
// make current read buffer available again
626624
resetCurrent();
627-
result =
628-
actual_read_buffer == nullptr ? 0 : actual_read_buffer->available();
625+
result = (actual_read_buffer == nullptr) ? 0 : actual_read_buffer->available();
629626
}
630627
return result;
631628
}
@@ -702,13 +699,16 @@ class NBuffer : public BaseBuffer<T> {
702699
if (buffer_size==size && buffer_count == count)
703700
return;
704701
freeMemory();
705-
filled_buffers.resize(count);
706-
available_buffers.resize(count);
702+
//filled_buffers.resize(count);
703+
//available_buffers.resize(count);
704+
filled_buffers.clear();
705+
available_buffers.clear();
707706

708707
buffer_count = count;
709708
buffer_size = size;
710709
for (int j = 0; j < count; j++) {
711710
BaseBuffer<T>* buffer = new SingleBuffer<T>(size);
711+
LOGD("new buffer %p", buffer);
712712
available_buffers.enqueue(buffer);
713713
}
714714
}
@@ -720,28 +720,38 @@ class NBuffer : public BaseBuffer<T> {
720720
uint16_t buffer_count = 0;
721721
BaseBuffer<T> *actual_read_buffer = nullptr;
722722
BaseBuffer<T> *actual_write_buffer = nullptr;
723-
QueueFromVector<BaseBuffer<T> *> available_buffers{0, nullptr};
724-
QueueFromVector<BaseBuffer<T> *> filled_buffers{0, nullptr};
723+
//QueueFromVector<BaseBuffer<T> *> available_buffers{0, nullptr};
724+
//QueueFromVector<BaseBuffer<T> *> filled_buffers{0, nullptr};
725+
Queue<BaseBuffer<T> *> available_buffers;
726+
Queue<BaseBuffer<T> *> filled_buffers;
725727
unsigned long start_time = 0;
726728
unsigned long sample_count = 0;
727729

728730
// empty constructor only allowed by subclass
729731
NBuffer() = default;
730732

731733
void freeMemory() {
732-
delete actual_write_buffer;
733-
actual_write_buffer = nullptr;
734-
delete actual_read_buffer;
735-
actual_read_buffer = nullptr;
736-
734+
if (actual_write_buffer){
735+
LOGD("deleting %p", actual_write_buffer);
736+
delete actual_write_buffer;
737+
actual_write_buffer = nullptr;
738+
}
739+
if (actual_read_buffer){
740+
LOGD("deleting %p", actual_read_buffer);
741+
delete actual_read_buffer;
742+
actual_read_buffer = nullptr;
743+
}
744+
737745
BaseBuffer<T> *ptr = getNextAvailableBuffer();
738746
while (ptr != nullptr) {
747+
LOGD("deleting %p", ptr);
739748
delete ptr;
740749
ptr = getNextAvailableBuffer();
741750
}
742751

743752
ptr = getNextFilledBuffer();
744753
while (ptr != nullptr) {
754+
LOGD("deleting %p", ptr);
745755
delete ptr;
746756
ptr = getNextFilledBuffer();
747757
}
@@ -757,6 +767,7 @@ class NBuffer : public BaseBuffer<T> {
757767
}
758768

759769
virtual BaseBuffer<T> *getNextAvailableBuffer() {
770+
if (available_buffers.empty()) return nullptr;
760771
BaseBuffer<T> *result = nullptr;
761772
available_buffers.dequeue(result);
762773
return result;
@@ -767,6 +778,7 @@ class NBuffer : public BaseBuffer<T> {
767778
}
768779

769780
virtual BaseBuffer<T> *getNextFilledBuffer() {
781+
if (filled_buffers.empty()) return nullptr;
770782
BaseBuffer<T> *result = nullptr;
771783
filled_buffers.dequeue(result);
772784
return result;

src/Concurrency/QueueLockFree.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class QueueLockFree {
2222
for (size_t i = head_pos; i != tail_pos; ++i)
2323
(&p_node[i & capacity_mask].data)->~T();
2424

25-
delete[] (char*)p_node;
25+
//delete[] (char*)p_node;
2626
}
2727

2828
void setAllocator(Allocator& allocator) { vector.setAllocator(allocator); }
@@ -101,7 +101,7 @@ class QueueLockFree {
101101
std::atomic<size_t> head;
102102
};
103103

104-
Node* p_node;
104+
Node* p_node = nullptr;
105105
size_t capacity_mask;
106106
size_t capacity_value;
107107
std::atomic<size_t> tail_pos;

src/Concurrency/SynchronizedBuffers.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,7 @@ class SynchronizedNBuffer : public NBuffer<T> {
201201

202202
/// Removes all allocated buffers
203203
void cleanup(){
204+
TRACED();
204205
BaseBuffer<T>* buffer = nullptr;;
205206
while (available_buffers.dequeue(buffer)){
206207
delete buffer;

0 commit comments

Comments
 (0)