3#ifndef ARDUINO_ARCH_RP2040
4# error "Unsupported architecture"
7#include "AudioToolsConfig.h"
8#include "AudioTools/CoreAudio/AudioLogger.h"
9#include "AudioTools/CoreAudio/Buffers.h"
35 buffer_size_bytes =
sizeof(T);
36 buffer_size_req_bytes = buffer_size_bytes * bufferCount;
40 buffer_size = bufferSize;
41 buffer_size_bytes = bufferSize *
sizeof(T);
42 buffer_size_req_bytes = buffer_size_bytes * bufferCount;
49 int req_bytes = size *
sizeof(T);
50 if (buffer_size_alloc_bytes < req_bytes) {
51 LOGI(
"resize %d -> %d", buffer_size_alloc_bytes /
sizeof(T), size);
52 assert(buffer_size_bytes > 0);
53 write_buffer.resize(buffer_size);
54 read_buffer.resize(buffer_size * 2);
56 if (req_bytes > buffer_size_alloc_bytes) {
58 if (buffer_size_alloc_bytes > 0) {
62 int count = req_bytes / buffer_size_bytes;
63 LOGI(
"queue_init(size:%d, count:%d)", buffer_size_bytes, count);
64 queue_init(&queue, buffer_size_bytes, count);
65 buffer_size_alloc_bytes = req_bytes;
78 bool peek(T &result)
override {
79 LOGE(
"peek not implemented");
78 bool peek(T &result)
override {
…}
85 LOGD(
"readArray: %d", len);
87 if (buffer_size_alloc_bytes == 0)
return 0;
90 while (is_blocking_read && read_buffer.available() +
available() < len)
94 while (read_buffer.availableForWrite() >= buffer_size) {
95 LOGD(
"reading %d %d ", buffer_size, read_buffer.availableForWrite());
97 if (queue_try_remove(&queue, tmp)){
98 LOGD(
"queue_try_remove -> success");
99 read_buffer.writeArray(tmp, buffer_size);
101 LOGD(
"queue_try_remove -> failed");
105 LOGD(
"read_buffer.available: %d, availableForWrite: %d ", read_buffer.available(), read_buffer.availableForWrite());
106 int result = read_buffer.readArray(data, len);
107 LOGD(
"=> readArray: %d -> %d", len, result);
112 LOGD(
"writeArray: %d", len);
115 resize(buffer_size_req_bytes /
sizeof(T));
117 if (is_blocking_write) {
118 result = writeBlocking(data, len);
120 result = writeNonBlocking(data, len);
128 if (buffer_size_alloc_bytes == 0)
return false;
129 return queue_is_full(&queue);
133 if (buffer_size_alloc_bytes == 0)
return true;
134 return queue_is_empty(&queue);
143 buffer_size_alloc_bytes = 0;
148 if (buffer_size_alloc_bytes == 0)
return 0;
149 return (queue_get_level(&queue) * buffer_size);
154 if (buffer_size_alloc_bytes == 0)
return size();
159 LOGE(
"address() not implemented");
163 size_t size() {
return buffer_size_alloc_bytes /
sizeof(T); }
167 is_blocking_write = flag;
172 is_blocking_read = flag;
178 int buffer_size_alloc_bytes = 0;
179 int buffer_size_req_bytes = 0;
180 int buffer_size_bytes = 0;
184 bool is_blocking_write =
true;
185 bool is_blocking_read =
false;
187 int writeBlocking(
const T data[],
int len) {
188 LOGD(
"writeArray: %d", len);
190 if (len > buffer_size_bytes){
191 LOGE(
"write %d too big for buffer_size: %d", len, buffer_size_bytes);
196 for (
int j = 0; j < len; j++) {
197 write_buffer.write(data[j]);
198 if (write_buffer.isFull()) {
199 LOGD(
"queue_add_blocking");
200 queue_add_blocking(&queue, write_buffer.data());
201 write_buffer.reset();
207 int writeNonBlocking(
const T data[],
int len) {
208 if (len != buffer_size_bytes){
209 LOGE(
"write %d must be buffer_size: %d", len, buffer_size_bytes);
213 if (queue_try_add(&queue, write_buffer.data())){
221using BufferRP2040 = BufferRP2040T<uint8_t>;