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