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
196class CatStream : public BaseStream {
197 public:
198 CatStream() = default;
199
200 void add(Stream *stream) { input_streams.push_back(stream); }
201 void add(Stream &stream) { input_streams.push_back(&stream); }
202
203 bool begin() override {
204 is_active = true;
205 return true;
206 }
207
208 void end() override { is_active = false; }
209
210 int available() override {
211 if (!is_active) return 0;
212 if (!moveToNextStreamOnEnd()) {
213 return 0;
214 }
215 return availableWithTimout();
216 }
217
218 size_t readBytes(uint8_t *data, size_t len) override {
219 if (!is_active) return 0;
220 if (!moveToNextStreamOnEnd()) {
221 return 0;
222 }
223 return p_current_stream->readBytes(data, len);
224 }
225
227 operator bool() { return is_active && available() > 0; }
228
229 void setOnBeginCallback(void (*callback)(Stream *stream)) {
230 begin_callback = callback;
231 }
232 void setOnEndCallback(void (*callback)(Stream *stream)) {
233 end_callback = callback;
234 }
235
237 void setTimeout(size_t t) { _timeout = t; }
238
240 size_t write(const uint8_t *data, size_t size) override { return 0;};
241
242 protected:
245 bool is_active = false;
246 void (*begin_callback)(Stream *stream) = nullptr;
247 void (*end_callback)(Stream *stream) = nullptr;
248 size_t _timeout = 0;
249
253 // keep on running
254 if (p_current_stream != nullptr && p_current_stream->available() > 0)
255 return true;
256 // at end?
257 if ((p_current_stream == nullptr || availableWithTimout() == 0)) {
259 if (!input_streams.empty()) {
260 LOGI("using next stream");
262 input_streams.pop_front();
265 } else {
266 p_current_stream = nullptr;
267 }
268 }
269 // returns true if we have a valid stream
270 return p_current_stream != nullptr;
271 }
272
274 int result = p_current_stream->available();
275 if (result == 0) {
276 for (int j = 0; j < _timeout / 10; j++) {
277 delay(10);
278 result = p_current_stream->available();
279 if (result != 0) break;
280 }
281 }
282 return result;
283 }
284};
285
293class NullStream : public BaseStream {
294 public:
295 size_t write(const uint8_t *data, size_t len) override { return len; }
296
297 size_t readBytes(uint8_t *data, size_t len) override {
298 memset(data, 0, len);
299 return len;
300 }
301};
302
303
311template <class T>
312class QueueStream : public BaseStream {
313 public:
315 QueueStream() = default;
317 QueueStream(int bufferSize, int bufferCount,
318 bool autoRemoveOldestDataIfFull = false) {
319 owns_buffer = true;
320 p_buffer = new NBuffer<T>(bufferSize, bufferCount);
322 }
325 setBuffer(buffer);
326 }
327
328 virtual ~QueueStream() {
329 if (owns_buffer) {
330 delete p_buffer;
331 }
332 }
333
335 owns_buffer = false;
336 p_buffer = &buffer;
337 }
338
340 virtual bool begin() override {
341 TRACED();
342 total_written = 0;
343 active = true;
344 return true;
345 }
346
348 virtual bool begin(size_t activeWhenPercentFilled) {
349 total_written = 0;
350 // determine total buffer size in bytes
351 size_t size = p_buffer->size() * sizeof(T);
352 // calculate limit
354 LOGI("activate after: %u bytes",(unsigned)active_limit);
355 return true;
356 }
357
359 virtual void end() override {
360 TRACED();
361 active = false;
362 };
363
364 int available() override {
365 return active ? p_buffer->available() * sizeof(T) : 0;
366 }
367
368 int availableForWrite() override {
369 if (!active && active_limit > 0) return DEFAULT_BUFFER_SIZE;
370 return p_buffer->availableForWrite() * sizeof(T);
371 }
372
373 virtual size_t write(const uint8_t *data, size_t len) override {
374 if (len == 0) return 0;
375 if (active_limit == 0 && !active) return 0;
376
377 // activate automaticaly when limit has been reached
378 total_written += len;
379 if (!active && active_limit > 0 && total_written >= active_limit) {
380 this->active = true;
381 LOGI("setting active");
382 }
383
384 // make space by deleting oldest entries
385 if (remove_oldest_data) {
386 int available_bytes =
387 p_buffer->availableForWrite() * sizeof(T);
388 if ((int)len > available_bytes) {
389 int gap = len - available_bytes;
390 uint8_t tmp[gap];
391 readBytes(tmp, gap);
392 }
393 }
394
395 return p_buffer->writeArray(data, len / sizeof(T));
396 }
397
398 virtual size_t readBytes(uint8_t *data, size_t len) override {
399 if (!active) return 0;
400 return p_buffer->readArray(data, len / sizeof(T));
401 }
402
403 int read() override {
404 if (!active) return -1;
405 T result;
406 if (!p_buffer->read(result)) {
407 return -1; // no data available
408 }
409 return result;
410 }
411
412 int peek() override {
413 if (!active) return -1;
414 T result;
415 if (p_buffer->peek(result)) {
416 return *(reinterpret_cast<uint8_t *>(&result));
417 }
418 return -1; // no data available
419 }
420
422 void clear() {
423 if (active) {
424 p_buffer->reset();
425 }
426 }
427
429 operator bool() { return active; }
430
433
435 bool resize(int size) {return p_buffer->resize(size);}
436
437 protected:
439 size_t active_limit = 0;
440 size_t total_written = 0;
441 bool active = false;
442 bool remove_oldest_data = false;
443 bool owns_buffer = false;
444};
445
446
447#ifndef SWIG
448
449struct DataNode {
450 size_t len=0;
452
453 DataNode() = default;
455 DataNode(void*inData, int len){
456 this->len = len;
457 this->data.resize(len);
458 memcpy(&data[0], inData, len);
459 }
460};
461
470public:
471
473
479 // Assign values from ref, clearing the original ref
481 audio_list.swap(ref.audio_list);
482 it = ref.it;
486 is_loop = ref.is_loop;
487 ref.clear();
488 }
489
491 virtual bool begin() override {
492 clear();
494 return true;
495 }
496
497 virtual void end() override {
498 clear();
499 }
500
502 virtual void setLoop(bool loop){
503 is_loop = loop;
504 }
505
507 void setConsumeOnRead(bool consume){
508 consume_on_read = consume;
509 }
510
511 void clear() {
512 DataNode *p_node;
513 bool ok;
514 do{
515 ok = audio_list.pop_front(p_node);
516 if (ok){
517 delete p_node;
518 }
519 } while (ok);
520
522 total_available = 0;
523 read_pos = 0;
524 alloc_failed = false;
525 rewind();
526 }
527
528 size_t size(){
529 return total_available;
530 }
531
533 void rewind() {
534 it = audio_list.begin();
535 read_pos = 0;
536 }
537
538 virtual size_t write(const uint8_t *data, size_t len) override {
539 int size = audio_list.size();
540 LOGI("write: %d / records: %d (max %d)",(int)len, size ,max_records);
541 DataNode *p_node = new DataNode((void*)data, len);
542 if (p_node->data){
543 alloc_failed = false;
544 total_available += len;
545 audio_list.push_back(p_node);
546
547 // setup interator to point to first record
548 if (it == audio_list.end()){
549 it = audio_list.begin();
550 }
551
552 return len;
553 }
554 alloc_failed = true;
555 return 0;
556 }
557
558 virtual int availableForWrite() override {
559 // check for max_records
560 if (max_records > 0 && audio_list.size() >= max_records) {
561 return 0;
562 }
564 }
565
566 virtual int available() override {
567 if (it == audio_list.end()){
568 if (is_loop) rewind();
569 if (it == audio_list.end()) {
570 return 0;
571 }
572 }
573 return (*it)->len;
574 }
575
576 virtual size_t readBytes(uint8_t *data, size_t len) override {
577 // provide unprocessed data
578 if (temp_audio.available() > 0){
579 size_t result = temp_audio.readArray(data, len);
580 read_pos += result;
581 return result;
582 }
583
584 // We have no more data
585 if (it==audio_list.end()){
586 if (is_loop){
587 rewind();
588 } else {
589 // stop the processing
590 return 0;
591 }
592 }
593
594 // provide data from next node
595 DataNode *p_node = *it;
596 size_t node_len = p_node->len;
597 size_t result_len = node_len < len ? node_len : len;
598 if (result_len > 0) {
599 memcpy(data, &p_node->data[0], result_len);
600 }
601 // save unprocessed remainder to temp buffer (to be returned on next call)
602 if (node_len > result_len) {
605 uint8_t *start = &p_node->data[result_len];
607 }
608 // advance and optionally consume the node
609 if (consume_on_read) {
610 DataNode* removed = nullptr;
611 bool ok = audio_list.pop_front(removed);
612 if (ok && removed != nullptr) {
613 if (total_available >= removed->len) {
615 } else {
616 total_available = 0;
617 }
618 delete removed;
619 }
620 it = audio_list.begin();
621 } else {
622 ++it;
623 }
625 return result_len;
626 }
627
629 return audio_list;
630 }
631
635 template<typename T>
636 void postProcessSmoothTransition(int channels, float factor = 0.01, int remove=0){
637 if (remove>0){
638 for (int j=0;j<remove;j++){
639 DataNode* node = nullptr;
640 audio_list.pop_front(node);
641 if (node!=nullptr) delete node;
642 node = nullptr;
643 audio_list.pop_back(node);
644 if (node!=nullptr) delete node;
645 }
646 }
647
648 // Remove popping noise
649 SmoothTransition<T> clean_start(channels, true, false, factor);
650 auto first = *list().begin();
651 if (first!=nullptr){
652 clean_start.convert(&(first->data[0]),first->len);
653 }
654
655 SmoothTransition<T> clean_end(channels, false, true, factor);
656 auto last = * (--(list().end()));
657 if (last!=nullptr){
658 clean_end.convert(&(last->data[0]),last->len);
659 }
660 }
661
663 size_t getPos() {
664 return read_pos;
665 }
666
668 this->max_records = max_records;
669 }
670
671
672protected:
675 size_t total_available = 0;
676 size_t read_pos = 0;
678 int max_records = 0;
679 bool alloc_failed = false;
681 bool is_loop = false;
682 bool consume_on_read = false;
683
684};
685
686#endif
687
688} // 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:196
Vector< Stream * > input_streams
Definition BaseStream.h:243
size_t _timeout
Definition BaseStream.h:248
size_t write(const uint8_t *data, size_t size) override
not supported
Definition BaseStream.h:240
void(* begin_callback)(Stream *stream)
Definition BaseStream.h:246
int availableWithTimout()
Definition BaseStream.h:273
bool is_active
Definition BaseStream.h:245
Stream * p_current_stream
Definition BaseStream.h:244
size_t readBytes(uint8_t *data, size_t len) override
Definition BaseStream.h:218
void end() override
Definition BaseStream.h:208
int available() override
Definition BaseStream.h:210
void add(Stream &stream)
Definition BaseStream.h:201
void setTimeout(size_t t)
Defines the timout the system waits for data when moving to the next stream.
Definition BaseStream.h:237
void setOnBeginCallback(void(*callback)(Stream *stream))
Definition BaseStream.h:229
void add(Stream *stream)
Definition BaseStream.h:200
void setOnEndCallback(void(*callback)(Stream *stream))
Definition BaseStream.h:232
bool begin() override
Definition BaseStream.h:203
void(* end_callback)(Stream *stream)
Definition BaseStream.h:247
bool moveToNextStreamOnEnd()
Definition BaseStream.h:252
MemoryStream which is written and read using the internal RAM. For each write the data is allocated o...
Definition BaseStream.h:469
virtual size_t write(const uint8_t *data, size_t len) override
Definition BaseStream.h:538
List< DataNode * > & list()
Definition BaseStream.h:628
size_t size()
Definition BaseStream.h:528
int default_buffer_size
Definition BaseStream.h:677
List< DataNode * >::Iterator it
Definition BaseStream.h:674
size_t getPos()
Returns the current read position.
Definition BaseStream.h:663
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:636
virtual bool begin() override
Intializes the processing.
Definition BaseStream.h:491
int max_records
Definition BaseStream.h:678
virtual size_t readBytes(uint8_t *data, size_t len) override
Definition BaseStream.h:576
virtual int availableForWrite() override
Definition BaseStream.h:558
size_t read_pos
Definition BaseStream.h:676
bool consume_on_read
Definition BaseStream.h:682
virtual void setLoop(bool loop)
Automatically rewinds to the beginning when reaching the end.
Definition BaseStream.h:502
void setMaxRecords(int max_records)
Definition BaseStream.h:667
List< DataNode * > audio_list
Definition BaseStream.h:673
void rewind()
Sets the read position to the beginning.
Definition BaseStream.h:533
RingBuffer< uint8_t > temp_audio
Definition BaseStream.h:680
void setConsumeOnRead(bool consume)
Enable or disable consuming reads (remove records as they are read)
Definition BaseStream.h:507
DynamicMemoryStream(bool isLoop, int defaultBufferSize=DEFAULT_BUFFER_SIZE, int maxRecords=0)
Definition BaseStream.h:474
void assign(DynamicMemoryStream &ref)
Definition BaseStream.h:480
void clear()
Definition BaseStream.h:511
bool alloc_failed
Definition BaseStream.h:679
virtual void end() override
Definition BaseStream.h:497
size_t total_available
Definition BaseStream.h:675
bool is_loop
Definition BaseStream.h:681
virtual int available() override
Definition BaseStream.h:566
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:293
size_t readBytes(uint8_t *data, size_t len) override
Definition BaseStream.h:297
size_t write(const uint8_t *data, size_t len) override
Definition BaseStream.h:295
Stream class which stores the data in a temporary queue buffer. The queue can be consumed e....
Definition BaseStream.h:312
virtual size_t write(const uint8_t *data, size_t len) override
Definition BaseStream.h:373
bool active
Definition BaseStream.h:441
BaseBuffer< T > * p_buffer
Definition BaseStream.h:438
QueueStream(BaseBuffer< T > &buffer)
Create stream from any BaseBuffer subclass.
Definition BaseStream.h:324
bool owns_buffer
Definition BaseStream.h:443
virtual bool begin() override
Activates the output.
Definition BaseStream.h:340
int peek() override
Definition BaseStream.h:412
virtual bool begin(size_t activeWhenPercentFilled)
Activate only when filled buffer reached %.
Definition BaseStream.h:348
virtual size_t readBytes(uint8_t *data, size_t len) override
Definition BaseStream.h:398
virtual ~QueueStream()
Definition BaseStream.h:328
int available() override
Definition BaseStream.h:364
size_t active_limit
Definition BaseStream.h:439
QueueStream()=default
Empty Constructor: call setBuffer() to set the buffer.
bool remove_oldest_data
Definition BaseStream.h:442
int availableForWrite() override
Definition BaseStream.h:368
bool resize(int size)
Resize the buffer.
Definition BaseStream.h:435
void clear()
Clears the data in the buffer.
Definition BaseStream.h:422
size_t total_written
Definition BaseStream.h:440
QueueStream(int bufferSize, int bufferCount, bool autoRemoveOldestDataIfFull=false)
Default constructor.
Definition BaseStream.h:317
int read() override
Definition BaseStream.h:403
int levelPercent()
Returns the fill level in percent.
Definition BaseStream.h:432
void setBuffer(BaseBuffer< T > &buffer)
Definition BaseStream.h:334
virtual void end() override
stops the processing
Definition BaseStream.h:359
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:449
DataNode(void *inData, int len)
Constructor.
Definition BaseStream.h:455
size_t len
Definition BaseStream.h:450
Vector< uint8_t > data
Definition BaseStream.h:451