arduino-audio-tools
Loading...
Searching...
No Matches
BaseStream.h
Go to the documentation of this file.
1#pragma once
5
6#ifdef ARDUINO
7#include "Stream.h"
8#endif
9
10#ifdef USE_STREAM_WRITE_OVERRIDE
11#define STREAM_WRITE_OVERRIDE override
12#else
13#define STREAM_WRITE_OVERRIDE
14#endif
15
16#ifdef USE_STREAM_READ_OVERRIDE
17#define STREAM_READ_OVERRIDE override
18#else
19#define STREAM_READ_OVERRIDE
20#endif
21
22#ifdef USE_STREAM_READCHAR_OVERRIDE
23#define STREAM_READCHAR_OVERRIDE override
24#else
25#define STREAM_READCHAR_OVERRIDE
26#endif
27
28namespace audio_tools {
29
36class BaseStream : public Stream {
37 public:
38 BaseStream() = default;
39 virtual ~BaseStream() = default;
40 BaseStream(BaseStream &) = default;
42
43 virtual bool begin(){return true;}
44 virtual void end(){}
45
46 virtual size_t readBytes(uint8_t *data,
47 size_t len) STREAM_READ_OVERRIDE = 0;
48 virtual size_t write(const uint8_t *data, size_t len) override = 0;
49
50 virtual size_t write(uint8_t ch) override {
52 if (tmp_out.isFull()) {
53 flush();
54 }
55 return tmp_out.write(ch);
56 }
57
58 virtual int available() override { return DEFAULT_BUFFER_SIZE; };
59
60 virtual int availableForWrite() override { return DEFAULT_BUFFER_SIZE; }
61
62 virtual void flush() override {
63 if (tmp_out.available() > 0) {
65 }
66 }
67
68// Methods which should be suppressed in the documentation
69#ifndef DOXYGEN
70
71 virtual size_t readBytes(char *data, size_t len) STREAM_READCHAR_OVERRIDE {
72 return readBytes((uint8_t *)data, len);
73 }
74
75 virtual int read() override {
77 // if it is empty we need to return an int -1
78 if (tmp_in.isEmpty()) return -1;
79 uint8_t result = 0;
80 if (!tmp_in.read(result)) return -1;
81 return result;
82 }
83
84 virtual int peek() override {
86 // if it is empty we need to return an int -1
87 if (tmp_in.isEmpty()) return -1;
88 uint8_t result = 0;
89 if (!tmp_in.peek(result)) return -1;
90 return result;
91 }
92
93#endif
94
95 void setWriteBufferSize(int size) { write_buffer_size = size;}
96
97 protected:
101
105 if (tmp_in.isEmpty()) {
106 TRACED();
107 const int len = tmp_in.size();
108 uint8_t bytes[len];
109 int len_eff = readBytes(bytes, len);
110 // LOGD("tmp_in available: %d / size: %d / to be written %d",
111 // tmp_in.available(), tmp_in.size(), len_eff);
113 }
114 }
115};
116
124 public:
125 AudioStream() = default;
126 virtual ~AudioStream() = default;
129
130 // Call from subclass or overwrite to do something useful
131 virtual void setAudioInfo(AudioInfo newInfo) override {
132 TRACED();
133
134 if (info != newInfo){
135 info = newInfo;
136 info.logInfo("in:");
137 }
138 // replicate information
140 if (out_new) {
141 out_new.logInfo("out:");
143 }
144
145 }
146
147 virtual size_t readBytes(uint8_t *data, size_t len) override { return not_supported(0, "readBytes"); }
148
149 virtual size_t write(const uint8_t *data, size_t len) override{ return not_supported(0,"write"); }
150
151
152 virtual operator bool() { return info && available() > 0; }
153
154 virtual AudioInfo audioInfo() override {
155 return info;
156 }
157
158
160 virtual void writeSilence(size_t len){
161 int16_t zero = 0;
162 for (int j=0;j<len/2;j++){
163 write((uint8_t*)&zero,2);
164 }
165 }
166
168 virtual size_t readSilence(uint8_t *buffer, size_t length) {
169 memset(buffer, 0, length);
170 return length;
171 }
172
173 protected:
175
176 virtual int not_supported(int out, const char *msg = "") {
177 LOGE("AudioStream: %s unsupported operation!", msg);
178 // trigger stacktrace
179 assert(false);
180 return out;
181 }
182
183};
184
185
198class CatStream : public BaseStream {
199 public:
201
202 void add(Stream *stream) {
203 if (begin_reset)
204 all_streams.push_back(stream);
205 else
206 input_streams.push_back(stream);
207 }
208 void add(Stream &stream) { add(&stream); }
209
210 bool begin() override {
211 if (begin_reset) {
212 // Restore working list from master so we start at the first stream again
213 input_streams.clear();
214 for (auto s : all_streams) input_streams.push_back(s);
215 }
216 p_current_stream = nullptr;
217 is_active = true;
218 return true;
219 }
220
221 void end() override {
222 is_active = false;
223 p_current_stream = nullptr;
224 }
225
226 int available() override {
227 if (!is_active) return 0;
228 if (!moveToNextStreamOnEnd()) {
229 return 0;
230 }
231 return availableWithTimeout();
232 }
233
234 size_t readBytes(uint8_t *data, size_t len) override {
235 if (!is_active) return 0;
236 if (!moveToNextStreamOnEnd()) {
237 return 0;
238 }
239 size_t result = p_current_stream->readBytes(data, len);
240 if (result == 0) {
241 // Some stream implementations can return available()>0 even when they
242 // already reached the end and return 0 on readBytes(). In this case we
243 // force the switch to the next stream.
244 if (moveToNextStreamOnEnd(true)) {
245 result = p_current_stream->readBytes(data, len);
246 }
247 }
248 return result;
249 }
250
252 operator bool() { return is_active && available() > 0; }
253
255 void setOnBeginCallback(void (*callback)(Stream *stream)) {
256 begin_callback = callback;
257 }
258
260 void setOnEndCallback(void (*callback)(Stream *stream)) {
261 end_callback = callback;
262 }
263
265 void setAvailableCallback(int (*callback)(Stream *stream)) {
266 available_callback = callback;
267 }
268
270 void setTimeout(size_t t) { _timeout = t; }
271
273 size_t write(const uint8_t *data, size_t size) override { return 0;};
274
276 void clear() {
277 all_streams.clear();
278 input_streams.clear();
279 p_current_stream = nullptr;
280 }
281
282 protected:
283 Vector<Stream *> all_streams; // master list — never consumed
284 Vector<Stream *> input_streams; // working list — consumed by pop_front
286 bool is_active = false;
287 void (*begin_callback)(Stream *stream) = nullptr;
288 void (*end_callback)(Stream *stream) = nullptr;
289 int (*available_callback)(Stream *stream) = nullptr;
290 bool begin_reset = false;
291
295 // keep on running
296 if (!force_next_stream && p_current_stream != nullptr &&
298 return true;
299 // at end?
300 if ((p_current_stream == nullptr || force_next_stream ||
301 availableWithTimeout() == 0)) {
304 if (!input_streams.empty()) {
305 LOGI("using next stream");
307 input_streams.pop_front();
310 } else {
311 p_current_stream = nullptr;
312 }
313 }
314 // returns true if we have a valid stream
315 return p_current_stream != nullptr;
316 }
317
319 int result = streamAvailable(p_current_stream);
320 if (result == 0) {
321 for (int j = 0; j < _timeout / 10; j++) {
322 delay(10);
324 if (result != 0) break;
325 }
326 }
327 return result;
328 }
329
330 int streamAvailable(Stream *stream) {
331 if (stream == nullptr) return 0;
332 return available_callback ? available_callback(stream) : stream->available();
333 }
334};
335
343class NullStream : public BaseStream {
344 public:
345 size_t write(const uint8_t *data, size_t len) override { return len; }
346
347 size_t readBytes(uint8_t *data, size_t len) override {
348 memset(data, 0, len);
349 return len;
350 }
351};
352
353
361template <class T>
362class QueueStream : public BaseStream {
363 public:
365 QueueStream() = default;
367 QueueStream(int bufferSize, int bufferCount,
368 bool autoRemoveOldestDataIfFull = false) {
369 owns_buffer = true;
370 p_buffer = new NBuffer<T>(bufferSize, bufferCount);
372 }
375 setBuffer(buffer);
376 }
377
378 virtual ~QueueStream() {
379 if (owns_buffer) {
380 delete p_buffer;
381 }
382 }
383
385 owns_buffer = false;
386 p_buffer = &buffer;
387 }
388
390 virtual bool begin() override {
391 TRACED();
392 total_written = 0;
393 active = true;
394 return true;
395 }
396
398 virtual bool begin(size_t activeWhenPercentFilled) {
399 total_written = 0;
400 // determine total buffer size in bytes
401 size_t size = p_buffer->size() * sizeof(T);
402 // calculate limit
404 LOGI("activate after: %u bytes",(unsigned)active_limit);
405 return true;
406 }
407
409 virtual void end() override {
410 TRACED();
411 active = false;
412 };
413
414 int available() override {
415 return active ? p_buffer->available() * sizeof(T) : 0;
416 }
417
418 int availableForWrite() override {
419 if (!active && active_limit > 0) return DEFAULT_BUFFER_SIZE;
420 return p_buffer->availableForWrite() * sizeof(T);
421 }
422
423 virtual size_t write(const uint8_t *data, size_t len) override {
424 if (len == 0) return 0;
425 if (active_limit == 0 && !active) return 0;
426
427 // activate automaticaly when limit has been reached
428 total_written += len;
429 if (!active && active_limit > 0 && total_written >= active_limit) {
430 this->active = true;
431 LOGI("setting active");
432 }
433
434 // make space by deleting oldest entries
435 if (remove_oldest_data) {
436 int available_bytes =
437 p_buffer->availableForWrite() * sizeof(T);
438 if ((int)len > available_bytes) {
439 int gap = len - available_bytes;
440 uint8_t tmp[gap];
441 readBytes(tmp, gap);
442 }
443 }
444
445 return p_buffer->writeArray(data, len / sizeof(T));
446 }
447
448 virtual size_t readBytes(uint8_t *data, size_t len) override {
449 if (!active) return 0;
450 return p_buffer->readArray(data, len / sizeof(T));
451 }
452
453 int read() override {
454 if (!active) return -1;
455 T result;
456 if (!p_buffer->read(result)) {
457 return -1; // no data available
458 }
459 return result;
460 }
461
462 int peek() override {
463 if (!active) return -1;
464 T result;
465 if (p_buffer->peek(result)) {
466 return *(reinterpret_cast<uint8_t *>(&result));
467 }
468 return -1; // no data available
469 }
470
472 void clear() {
473 if (active) {
474 p_buffer->reset();
475 }
476 }
477
479 operator bool() { return active; }
480
483
485 bool resize(int size) {return p_buffer->resize(size);}
486
487 protected:
489 size_t active_limit = 0;
490 size_t total_written = 0;
491 bool active = false;
492 bool remove_oldest_data = false;
493 bool owns_buffer = false;
494};
495
496
497#ifndef SWIG
498
499struct DataNode {
500 size_t len=0;
502
503 DataNode() = default;
505 DataNode(void*inData, int len){
506 this->len = len;
507 this->data.resize(len);
508 memcpy(&data[0], inData, len);
509 }
510};
511
520public:
521
523
529 // Assign values from ref, clearing the original ref
531 audio_list.swap(ref.audio_list);
532 it = ref.it;
536 is_loop = ref.is_loop;
537 ref.clear();
538 }
539
541 virtual bool begin() override {
542 clear();
544 return true;
545 }
546
547 virtual void end() override {
548 clear();
549 }
550
552 virtual void setLoop(bool loop){
553 is_loop = loop;
554 }
555
557 void setConsumeOnRead(bool consume){
558 consume_on_read = consume;
559 }
560
561 void clear() {
562 DataNode *p_node;
563 bool ok;
564 do{
565 ok = audio_list.pop_front(p_node);
566 if (ok){
567 delete p_node;
568 }
569 } while (ok);
570
572 total_available = 0;
573 read_pos = 0;
574 alloc_failed = false;
575 rewind();
576 }
577
578 size_t size(){
579 return total_available;
580 }
581
583 void rewind() {
584 it = audio_list.begin();
585 read_pos = 0;
586 }
587
588 virtual size_t write(const uint8_t *data, size_t len) override {
589 int size = audio_list.size();
590 LOGI("write: %d / records: %d (max %d)",(int)len, size ,max_records);
591 DataNode *p_node = new DataNode((void*)data, len);
592 if (p_node->data){
593 alloc_failed = false;
594 total_available += len;
595 audio_list.push_back(p_node);
596
597 // setup interator to point to first record
598 if (it == audio_list.end()){
599 it = audio_list.begin();
600 }
601
602 return len;
603 }
604 alloc_failed = true;
605 return 0;
606 }
607
608 virtual int availableForWrite() override {
609 // check for max_records
610 if (max_records > 0 && audio_list.size() >= max_records) {
611 return 0;
612 }
614 }
615
616 virtual int available() override {
617 if (it == audio_list.end()){
618 if (is_loop) rewind();
619 if (it == audio_list.end()) {
620 return 0;
621 }
622 }
623 return (*it)->len;
624 }
625
626 virtual size_t readBytes(uint8_t *data, size_t len) override {
627 // provide unprocessed data
628 if (temp_audio.available() > 0){
629 size_t result = temp_audio.readArray(data, len);
630 read_pos += result;
631 return result;
632 }
633
634 // We have no more data
635 if (it==audio_list.end()){
636 if (is_loop){
637 rewind();
638 } else {
639 // stop the processing
640 return 0;
641 }
642 }
643
644 // provide data from next node
645 DataNode *p_node = *it;
646 size_t node_len = p_node->len;
647 size_t result_len = node_len < len ? node_len : len;
648 if (result_len > 0) {
649 memcpy(data, &p_node->data[0], result_len);
650 }
651 // save unprocessed remainder to temp buffer (to be returned on next call)
652 if (node_len > result_len) {
655 uint8_t *start = &p_node->data[result_len];
657 }
658 // advance and optionally consume the node
659 if (consume_on_read) {
660 DataNode* removed = nullptr;
661 bool ok = audio_list.pop_front(removed);
662 if (ok && removed != nullptr) {
663 if (total_available >= removed->len) {
665 } else {
666 total_available = 0;
667 }
668 delete removed;
669 }
670 it = audio_list.begin();
671 } else {
672 ++it;
673 }
675 return result_len;
676 }
677
679 return audio_list;
680 }
681
685 template<typename T>
686 void postProcessSmoothTransition(int channels, float factor = 0.01, int remove=0){
687 if (remove>0){
688 for (int j=0;j<remove;j++){
689 DataNode* node = nullptr;
690 audio_list.pop_front(node);
691 if (node!=nullptr) delete node;
692 node = nullptr;
693 audio_list.pop_back(node);
694 if (node!=nullptr) delete node;
695 }
696 }
697
698 // Remove popping noise
699 SmoothTransition<T> clean_start(channels, true, false, factor);
700 auto first = *list().begin();
701 if (first!=nullptr){
702 clean_start.convert(&(first->data[0]),first->len);
703 }
704
705 SmoothTransition<T> clean_end(channels, false, true, factor);
706 auto last = * (--(list().end()));
707 if (last!=nullptr){
708 clean_end.convert(&(last->data[0]),last->len);
709 }
710 }
711
713 size_t getPos() {
714 return read_pos;
715 }
716
718 this->max_records = max_records;
719 }
720
721
722protected:
725 size_t total_available = 0;
726 size_t read_pos = 0;
728 int max_records = 0;
729 bool alloc_failed = false;
731 bool is_loop = false;
732 bool consume_on_read = false;
733
734};
735
736#endif
737
738} // namespace audio_tools
#define TRACED()
Definition AudioLoggerIDF.h:31
#define LOGI(...)
Definition AudioLoggerIDF.h:28
#define LOGE(...)
Definition AudioLoggerIDF.h:30
#define MAX_SINGLE_CHARS
Definition AudioToolsConfig.h:138
#define STREAM_READCHAR_OVERRIDE
Definition BaseStream.h:25
#define STREAM_READ_OVERRIDE
Definition BaseStream.h:19
void loop()
#define DEFAULT_BUFFER_SIZE
Definition avr.h:20
#define assert(T)
Definition avr.h:10
Supports the subscription to audio change notifications.
Definition AudioTypes.h:150
void notifyAudioChange(AudioInfo info)
Definition AudioTypes.h:178
Supports changes to the sampling rate, bits and channels.
Definition AudioTypes.h:135
virtual AudioInfo audioInfoOut()
Definition AudioTypes.h:143
Base class for all Audio Streams. It support the boolean operator to test if the object is ready with...
Definition BaseStream.h:123
virtual size_t write(const uint8_t *data, size_t len) override
Definition BaseStream.h:149
virtual size_t readSilence(uint8_t *buffer, size_t length)
Source to generate silence: just sets the buffer to 0.
Definition BaseStream.h:168
AudioInfo info
Definition BaseStream.h:174
virtual size_t readBytes(uint8_t *data, size_t len) override
Definition BaseStream.h:147
virtual ~AudioStream()=default
AudioStream(AudioStream &)=default
virtual void setAudioInfo(AudioInfo newInfo) override
Defines the input AudioInfo.
Definition BaseStream.h:131
virtual void writeSilence(size_t len)
Writes len bytes of silence (=0).
Definition BaseStream.h:160
AudioStream & operator=(AudioStream &)=default
virtual AudioInfo audioInfo() override
provides the actual input AudioInfo
Definition BaseStream.h:154
virtual int not_supported(int out, const char *msg="")
Definition BaseStream.h:176
Shared functionality of all buffers.
Definition Buffers.h:22
virtual bool read(T &result)=0
reads a single value
virtual int readArray(T data[], int len)
reads multiple values
Definition Buffers.h:33
virtual void reset()=0
clears the buffer
virtual int writeArray(const T data[], int len)
Fills the buffer data.
Definition Buffers.h:55
virtual size_t size()=0
virtual int availableForWrite()=0
provides the number of entries that are available to write
virtual bool peek(T &result)=0
peeks the actual entry from the buffer
virtual float levelPercent()
Returns the level of the buffer in %.
Definition Buffers.h:109
virtual int available()=0
provides the number of entries that are available to read
virtual bool resize(int bytes)
Resizes the buffer if supported: returns false if not supported.
Definition Buffers.h:117
Base class for all Streams. It relies on write(const uint8_t *buffer, size_t size) and readBytes(uint...
Definition BaseStream.h:36
virtual ~BaseStream()=default
virtual bool begin()
Definition BaseStream.h:43
void refillReadBuffer()
Refill small read buffer (e.g. 8 bytes) to avoid single byte reads when calling read()
Definition BaseStream.h:103
BaseStream & operator=(BaseStream &)=default
virtual int availableForWrite() override
Definition BaseStream.h:60
int write_buffer_size
Definition BaseStream.h:100
BaseStream(BaseStream &)=default
virtual size_t readBytes(uint8_t *data, size_t len)=0
void setWriteBufferSize(int size)
Definition BaseStream.h:95
virtual void end()
Definition BaseStream.h:44
RingBuffer< uint8_t > tmp_out
Definition BaseStream.h:99
RingBuffer< uint8_t > tmp_in
Definition BaseStream.h:98
virtual size_t write(uint8_t ch) override
Definition BaseStream.h:50
virtual size_t write(const uint8_t *data, size_t len) override=0
virtual void flush() override
Definition BaseStream.h:62
virtual int available() override
Definition BaseStream.h:58
Provides data from a concatenation of Streams. Please note that the provided Streams can be played on...
Definition BaseStream.h:198
Vector< Stream * > input_streams
Definition BaseStream.h:284
Vector< Stream * > all_streams
Definition BaseStream.h:283
int(* available_callback)(Stream *stream)
Definition BaseStream.h:289
size_t write(const uint8_t *data, size_t size) override
not supported
Definition BaseStream.h:273
CatStream(bool beginReset=false)
Definition BaseStream.h:200
void(* begin_callback)(Stream *stream)
Definition BaseStream.h:287
bool is_active
Definition BaseStream.h:286
Stream * p_current_stream
Definition BaseStream.h:285
size_t readBytes(uint8_t *data, size_t len) override
Definition BaseStream.h:234
int streamAvailable(Stream *stream)
Definition BaseStream.h:330
void end() override
Definition BaseStream.h:221
int available() override
Definition BaseStream.h:226
void add(Stream &stream)
Definition BaseStream.h:208
bool moveToNextStreamOnEnd(bool force_next_stream=false)
Definition BaseStream.h:294
void setTimeout(size_t t)
Defines the timout in ms the system waits for data when moving to the next stream.
Definition BaseStream.h:270
void setOnBeginCallback(void(*callback)(Stream *stream))
Defines the callback which is called when a new stream is started.
Definition BaseStream.h:255
void setAvailableCallback(int(*callback)(Stream *stream))
Defines the callback used to determine available bytes for a stream.
Definition BaseStream.h:265
void add(Stream *stream)
Definition BaseStream.h:202
void setOnEndCallback(void(*callback)(Stream *stream))
Defines the callback which is called when a stream is finished.
Definition BaseStream.h:260
int availableWithTimeout()
Definition BaseStream.h:318
void clear()
clear
Definition BaseStream.h:276
bool begin() override
Definition BaseStream.h:210
void(* end_callback)(Stream *stream)
Definition BaseStream.h:288
bool begin_reset
Definition BaseStream.h:290
MemoryStream which is written and read using the internal RAM. For each write the data is allocated o...
Definition BaseStream.h:519
virtual size_t write(const uint8_t *data, size_t len) override
Definition BaseStream.h:588
List< DataNode * > & list()
Definition BaseStream.h:678
size_t size()
Definition BaseStream.h:578
int default_buffer_size
Definition BaseStream.h:727
List< DataNode * >::Iterator it
Definition BaseStream.h:724
size_t getPos()
Returns the current read position.
Definition BaseStream.h:713
void postProcessSmoothTransition(int channels, float factor=0.01, int remove=0)
Post processing after the recording. We add a smooth transition at the beginning and at the end.
Definition BaseStream.h:686
virtual bool begin() override
Intializes the processing.
Definition BaseStream.h:541
int max_records
Definition BaseStream.h:728
virtual size_t readBytes(uint8_t *data, size_t len) override
Definition BaseStream.h:626
virtual int availableForWrite() override
Definition BaseStream.h:608
size_t read_pos
Definition BaseStream.h:726
bool consume_on_read
Definition BaseStream.h:732
virtual void setLoop(bool loop)
Automatically rewinds to the beginning when reaching the end.
Definition BaseStream.h:552
void setMaxRecords(int max_records)
Definition BaseStream.h:717
List< DataNode * > audio_list
Definition BaseStream.h:723
void rewind()
Sets the read position to the beginning.
Definition BaseStream.h:583
RingBuffer< uint8_t > temp_audio
Definition BaseStream.h:730
void setConsumeOnRead(bool consume)
Enable or disable consuming reads (remove records as they are read)
Definition BaseStream.h:557
DynamicMemoryStream(bool isLoop, int defaultBufferSize=DEFAULT_BUFFER_SIZE, int maxRecords=0)
Definition BaseStream.h:524
void assign(DynamicMemoryStream &ref)
Definition BaseStream.h:530
void clear()
Definition BaseStream.h:561
bool alloc_failed
Definition BaseStream.h:729
virtual void end() override
Definition BaseStream.h:547
size_t total_available
Definition BaseStream.h:725
bool is_loop
Definition BaseStream.h:731
virtual int available() override
Definition BaseStream.h:616
Definition List.h:26
Double linked list.
Definition List.h:18
A lock free N buffer. If count=2 we create a DoubleBuffer, if count=3 a TripleBuffer etc.
Definition Buffers.h:663
The Arduino Stream which provides silence and simulates a null device when used as audio target or au...
Definition BaseStream.h:343
size_t readBytes(uint8_t *data, size_t len) override
Definition BaseStream.h:347
size_t write(const uint8_t *data, size_t len) override
Definition BaseStream.h:345
int _timeout
Definition NoArduino.h:139
virtual void flush()
Definition NoArduino.h:136
Stream class which stores the data in a temporary queue buffer. The queue can be consumed e....
Definition BaseStream.h:362
virtual size_t write(const uint8_t *data, size_t len) override
Definition BaseStream.h:423
bool active
Definition BaseStream.h:491
BaseBuffer< T > * p_buffer
Definition BaseStream.h:488
QueueStream(BaseBuffer< T > &buffer)
Create stream from any BaseBuffer subclass.
Definition BaseStream.h:374
bool owns_buffer
Definition BaseStream.h:493
virtual bool begin() override
Activates the output.
Definition BaseStream.h:390
int peek() override
Definition BaseStream.h:462
virtual bool begin(size_t activeWhenPercentFilled)
Activate only when filled buffer reached %.
Definition BaseStream.h:398
virtual size_t readBytes(uint8_t *data, size_t len) override
Definition BaseStream.h:448
virtual ~QueueStream()
Definition BaseStream.h:378
int available() override
Definition BaseStream.h:414
size_t active_limit
Definition BaseStream.h:489
QueueStream()=default
Empty Constructor: call setBuffer() to set the buffer.
bool remove_oldest_data
Definition BaseStream.h:492
int availableForWrite() override
Definition BaseStream.h:418
bool resize(int size)
Resize the buffer.
Definition BaseStream.h:485
void clear()
Clears the data in the buffer.
Definition BaseStream.h:472
size_t total_written
Definition BaseStream.h:490
QueueStream(int bufferSize, int bufferCount, bool autoRemoveOldestDataIfFull=false)
Default constructor.
Definition BaseStream.h:367
int read() override
Definition BaseStream.h:453
int levelPercent()
Returns the fill level in percent.
Definition BaseStream.h:482
void setBuffer(BaseBuffer< T > &buffer)
Definition BaseStream.h:384
virtual void end() override
stops the processing
Definition BaseStream.h:409
Implements a typed Ringbuffer.
Definition Buffers.h:341
bool peek(T &result) override
peeks the actual entry from the buffer
Definition Buffers.h:361
bool read(T &result) override
reads a single value
Definition Buffers.h:348
virtual T * address() override
returns the address of the start of the physical read buffer
Definition Buffers.h:416
virtual bool write(T data) override
write add an entry to the buffer
Definition Buffers.h:391
virtual size_t size() override
Returns the maximum capacity of the buffer.
Definition Buffers.h:428
virtual void reset() override
clears the buffer
Definition Buffers.h:403
virtual bool isFull() override
checks if the buffer is full
Definition Buffers.h:386
bool isEmpty()
Definition Buffers.h:388
virtual bool resize(int len)
Resizes the buffer if supported: returns false if not supported.
Definition Buffers.h:418
virtual int available() override
provides the number of entries that are available to read
Definition Buffers.h:410
Changes the samples at the beginning or at the end to slowly ramp up the volume.
Definition BaseConverter.h:1895
Definition NoArduino.h:142
virtual size_t readBytes(uint8_t *data, size_t len)
Definition NoArduino.h:147
virtual int available()
Definition NoArduino.h:146
Vector implementation which provides the most important methods as defined by std::vector....
Definition Vector.h:21
bool resize(int newSize, T value)
Definition Vector.h:266
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10
void delay(unsigned long ms)
Definition Time.h:23
size_t writeData(Print *p_out, T *data, int samples, int maxSamples=512)
Definition AudioTypes.h:512
Basic Audio information which drives e.g. I2S.
Definition AudioTypes.h:55
virtual void logInfo(const char *source="")
Definition AudioTypes.h:125
Definition BaseStream.h:499
DataNode(void *inData, int len)
Constructor.
Definition BaseStream.h:505
size_t len
Definition BaseStream.h:500
Vector< uint8_t > data
Definition BaseStream.h:501