arduino-audio-tools
Loading...
Searching...
No Matches
AudioStreams.h
Go to the documentation of this file.
1#pragma once
10#include "AudioToolsConfig.h"
11
12#ifndef IRAM_ATTR
13#define IRAM_ATTR
14#endif
15
16namespace audio_tools {
17
24 public:
26 TRACED();
27 p_stream = &s;
28 p_stream->setTimeout(clientTimeout);
29 }
30
31 virtual bool begin() { return true; }
32 virtual void end() {}
33
34 virtual size_t readBytes(uint8_t *data, size_t len) {
35 // Serial.print("Timeout audiostream: ");
36 // Serial.println(p_stream->getTimeout());
37 return p_stream->readBytes(data, len);
38 }
39
40 int read() { return p_stream->read(); }
41
42 int peek() { return p_stream->peek(); }
43
44 int available() { return p_stream->available(); }
45
46 virtual size_t write(uint8_t c) { return p_stream->write(c); }
47
48 virtual size_t write(const uint8_t *data, size_t len) {
49 return p_stream->write(data, len);
50 }
51
52 virtual int availableForWrite() { return p_stream->availableForWrite(); }
53
54 virtual void flush() { p_stream->flush(); }
55
56 protected:
59};
60
69 public:
71 virtual void setStream(Stream &in) = 0;
73 virtual void setOutput(Print &out) = 0;
74};
75
83class MemoryStream : public AudioStream {
84 public:
85 // Default constructor
86 MemoryStream() = default;
89 LOGD("MemoryStream: %d", buffer_size);
90 this->buffer_size = buffer_size;
91 this->memory_type = memoryType;
92 resize(buffer_size);
93 info.clear(); // mark audio info as unknown
94 }
95
98 MemoryStream(const uint8_t *buffer, int buffer_size, bool isActive = true,
100 LOGD("MemoryStream: %d", buffer_size);
101 owns_memory = false;
103 is_active = isActive;
104 info.clear(); // mark audio info as unknown
105 }
106
108 MemoryStream(MemoryStream &source) : AudioStream() { copy(source); }
109
112 setValue(source.buffer, source.buffer_size, source.memory_type);
113 // clear source data
114 source.setValue(nullptr, 0, source.memory_type);
115 }
116
118 TRACED();
119 if (memoryCanChange() && owns_memory && buffer != nullptr) free(buffer);
120 }
121
124 copy(other);
125 return *this;
126 }
127
129 operator bool() override { return available() > 0; }
130
133 this->info = info;
134 return begin();
135 }
136
138 bool begin() override {
139 TRACED();
141 if (this->buffer == nullptr && owns_memory && memoryCanChange()) {
143 }
144 read_pos = 0;
145 is_active = this->buffer != nullptr;
146 return is_active;
147 }
148
149 virtual size_t write(uint8_t byte) override {
150 if (!is_active) return 0;
151 if (memory_type == FLASH_RAM) return 0;
152 if (buffer == nullptr) return 0;
153 int result = 0;
154 if (write_pos < buffer_size) {
155 result = 1;
157 write_pos++;
158 }
159 return result;
160 }
161
162 virtual size_t write(const uint8_t *data, size_t len) override {
163 if (!is_active) return 0;
164 if (memory_type == FLASH_RAM) return 0;
165 size_t result = 0;
166 for (size_t j = 0; j < len; j++) {
167 if (!write(data[j])) {
168 break;
169 }
170 result = j + 1;
171 }
172 return result;
173 }
174
175 virtual int available() override {
176 if (!is_active) return 0;
177 if (buffer == nullptr) return 0;
178 int result = write_pos - read_pos;
179 if (result <= 0 && is_loop) {
180 // rewind to start
182 result = write_pos - read_pos;
183 // call callback
184 if (rewind != nullptr) rewind();
185 }
186 return is_loop ? DEFAULT_BUFFER_SIZE : result;
187 }
188
189 virtual int availableForWrite() override {
190 if (!is_active) return 0;
191 if (memory_type == FLASH_RAM) return 0;
192 return buffer_size - write_pos;
193 }
194
195 virtual int read() override {
196 int result = peek();
197 if (result >= 0) {
198 read_pos++;
199 }
200 return result;
201 }
202
203 virtual size_t readBytes(uint8_t *data, size_t len) override {
204 if (!is_active) return 0;
205 size_t count = 0;
206 while (count < len) {
207 int c = read();
208 if (c < 0) break;
209 *data++ = (char)c;
210 count++;
211 }
212 return count;
213 }
214
215 virtual int peek() override {
216 if (!is_active) return -1;
217 int result = -1;
218 if (available() > 0) {
219 result = buffer[read_pos];
220 }
221 return result;
222 }
223
224 virtual void flush() override {}
225
226 virtual void end() override {
227 read_pos = 0;
228 is_active = false;
229 }
230
232 virtual void clear(bool reset = false) {
233 if (memoryCanChange()) {
234 write_pos = 0;
235 read_pos = 0;
236 if (owns_memory && buffer == nullptr) {
238 }
239 if (reset) {
240 // we clear the buffer data
242 }
243 } else {
244 read_pos = 0;
245 LOGW("data is read only");
246 }
247 }
248
251 virtual void setLoop(bool loop) {
252 is_loop = loop;
253 rewind_pos = 0;
254 if (buffer != nullptr && buffer_size > 12) {
255 if (memcmp("WAVE", buffer + 8, 4) == 0) {
256 rewind_pos = 44;
257 }
258 }
259 }
260
262 virtual void setLoop(bool loop, int rewindPos) {
263 is_loop = loop;
265 }
266
269 virtual bool resize(size_t size) {
270 if (!memoryCanChange()) return false;
271 if (!owns_memory) return false;
272
273 buffer_size = size;
274 switch (memory_type) {
275#if defined(USE_PSRAM) && defined(ARDUINO)
276 case PS_RAM:
277 buffer = (buffer == nullptr) ? (uint8_t *)ps_calloc(size, 1)
278 : (uint8_t *)ps_realloc(buffer, size);
279 break;
280#endif
281 default:
282 buffer = (buffer == nullptr) ? (uint8_t *)calloc(size, 1)
283 : (uint8_t *)realloc(buffer, size);
284 break;
285 }
286 return buffer != nullptr;
287 }
288
290 virtual uint8_t *data() { return buffer; }
291
293 virtual void setAvailable(size_t len) { this->write_pos = len; }
294
296 void setRewindCallback(void (*cb)()) { this->rewind = cb; }
297
301 this->buffer_size = buffer_size;
302 this->read_pos = 0;
303 this->write_pos = buffer_size;
304 this->buffer = (uint8_t *)buffer;
305 this->memory_type = memoryType;
306 }
307
308 protected:
309 int write_pos = 0;
310 int read_pos = 0;
311 int buffer_size = 0;
312 int rewind_pos = 0;
313 uint8_t *buffer = nullptr;
315 bool is_loop = false;
316 void (*rewind)() = nullptr;
317 bool is_active = false;
318 bool owns_memory = true;
319
321
322 void copy(MemoryStream &source) {
323 if (this == &source) return;
324 if (source.memory_type == FLASH_RAM) {
325 setValue(source.buffer, source.buffer_size, source.memory_type);
326 } else {
327 setValue(nullptr, source.buffer_size, source.memory_type);
330 }
331 }
332};
333
342 public:
344
345 virtual int available() override {
346 // LOGD("RingBufferStream::available: %zu",buffer->available());
347 return buffer.available();
348 }
349
350 virtual int availableForWrite() override {
351 return buffer.availableForWrite();
352 }
353
354 virtual void flush() override {}
355 virtual int peek() override {
356 uint8_t data = 0;
357 if (!buffer.peek(data)) return -1;
358 return data;
359 }
360 virtual int read() override {
361 uint8_t data = 0;
362 if (!buffer.read(data)) return -1;
363 return data;
364 }
365
366 virtual size_t readBytes(uint8_t *data, size_t len) override {
367 return buffer.readArray(data, len);
368 }
369
370 virtual size_t write(const uint8_t *data, size_t len) override {
371 // LOGD("RingBufferStream::write: %zu",len);
372 return buffer.writeArray(data, len);
373 }
374
375 virtual size_t write(uint8_t c) override { return buffer.write(c); }
376
377 void resize(int size) { buffer.resize(size); }
378
379 size_t size() { return buffer.size(); }
380
381 protected:
383};
384
396template <class T = int16_t>
398 public:
400
402 TRACED();
403 setInput(generator);
404 }
405
406 void setInput(SoundGenerator<T> &generator) {
407 this->p_generator = &generator;
408 }
409
411 if (p_generator == nullptr) {
413 return AudioInfo();
414 }
415 return this->p_generator->defaultConfig();
416 }
417
419 if (newInfo.bits_per_sample != sizeof(T) * 8) {
420 LOGE("Wrong bits_per_sample: %d", newInfo.bits_per_sample);
421 }
423 }
424
426 bool begin() override {
427 TRACED();
428 if (p_generator == nullptr) {
430 return false;
431 }
434 active = true;
435 return active;
436 }
437
439 bool begin(AudioInfo cfg) {
440 TRACED();
441 if (p_generator == nullptr) {
443 return false;
444 }
445 p_generator->begin(cfg);
447 active = true;
448 return active;
449 }
450
452 void end() override {
453 TRACED();
454 if (p_generator != nullptr) {
455 p_generator->end();
456 }
457 active = true; // legacy support - most sketches do not call begin
458 }
459
460 AudioInfo audioInfo() override {
461 if (p_generator == nullptr) {
463 return AudioStream::audioInfo();
464 }
465 return p_generator->audioInfo();
466 }
467
469 virtual int available() override { return active ? buffer_size : 0; }
470
472 size_t readBytes(uint8_t *data, size_t len) override {
473 if (!active) return 0;
474 if (p_generator == nullptr) {
475 return 0;
476 }
477 LOGD("GeneratedSoundStream::readBytes: %u", (unsigned int)len);
478 return p_generator->readBytes(data, len);
479 }
480
481 bool isActive() {
482 if (p_generator == nullptr) return false;
483 return active && p_generator->isActive();
484 }
485
486 operator bool() override { return isActive(); }
487
488 void flush() override {}
489
492
493 protected:
494 bool active = true; // support for legacy sketches
497 DEFAULT_BUFFER_SIZE * 100; // there is no reason to limit this
498 const char *source_not_defined_error = "Source not defined";
499};
500
510 public:
511 BufferedStream(size_t buffer_size) {
512 TRACED();
513 if (buffer_size > 0) resize(buffer_size);
514 }
515
516 BufferedStream(Print &out, size_t buffer_size = 1024) {
517 TRACED();
518 setOutput(out);
519 if (buffer_size > 0) resize(buffer_size);
520 }
521
522 BufferedStream(Stream &io, size_t buffer_size = 1024) {
523 TRACED();
524 setStream(io);
525 if (buffer_size > 0) resize(buffer_size);
526 }
527
528 BufferedStream(size_t buffer_size, Print &out) {
529 TRACED();
530 setOutput(out);
531 if (buffer_size > 0) resize(buffer_size);
532 }
533
534 BufferedStream(size_t buffer_size, Stream &io) {
535 TRACED();
536 setStream(io);
537 if (buffer_size > 0) resize(buffer_size);
538 }
539
540 void setOutput(Print &out) override { p_out = &out; }
541 void setStream(Print &out) { setOutput(out); }
542 void setStream(Stream &io) override {
543 p_in = &io;
544 p_out = &io;
545 }
546
548 size_t write(uint8_t c) override {
549 if (buffer.isFull()) {
550 flush();
551 }
552 return buffer.write(c);
553 }
554
556 size_t write(const uint8_t *data, size_t len) override {
557 LOGD("%s: %zu", LOG_METHOD, len);
558 int result = 0;
559 for (int j = 0; j < len; j++) {
560 result += write(data[j]);
561 }
562 return result;
563 }
564
566 void flush() override {
567 // just dump the memory of the buffer and clear it
568 if (buffer.available() > 0) {
570 buffer.reset();
571 }
572 }
573
575 int read() override {
576 if (buffer.isEmpty()) {
577 refill();
578 }
579 uint8_t result = 0;
580 if (!buffer.read(result)) return -1;
581 return result;
582 }
583
585 int peek() override {
586 if (buffer.isEmpty()) {
587 refill();
588 }
589 uint8_t result = 0;
590 if (!buffer.peek(result)) return -1;
591 return result;
592 };
593
595 size_t readBytes(uint8_t *data, size_t len) override {
596 if (buffer.isEmpty() && len >= minReadBufferSize) {
597 return readExt(data, len);
598 } else {
599 refill(len);
600 return buffer.readArray(data, len);
601 }
602 }
603
605 size_t peekBytes(uint8_t *data, size_t len) {
606 if (buffer.isEmpty()) {
607 refill();
608 }
609 return buffer.peekArray(data, len);
610 }
611
613 int available() override {
614 if (p_in == nullptr) return 0;
615 return buffer.available() + p_in->available();
616 }
617
619 void clear() { buffer.reset(); }
620
622 void resize(int size) { buffer.resize(size); }
623
626 void setMinUnbufferedReadSize(size_t size) { minReadBufferSize = size; }
627
628 protected:
630 Print *p_out = nullptr;
631 Stream *p_in = nullptr;
632 size_t minReadBufferSize = 1024;
633
635 void refill() {
636 // Preserve any existing unread data then append new bytes
637 buffer.trim();
640 if (free_space == 0) {
641 // Buffer full – nothing we can append
642 return;
643 }
644 // Read new data directly behind existing bytes
647 }
648
650 void refill(size_t len) {
651 if (buffer.available() >= len) return;
652 refill();
653 }
654
655 virtual size_t writeExt(const uint8_t *data, size_t len) {
656 return p_out == nullptr ? 0 : p_out->write(data, len);
657 }
658 virtual size_t readExt(uint8_t *data, size_t len) {
659 return p_in == nullptr ? 0 : p_in->readBytes(data, len);
660 }
661};
662
671template <typename T = int16_t>
673 public:
674 ConverterStream() = default;
675
676 ConverterStream(BaseConverter &converter) { setConverter(converter); }
677
678 ConverterStream(Stream &stream, BaseConverter &converter) {
679 setConverter(converter);
680 setStream(stream);
681 }
682
684 setConverter(converter);
685 setOutput(out);
686 }
687
688 void setStream(Stream &stream) {
689 TRACEI();
690 p_stream = &stream;
691 p_out = &stream;
692 }
693
694 void setOutput(Print &out) {
695 TRACEI();
696 p_out = &out;
697 }
698
700
701 virtual int availableForWrite() { return p_out->availableForWrite(); }
702
703 virtual size_t write(const uint8_t *data, size_t len) {
704 size_t result = p_converter->convert((uint8_t *)data, len);
705 if (result > 0) {
706 size_t result_written = p_out->write(data, result);
707 return len * result_written / result;
708 }
709 return 0;
710 }
711
712 size_t readBytes(uint8_t *data, size_t len) override {
713 if (p_stream == nullptr) return 0;
714 size_t result = p_stream->readBytes(data, len);
715 return p_converter->convert(data, result);
716 }
717
719 virtual int available() override {
720 if (p_stream == nullptr) return 0;
721 return p_stream->available();
722 }
723
724 protected:
725 Stream *p_stream = nullptr;
726 Print *p_out = nullptr;
728};
729
737 public:
738 MeasuringStream(int count = 10, Print *logOut = nullptr) {
739 this->count = count;
740 this->max_count = count;
741 p_stream = &null;
742 p_print = &null;
743 start_time = millis();
745 }
746
747 MeasuringStream(Print &print, int count = 10, Print *logOut = nullptr) {
748 this->count = count;
749 this->max_count = count;
750 setOutput(print);
751 start_time = millis();
753 }
754
755 MeasuringStream(Stream &stream, int count = 10, Print *logOut = nullptr) {
756 this->count = count;
757 this->max_count = count;
758 setStream(stream);
759 start_time = millis();
761 }
762
764 void setLogOutput(Print &out) { p_logout = &out; }
765
767 void setStream(Stream &io) override {
768 p_print = &io;
769 p_stream = &io;
770 };
771
773 void setOutput(Print &out) override { p_print = &out; }
774
776 size_t readBytes(uint8_t *data, size_t len) override {
778 return measure(p_stream->readBytes(data, len));
779 }
780
781 int available() override { return p_stream->available(); }
782
784 virtual size_t write(const uint8_t *data, size_t len) override {
786 return measure(p_print->write(data, len));
787 }
788
790 virtual int availableForWrite() override {
791 return p_print->availableForWrite();
792 }
793
796
799 if (frame_size == 0) return 0;
801 }
802
805
810
811 bool begin() override {
814 return AudioStream::begin();
815 }
816
819 return begin();
820 }
821
823 void setFrameSize(int size) { frame_size = size; }
824
827
828 void setName(const char *name) { this->name = name; }
829
832
835
838 if (bytesSinceBegin() == 0) return 0;
839 return static_cast<float>(timeSinceBegin()) / bytesSinceBegin() *
840 totalBytes;
841 }
842
845 if (bytesSinceBegin() == 0) return 0;
846 return estimatedTotalTimeFor(totalBytes) - timeSinceBegin();
847 }
848
852 bool is_regular_update = true;
853 if (pos < total_bytes_since_begin) {
854 begin();
855 is_regular_update = false;
856 }
858 return is_regular_update;
859 }
860
861 protected:
862 int max_count = 0;
863 int count = 0;
864 Stream *p_stream = nullptr;
865 Print *p_print = nullptr;
867 int total_bytes = 0;
869 int frame_size = 0;
871 Print *p_logout = nullptr;
872 bool report_bytes = false;
873 const char *name = "";
876
877 size_t measure(size_t len) {
878 count--;
879 total_bytes += len;
880
881 if (count <= 0) {
883 int time_diff = end_time - start_time; // in ms
884 if (time_diff > 0) {
886 printResult();
888 total_bytes = 0;
890 }
891 }
892 return len;
893 }
894
895 void printResult() {
896 char msg[70];
897 if (report_bytes || frame_size == 0) {
898 snprintf(msg, 70, "%s ==> Bytes per second: %d", name, bytes_per_second);
899 } else {
900 snprintf(msg, 70, "%s ==> Samples per second: %d", name,
902 }
903 if (p_logout != nullptr) {
904 p_logout->println(msg);
905 } else {
906 LOGI("%s", msg);
907 }
908 }
909};
910
918 public:
919 size_t total_size = 0;
920};
929 public:
930 ProgressStream() = default;
931
932 ProgressStream(Print &print) { setPrint(print); }
933
934 ProgressStream(Stream &stream) { setStream(stream); }
935
937 setStream(stream);
938 p_info_from = &stream;
939 }
940
942
947
948 void setStream(Stream &stream) override {
949 p_stream = &stream;
950 p_print = &stream;
951 }
952
953 void setStream(Print &print) { p_print = &print; }
954
955 void setPrint(Print &print) { p_print = &print; }
956
957 bool begin() override {
958 if (p_info_from != nullptr) {
960 }
961 return AudioStream::begin();
962 }
963
966 bool begin(size_t len) {
967 setSize(len);
968 return begin();
969 }
970
974 return begin();
975 }
976
978 void setSize(size_t len) {
979 total_processed = 0;
981 }
982
984 size_t size() { return progress_info.total_size; }
985
987 size_t processedBytes() { return total_processed; }
988
990 size_t processedSecs() { return total_processed / byteRate(); }
991
994
996 size_t totalSecs() { return totalBytes() / byteRate(); }
997
999 float percentage() {
1000 if (progress_info.total_size == 0) return 0;
1001 return 100.0 * total_processed / progress_info.total_size;
1002 }
1003
1005 size_t readBytes(uint8_t *data, size_t len) override {
1006 if (p_stream == nullptr) return 0;
1007 return measure(p_stream->readBytes(data, len));
1008 }
1009
1010 int available() override {
1011 if (p_stream == nullptr) return 0;
1012 return p_stream->available();
1013 }
1014
1016 virtual size_t write(const uint8_t *data, size_t len) override {
1017 if (p_print == nullptr) return 0;
1018 return measure(p_print->write(data, len));
1019 }
1020
1022 virtual int availableForWrite() override {
1023 if (p_print == nullptr) return 0;
1024 return p_print->availableForWrite();
1025 }
1026
1027 protected:
1029 Stream *p_stream = nullptr;
1030 Print *p_print = nullptr;
1033
1034 size_t measure(size_t len) {
1035 total_processed += len;
1036 return len;
1037 }
1038
1039 size_t byteRate() {
1041 int byte_rate = info.sample_rate * info.bits_per_sample * info.channels / 8;
1042 if (byte_rate == 0) {
1043 LOGE("Audio Info not defined");
1044 return 0;
1045 }
1046 return byte_rate;
1047 }
1048};
1049
1055struct ThrottleConfig : public AudioInfo {
1057 sample_rate = 44100;
1058 bits_per_sample = 16;
1059 channels = 2;
1060 }
1062};
1063
1071 public:
1072 Throttle() = default;
1073 Throttle(Print &out) { setOutput(out); }
1075
1077 void setStream(Stream &io) override {
1078 p_out = &io;
1079 p_in = &io;
1080 };
1081
1083 void setOutput(Print &out) override { p_out = &out; }
1084
1087 return c;
1088 }
1089
1091 LOGI("begin sample_rate: %d, channels: %d, bits: %d", (int)info.sample_rate,
1092 (int)info.channels, (int)info.bits_per_sample);
1093 this->info = cfg;
1094 this->cfg = cfg;
1095 return begin();
1096 }
1097
1099 LOGI("begin sample_rate: %d, channels: %d, bits: %d", (int)info.sample_rate,
1100 (int)info.channels, (int)info.bits_per_sample);
1101 this->info = info;
1102 this->cfg.copyFrom(info);
1103 return begin();
1104 }
1105
1106 bool begin() override {
1108 startDelay();
1109 return true;
1110 }
1111
1112 // (re)starts the timing
1113 void startDelay() {
1114 start_time = micros();
1115 sum_frames = 0;
1116 }
1117
1118 int availableForWrite() override {
1119 if (p_out) {
1120 return p_out->availableForWrite();
1121 }
1122 return DEFAULT_BUFFER_SIZE;
1123 }
1124
1125 size_t write(const uint8_t *data, size_t len) override {
1126 size_t result = p_out->write(data, len);
1127 delayBytes(len);
1128 return result;
1129 }
1130
1131 int available() override {
1132 if (p_in == nullptr) return 0;
1133 return p_in->available();
1134 }
1135
1136 size_t readBytes(uint8_t *data, size_t len) override {
1137 if (p_in == nullptr) {
1138 delayBytes(len);
1139 return 0;
1140 }
1141 size_t result = p_in->readBytes(data, len);
1142 delayBytes(len);
1143 return result;
1144 }
1145
1146 // delay
1148
1149 // delay
1150 void delayFrames(size_t frames) {
1151 sum_frames += frames;
1155 LOGD("wait us: %ld", static_cast<long>(waitUs));
1156 if (waitUs > 0) {
1157 int64_t waitMs = waitUs / 1000;
1158 if (waitMs > 0) delay(waitMs);
1159 delayMicroseconds(waitUs - (waitMs * 1000));
1160 } else {
1161 LOGD("negative delay!")
1162 }
1163 }
1164
1165 inline int64_t getDelayUs(uint64_t frames) {
1166 return (frames * 1000000) / cfg.sample_rate;
1167 }
1168
1169 inline int64_t getDelayMs(uint64_t frames) {
1170 return getDelayUs(frames) / 1000;
1171 }
1172
1174 return getDelayUs(frames) / 1000000l;
1175 }
1176
1177 protected:
1181 int frame_size = 0;
1182 Print *p_out = nullptr;
1183 Stream *p_in = nullptr;
1184};
1185
1195template <typename T=int16_t, typename SumT=int>
1196class InputMixer : public AudioStream {
1197 public:
1198 InputMixer() = default;
1199
1201 int add(Stream &in, int weight = 100) {
1202 streams.push_back(&in);
1203 weights.push_back(weight);
1205 return streams.indexOf(&in);
1206 }
1207
1209 bool set(int index, Stream &in) {
1210 if (index < size()) {
1211 streams[index] = &in;
1212 return true;
1213 } else {
1214 LOGE("Invalid index %d - max is %d", index, size() - 1);
1215 return false;
1216 }
1217 }
1218
1219 virtual bool begin(AudioInfo info) {
1222 LOGI("frame_size: %d", frame_size);
1223 return frame_size > 0;
1224 }
1225
1229 void setWeight(int index, int weight) {
1230 if (index < streams.size()) {
1231 weights[index] = weight;
1233 } else {
1234 LOGE("Invalid index %d - max is %d", index, size() - 1);
1235 }
1236 }
1237
1239 void end() override {
1240 streams.clear();
1241 weights.clear();
1242 gains.clear();
1243 result_vect.clear();
1244 current_vect.clear();
1245 total_weights = 0.0;
1246 }
1247
1249 int size() { return streams.size(); }
1250
1252 size_t readBytes(uint8_t *data, size_t len) override {
1253 if (total_weights == 0 || frame_size == 0 || len == 0) {
1254 LOGW("readBytes: %d", (int)len);
1255 return 0;
1256 }
1257
1259 len = min((int)len, availableBytes());
1260 }
1261
1262 int result_len = 0;
1263
1264 if (len > 0) {
1265 // result_len must be full frames
1266 result_len = (len / frame_size) * frame_size;;
1267 // replace sample based with vector based implementation
1268 // readBytesSamples((T*)data, result_len));
1270 }
1271 return result_len;
1272 }
1273
1277
1281
1283 bool remove(int idx) {
1284 if (idx < 0 || idx >= size()) {
1285 return false;
1286 }
1287 streams.erase(idx);
1288 weights.erase(idx);
1290 return true;
1291 }
1292
1294 bool remove() {
1295 bool rc = false;
1296 int idx = nextEmptyIndex();
1297 while (idx >= 0) {
1298 rc = true;
1299 streams.erase(idx);
1300 weights.erase(idx);
1301 idx = nextEmptyIndex();
1302 }
1304 return rc;
1305 }
1306
1308 int indexOf(Stream &stream) { return streams.indexOf(&stream); }
1309
1311 Stream *operator[](int idx) {
1312 if (idx < 0 || idx >= size()) return nullptr;
1313 return streams[idx];
1314 }
1315
1318 for (int i = 0; i < streams.size(); i++) {
1319 if (streams[i]->available() == 0) {
1320 return i;
1321 }
1322 }
1323 return -1;
1324 }
1325
1326 protected:
1331 int frame_size = 4;
1336
1339 int total = 0;
1340 for (int j = 0; j < weights.size(); j++) {
1341 total += weights[j];
1342 }
1343 total_weights = total;
1345 for (int j = 0; j < weights.size(); j++) {
1346 gains[j] = total_weights == 0 ? 0.0f : static_cast<float>(weights[j]) / total_weights;
1347 }
1348 }
1349
1351 int readBytesVector(T *p_data, int byteCount) {
1352 int samples = byteCount / sizeof(T);
1353 if (result_vect.size() < samples) result_vect.resize(samples);
1354 if (current_vect.size() < samples) current_vect.resize(samples);
1355 int stream_count = size();
1356 resultClear(samples);
1357 int samples_eff_max = 0;
1358 for (int j = 0; j < stream_count; j++) {
1359 if (weights[j] > 0) {
1360 int samples_eff =
1361 readSamples(streams[j], current_vect.data(), samples, retry_count);
1364 }
1365 }
1366 // copy result
1367 for (int j = 0; j < samples; j++) {
1368 p_data[j] = result_vect[j];
1369 }
1370 return samples_eff_max * sizeof(T);
1371 }
1372
1375 int result = DEFAULT_BUFFER_SIZE;
1376 for (int j = 0; j < size(); j++) {
1377 result = min(result, streams[j]->available());
1378 }
1379 return result;
1380 }
1381
1382 void resultAdd(float fact, int samples_eff) {
1383 // only accumulate samples that were actually read; tail is already zeroed
1384 for (int j = 0; j < samples_eff; j++) {
1385 result_vect[j] += static_cast<SumT>(current_vect[j] * fact);
1386 }
1387 }
1388
1389 void resultClear(int samples) {
1390 memset(result_vect.data(), 0, sizeof(SumT) * samples);
1391 }
1392};
1393
1403template <typename T>
1404class InputMerge : public AudioStream {
1405 public:
1407 InputMerge() = default;
1408
1412 InputMerge(Stream &left, Stream &right) {
1413 add(left, 1);
1414 add(right, 1);
1415 };
1416
1423
1424 virtual bool begin(AudioInfo info) {
1426 return begin();
1427 }
1428
1429 virtual bool begin() override {
1430 // make sure that we use the correct channel count
1432 return AudioStream::begin();
1433 }
1434
1436 size_t readBytes(uint8_t *data, size_t len) override {
1437 LOGD("readBytes: %d", (int)len);
1438 T *p_data = (T *)data;
1439 int result_len = MIN(available(), len);
1440 int frames = result_len / (sizeof(T) * total_channel_count);
1441 int result_idx = 0;
1442 for (int j = 0; j < frames; j++) {
1443 for (int i = 0; i < records.size(); i++) {
1444 for (int ch = 0; ch < records[i].channels; ch++) {
1445 p_data[result_idx++] =
1446 records[i].weight * readSample<T>(records[i].stream);
1447 }
1448 }
1449 }
1450 return result_idx * sizeof(T);
1451 }
1452
1454 void add(Stream &in, int channelCount, float weight = 1.0) {
1455 MergeRecord rec(&in, channelCount, weight);
1456 records.push_back(rec);
1458 }
1459
1462 void setWeight(int channel, float weight) {
1463 if (channel < channelCount()) {
1464 records[channel].weight = weight;
1465 } else {
1466 LOGE("Invalid channel %d - max is %d", channel, channelCount() - 1);
1467 }
1468 }
1469
1471 void end() override { records.clear(); }
1472
1475
1477 int available() override {
1478 int result = records[0].stream->available();
1479 for (int j = 1; j < channelCount(); j++) {
1480 int tmp = records[j].stream->available();
1481 if (tmp < result) {
1482 result = tmp;
1483 }
1484 }
1485 return result;
1486 }
1487
1488 protected:
1490 Stream *stream = nullptr;
1491 int channels = 0;
1492 float weight = 1.0;
1493 MergeRecord() = default;
1494 MergeRecord(Stream *str, int ch, float w) {
1495 stream = str;
1496 channels = ch;
1497 weight = w;
1498 }
1499 };
1502};
1503
1514 public:
1515 CallbackStream() = default;
1516
1519 CallbackStream(Stream &io, size_t (*cb_update)(uint8_t *data, size_t len)) {
1520 p_stream = &io;
1521 p_out = &io;
1523 }
1524
1526 CallbackStream(Print &out, size_t (*cb_update)(uint8_t *data, size_t len)) {
1527 p_out = &out;
1529 }
1530
1531 CallbackStream(size_t (*cb_read)(uint8_t *data, size_t len),
1532 size_t (*cb_write)(const uint8_t *data, size_t len)) {
1535 }
1536
1537 void setWriteCallback(size_t (*cb_write)(const uint8_t *data, size_t len)) {
1538 this->cb_write = cb_write;
1539 }
1540
1541 void setReadCallback(size_t (*cb_read)(uint8_t *data, size_t len)) {
1542 this->cb_read = cb_read;
1543 }
1544
1545 void setUpdateCallback(size_t (*cb_update)(uint8_t *data, size_t len)) {
1546 this->cb_update = cb_update;
1547 }
1548
1549 // callback result negative -> no change; callbeack result >=0 provides the
1550 // result
1551 void setAvailableCallback(int (*cb)()) { this->cb_available = cb; }
1552
1555 this->cb_audio_info = cb;
1556 }
1557
1559 void setAudioInfo(AudioInfo info) override {
1561 if (cb_audio_info != nullptr) {
1563 }
1564 }
1565
1566 virtual bool begin(AudioInfo info) {
1568 return begin();
1569 }
1570 virtual bool begin() override {
1571 active = true;
1572 return true;
1573 }
1574
1575 void end() override { active = false; }
1576
1577 int available() override {
1578 int result = AudioStream::available();
1579 // determine value from opional variable
1580 if (available_bytes >= 0) return available_bytes;
1581 // check if there is a callback
1582 if (cb_available == nullptr) return result;
1583 // determine value from callback
1585 if (tmp_available < 0) return result;
1586
1587 return tmp_available;
1588 }
1589
1590 size_t readBytes(uint8_t *data, size_t len) override {
1591 if (!active) return 0;
1592 // provide data from callback
1593 if (cb_read) {
1594 return cb_read(data, len);
1595 }
1596 // provide data from source
1597 size_t result = 0;
1598 if (p_stream) {
1599 result = p_stream->readBytes(data, len);
1600 }
1601 if (cb_update) {
1602 result = cb_update(data, result);
1603 }
1604 return result;
1605 }
1606
1607 size_t write(const uint8_t *data, size_t len) override {
1608 if (!active) return 0;
1609 // write to callback
1610 if (cb_write) {
1611 return cb_write(data, len);
1612 }
1613 // write to output
1614 if (p_out) {
1615 size_t result = len;
1616 if (cb_update) {
1617 result = cb_update((uint8_t *)data, len);
1618 }
1619 return p_out->write(data, result);
1620 }
1621 // no processing possible
1622 return 0;
1623 }
1624
1626 void setStream(Stream &in) override {
1627 p_stream = &in;
1628 p_out = &in;
1629 }
1630
1632 void setOutput(Print &out) override { p_out = &out; }
1633
1635 void setOutput(Stream &in) {
1636 p_stream = &in;
1637 p_out = &in;
1638 }
1639
1641 void setStream(Print &out) { p_out = &out; }
1642
1645
1646 protected:
1647 bool active = true;
1648 size_t (*cb_write)(const uint8_t *data, size_t len) = nullptr;
1649 size_t (*cb_read)(uint8_t *data, size_t len) = nullptr;
1650 size_t (*cb_update)(uint8_t *data, size_t len) = nullptr;
1652 int (*cb_available)() = nullptr;
1653 Stream *p_stream = nullptr;
1654 Print *p_out = nullptr;
1656};
1657
1665template <typename T = int16_t, class TF = float>
1667 public:
1668 FilteredStream() = default;
1671 this->channels = channels;
1672 setStream(stream);
1674 }
1677 this->channels = channels;
1678 setOutput(stream);
1680 }
1681
1682 virtual ~FilteredStream() { end(); }
1683
1684 void setStream(Stream &stream) override {
1685 p_stream = &stream;
1686 p_print = &stream;
1687 }
1688
1689 void setOutput(Print &stream) override { p_print = &stream; }
1690
1693 this->channels = info.channels;
1694 if (p_converter != nullptr && p_converter->getChannels() != channels) {
1695 LOGE("Inconsistent number of channels");
1696 return false;
1697 }
1698 return begin();
1699 }
1700
1701 bool begin() override {
1702 if (channels == 0) {
1703 LOGE("channels must not be 0");
1704 return false;
1705 }
1706 if (p_converter == nullptr) {
1708 }
1709 return AudioStream::begin();
1710 }
1711
1712 void end() override {
1714 if (p_converter != nullptr) {
1715 delete p_converter;
1716 p_converter = nullptr;
1717 }
1718 }
1719
1720 virtual size_t write(const uint8_t *data, size_t len) override {
1721 if (p_converter == nullptr) return 0;
1722 size_t result = p_converter->convert((uint8_t *)data, len);
1723 return p_print->write(data, result);
1724 }
1725
1726 size_t readBytes(uint8_t *data, size_t len) override {
1727 if (p_converter == nullptr) return 0;
1728 if (p_stream == nullptr) return 0;
1729 size_t result = p_stream->readBytes(data, len);
1730 result = p_converter->convert(data, result);
1731 return result;
1732 }
1733
1734 virtual int available() override {
1735 if (p_stream == nullptr) return 0;
1736 return p_stream->available();
1737 }
1738
1739 virtual int availableForWrite() override {
1740 return p_print->availableForWrite();
1741 }
1742
1746 void setFilter(int channel, Filter<TF> *filter) {
1747 if (p_converter != nullptr) {
1748 p_converter->setFilter(channel, filter);
1749 } else {
1750 LOGE("p_converter is null");
1751 }
1752 }
1753
1757 void setFilter(int channel, Filter<TF> &filter) {
1758 setFilter(channel, &filter);
1759 }
1760
1761 protected:
1762 int channels = 0;
1763 Stream *p_stream = nullptr;
1764 Print *p_print = nullptr;
1766};
1767
1769using ActivityCallback = void (*)(bool isActive);
1770
1781 public:
1782 VolumeMeter() = default;
1785 VolumeMeter(Print &print) { setOutput(print); }
1786 VolumeMeter(Stream &stream) { setStream(stream); }
1787
1790 return begin();
1791 }
1792
1793 bool begin() override {
1795 return true;
1796 }
1797
1798 void setAudioInfo(AudioInfo info) override {
1799 int channels = info.channels;
1800 LOGI("VolumeMeter::setAudioInfo: channels %d", channels);
1802 if (channels > 0) {
1803 volumes.resize(channels);
1804 volumes_tmp.resize(channels);
1805 sum.resize(channels);
1806 sum_tmp.resize(channels);
1807 }
1808 }
1809
1810 size_t write(const uint8_t *data, size_t len) override {
1811 updateVolumes(data, len);
1812 size_t result = len;
1813 if (p_out != nullptr) {
1814 result = p_out->write(data, len);
1815 }
1816 return result;
1817 }
1818
1819 size_t readBytes(uint8_t *data, size_t len) override {
1820 if (p_stream == nullptr) return 0;
1821 size_t result = p_stream->readBytes(data, len);
1822 updateVolumes((const uint8_t *)data, len);
1823 return result;
1824 }
1825
1828 float volume() { return f_volume; }
1829
1832 float volume(int channel) {
1833 if (volumes.size() == 0) {
1834 LOGE("begin not called!");
1835 return 0.0f;
1836 }
1837 if (channel >= volumes.size()) {
1838 LOGE("invalid channel %d", channel);
1839 return 0.0f;
1840 }
1841 return volumes[channel];
1842 }
1843
1848
1850 float volumeRatio(int channel) {
1852 }
1853
1855 float volumeDB() {
1856 // prevent infinite value
1857 if (volumeRatio() == 0) return -1000;
1858 return 20.0f * log10(volumeRatio());
1859 }
1860
1862 float volumeDB(int channel) {
1863 // prevent infinite value
1864 if (volumeRatio(channel) == 0) return -1000;
1865 return 20.0f * log10(volumeRatio(channel));
1866 }
1867
1869 float volumePercent() { return 100.0f * volumeRatio(); }
1870
1872 float volumePercent(int channel) { return 100.0f * volumeRatio(channel); }
1873
1875 float volumeAvg() {
1876 float total = 0;
1877 size_t count = 0;
1878 for (int j = 0; j < info.channels; j++) {
1879 total += sum[j];
1880 count += sample_count_per_channel;
1881 }
1882 return total / count;
1883 }
1884
1886 float volumeAvg(int channel) {
1887 return sum[channel] / sample_count_per_channel;
1888 }
1889
1891 void clear() {
1892 f_volume_tmp = 0;
1893 for (int j = 0; j < info.channels; j++) {
1894 volumes_tmp[j] = 0;
1895 sum_tmp[j] = 0;
1896 }
1897 }
1898
1903 void setActivityCallback(ActivityCallback callback, float threshold = 0.2, unsigned long duration_ms = 2000) {
1904 activity_callback = callback;
1905 activity_threshold = threshold;
1906 activity_duration_ms = duration_ms;
1907 activity_monitoring_enabled = (callback != nullptr);
1908 }
1909
1912 bool isActive() const {
1913 return is_active;
1914 }
1915
1918 setOutput((Print &)out);
1919 }
1922 setStream((Stream &)io);
1923 }
1924 void setOutput(Print &out) override { p_out = &out; }
1925 void setStream(Stream &io) override {
1926 p_out = &io;
1927 p_stream = &io;
1928 }
1929
1930 protected:
1931 float f_volume_tmp = 0;
1932 float f_volume = 0;
1937 Print *p_out = nullptr;
1938 Stream *p_stream = nullptr;
1940
1941 // Activity monitoring
1944 unsigned long activity_duration_ms = 0;
1946 bool is_active = false;
1947 unsigned long inactive_start_time = 0;
1948
1949 void updateVolumes(const uint8_t *data, size_t len) {
1950 if (data == nullptr || len == 0) return;
1951 clear();
1952 switch (info.bits_per_sample) {
1953 case 8:
1954 updateVolumesT<int8_t>(data, len);
1955 break;
1956 case 16:
1957 updateVolumesT<int16_t>(data, len);
1958 break;
1959 case 24:
1960 updateVolumesT<int24_t>(data, len);
1961 break;
1962 case 32:
1963 updateVolumesT<int32_t>(data, len);
1964 break;
1965 default:
1966 LOGE("Unsupported bits_per_sample: %d", info.bits_per_sample);
1967 break;
1968 }
1969 }
1970
1971 template <typename T>
1972 void updateVolumesT(const uint8_t *buffer, size_t size) {
1973 T *bufferT = (T *)buffer;
1974 int samplesCount = size / sizeof(T);
1976 for (int j = 0; j < samplesCount; j++) {
1977 float tmp = abs(static_cast<float>(bufferT[j]));
1978 updateVolume(tmp, j);
1979 }
1980 commit();
1981 }
1982
1983 void updateVolume(float tmp, int j) {
1984 if (tmp > f_volume_tmp) {
1985 f_volume_tmp = tmp;
1986 }
1987 if (volumes_tmp.size() > 0 && info.channels > 0) {
1988 int ch = j % info.channels;
1989 if (tmp > volumes_tmp[ch]) {
1990 volumes_tmp[ch] = tmp;
1991 sum_tmp[ch] = tmp;
1992 }
1993 }
1994 }
1995
1996 void commit() {
1998 for (int j = 0; j < info.channels; j++) {
1999 volumes[j] = volumes_tmp[j];
2000 sum[j] = sum_tmp[j];
2001 }
2003 }
2004
2006 if (!activity_monitoring_enabled || activity_callback == nullptr) return;
2007
2010 unsigned long current_time = millis();
2011
2012 if (above_threshold) {
2013 // Volume is above threshold - should be active
2014 if (!is_active) {
2015 is_active = true;
2016 activity_callback(true);
2017 }
2018 inactive_start_time = 0; // Reset inactive timer
2019 } else {
2020 // Volume is below threshold
2021 if (is_active) {
2022 // Currently active, check if we should transition to inactive
2023 if (inactive_start_time == 0) {
2024 // Start timing the inactive period
2025 inactive_start_time = current_time;
2026 } else if (current_time - inactive_start_time >= activity_duration_ms) {
2027 // Been below threshold long enough
2028 is_active = false;
2029 activity_callback(false);
2031 }
2032 }
2033 }
2034 }
2035};
2036
2037// legacy names
2041
2045
2059 public:
2109
2115
2123 return begin();
2124 }
2125
2130 bool begin() override {
2132 return true;
2133 }
2134
2143
2150 size_t write(const uint8_t *data, size_t len) override {
2151 size_t result = volume_meter.write(data, len);
2152 if (result > 0 && volume_meter.volumePercent() > limit_percent) {
2154 }
2155 return result;
2156 }
2157
2164 size_t readBytes(uint8_t *data, size_t len) override {
2165 size_t result = volume_meter.readBytes(data, len);
2166 if (result > 0 && volume_meter.volumePercent() > limit_percent) {
2168 }
2169 return result;
2170 }
2171
2176 void setOutput(Print &out) override { volume_meter.setOutput(out); }
2186 void setStream(Stream &io) override { volume_meter.setStream(io); }
2192
2198
2204 bool isActive(uint16_t time_ms = 1000) {
2205 return (millis() - time_over_last_volume_limit) < time_ms;
2206 }
2207
2208protected:
2212};
2213
2214#ifdef USE_TIMER
2229
2230// forward declaration: relevant only if use_timer == true
2231static void timerCallback(void *obj);
2242 friend void timerCallback(void *obj);
2243
2244 public:
2246
2248 TRACED();
2249 if (timer != nullptr) delete timer;
2250 if (buffer != nullptr) delete buffer;
2251 if (frame != nullptr) delete[] frame;
2252 }
2253
2259
2273
2277
2279 LOGD("%s: %s", LOG_METHOD,
2280 config.rx_tx_mode == RX_MODE ? "RX_MODE" : "TX_MODE");
2281 this->cfg = config;
2282 this->frameCallback = config.callback;
2283 if (cfg.use_timer) {
2285 frame = new uint8_t[frameSize];
2287 timer = new TimerAlarmRepeating();
2289 if (cfg.timer_id >= 0) {
2291 }
2293 LOGI("sample_rate: %u -> time: %u milliseconds",
2294 (unsigned int)cfg.sample_rate, (unsigned int)time);
2297 }
2298
2300 active = true;
2301 }
2302
2304 bool begin() {
2305 TRACED();
2306 if (this->frameCallback != nullptr) {
2307 if (cfg.use_timer) {
2308 timer->begin(timerCallback, time, TimeUnit::US);
2309 }
2310 active = true;
2311 }
2312 return active;
2313 }
2314
2316 void end() {
2317 TRACED();
2318 if (cfg.use_timer) {
2319 timer->end();
2320 }
2321 active = false;
2322 }
2323
2326
2327 protected:
2329 bool active = false;
2331 // below only relevant with timer
2334 uint8_t *frame = nullptr;
2337 unsigned long lastTimestamp = 0u;
2340
2341 // used for audio sink
2342 virtual size_t writeExt(const uint8_t *data, size_t len) override {
2343 if (!active) return 0;
2344 TRACED();
2345 size_t result = 0;
2346 if (!cfg.use_timer) {
2347 result = frameCallback((uint8_t *)data, len);
2348 } else {
2349 result = buffer->writeArray((uint8_t *)data, len);
2350 }
2351 if (++printCount % 10000 == 0) printSampleRate();
2352 return result;
2353 }
2354
2355 // used for audio source
2356 virtual size_t readExt(uint8_t *data, size_t len) override {
2357 if (!active) return 0;
2358 TRACED();
2359
2360 size_t result = 0;
2361 if (!cfg.use_timer) {
2362 result = frameCallback(data, len);
2363 } else {
2364 result = buffer->readArray(data, len);
2365 }
2366 if (++printCount % 10000 == 0) printSampleRate();
2367 return result;
2368 }
2369
2371 virtual void measureSampleRate() {
2372 unsigned long ms = millis();
2373 if (lastTimestamp > 0u) {
2375 if (diff > 0) {
2376 uint16_t rate = 1 * 1000 / diff;
2377
2378 if (currentRateValue == 0) {
2379 currentRateValue = rate;
2380 } else {
2381 currentRateValue = (currentRateValue + rate) / 2;
2382 }
2383 }
2384 }
2385 lastTimestamp = ms;
2386 }
2387
2389 virtual void printSampleRate() {
2390 LOGI("effective sample rate: %u", (unsigned int)currentRateValue);
2391 if (cfg.adapt_sample_rate &&
2392 abs((int)currentRateValue - (int)cfg.sample_rate) > 200) {
2395 }
2396 }
2397};
2398
2399// relevant only if use_timer == true
2402 if (src != nullptr) {
2403 // LOGD("%s: %s", LOG_METHOD, src->cfg.rx_tx_mode==RX_MODE ?
2404 // "RX_MODE":"TX_MODE");
2405 if (src->cfg.rx_tx_mode == RX_MODE) {
2406 // input
2407 uint16_t available_bytes = src->frameCallback(src->frame, src->frameSize);
2408 uint16_t buffer_available = src->buffer->availableForWrite();
2409 if (buffer_available < available_bytes) {
2410 // if buffer is full make space
2411 uint16_t to_clear = available_bytes - buffer_available;
2412 uint8_t tmp[to_clear];
2413 src->buffer->readArray(tmp, to_clear);
2414 }
2415 if (src->buffer->writeArray(src->frame, available_bytes) !=
2416 available_bytes) {
2417 assert(false);
2418 }
2419 } else {
2420 // output
2421 if (src->buffer != nullptr && src->frame != nullptr &&
2422 src->frameSize > 0) {
2423 uint16_t available_bytes =
2424 src->buffer->readArray(src->frame, src->frameSize);
2425 if (available_bytes !=
2426 src->frameCallback(src->frame, available_bytes)) {
2427 LOGE("data underflow");
2428 }
2429 }
2430 }
2431 src->measureSampleRate();
2432 }
2433}
2434
2435#endif
2436
2437} // namespace audio_tools
#define LOGW(...)
Definition AudioLoggerIDF.h:29
#define TRACEI()
Definition AudioLoggerIDF.h:32
#define TRACED()
Definition AudioLoggerIDF.h:31
#define LOGI(...)
Definition AudioLoggerIDF.h:28
#define LOGD(...)
Definition AudioLoggerIDF.h:27
#define LOGE(...)
Definition AudioLoggerIDF.h:30
#define IRAM_ATTR
Definition AudioStreams.h:13
#define LOG_METHOD
Definition AudioToolsConfig.h:64
#define MIN(A, B)
Definition AudioTypes.h:17
void loop()
#define DEFAULT_BUFFER_SIZE
Definition avr.h:20
#define assert(T)
Definition avr.h:10
void notifyAudioChange(AudioInfo info)
Definition AudioTypes.h:178
virtual void addNotifyAudioChange(AudioInfoSupport &bi)
Adds target to be notified about audio changes.
Definition AudioTypes.h:153
Supports changes to the sampling rate, bits and channels.
Definition AudioTypes.h:135
virtual AudioInfo audioInfo()=0
provides the actual input AudioInfo
virtual void setAudioInfo(AudioInfo info)=0
Defines the input AudioInfo.
Monitors audio input and reports if the volume exceeds a specified limit within a given period.
Definition AudioStreams.h:2058
void setOutput(Print &out) override
Set the output target.
Definition AudioStreams.h:2176
void setStream(AudioStream &io)
Set the input stream.
Definition AudioStreams.h:2191
AudioInputMonitor(AudioOutput &ao, uint8_t limitPercent=20)
Construct a new AudioInputMonitor with an output.
Definition AudioStreams.h:2082
uint8_t limit_percent
Threshold percent.
Definition AudioStreams.h:2210
AudioInputMonitor(Print &print, uint8_t limitPercent=20)
Construct a new AudioInputMonitor with a Print output.
Definition AudioStreams.h:2091
bool isActive(uint16_t time_ms=1000)
Returns true if the volume exceeded the limit during the last period.
Definition AudioStreams.h:2204
VolumeMeter volume_meter
Volume calculation.
Definition AudioStreams.h:2209
AudioInputMonitor(uint8_t limitPercent=20)
Construct a new AudioInputMonitor with a volume limit in percent.
Definition AudioStreams.h:2064
void setOutput(AudioOutput &out)
Set the output target.
Definition AudioStreams.h:2181
size_t readBytes(uint8_t *data, size_t len) override
Read audio data from the monitor (same as VolumeMeter)
Definition AudioStreams.h:2164
uint64_t time_over_last_volume_limit
Last over-limit time (ms)
Definition AudioStreams.h:2211
VolumeMeter & getVolumeMeter()
Access the underlying VolumeMeter.
Definition AudioStreams.h:2197
size_t write(const uint8_t *data, size_t len) override
Write audio data to the monitor (same as VolumeMeter)
Definition AudioStreams.h:2150
uint8_t limitPercent() const
Get the current volume threshold as percent.
Definition AudioStreams.h:2114
AudioInputMonitor(Stream &stream, uint8_t limitPercent=20)
Construct a new AudioInputMonitor with a Stream input.
Definition AudioStreams.h:2100
bool begin() override
Begin processing with the current audio information.
Definition AudioStreams.h:2130
void setAudioInfo(AudioInfo info) override
Set the audio information.
Definition AudioStreams.h:2139
void setStream(Stream &io) override
Set the input stream.
Definition AudioStreams.h:2186
void setLimitPercent(uint8_t percent)
Set the volume threshold as percent.
Definition AudioStreams.h:2108
bool begin(AudioInfo info)
Begin processing with the given audio information.
Definition AudioStreams.h:2121
AudioInputMonitor(AudioStream &as, uint8_t limitPercent=20)
Construct a new AudioInputMonitor with an input stream.
Definition AudioStreams.h:2073
Abstract Audio Ouptut class.
Definition AudioOutput.h:25
Base class for all Audio Streams. It support the boolean operator to test if the object is ready with...
Definition BaseStream.h:123
AudioInfo info
Definition BaseStream.h:174
virtual void setAudioInfo(AudioInfo newInfo) override
Defines the input AudioInfo.
Definition BaseStream.h:131
virtual AudioInfo audioInfo() override
provides the actual input AudioInfo
Definition BaseStream.h:154
To be used to support implementations where the readBytes is not virtual.
Definition AudioStreams.h:23
AudioStreamWrapper(Stream &s)
Definition AudioStreams.h:25
virtual size_t readBytes(uint8_t *data, size_t len)
Definition AudioStreams.h:34
int32_t clientTimeout
Definition AudioStreams.h:58
int available()
Definition AudioStreams.h:44
virtual int availableForWrite()
Definition AudioStreams.h:52
virtual bool begin()
Definition AudioStreams.h:31
Stream * p_stream
Definition AudioStreams.h:57
virtual size_t write(const uint8_t *data, size_t len)
Definition AudioStreams.h:48
int peek()
Definition AudioStreams.h:42
int read()
Definition AudioStreams.h:40
virtual size_t write(uint8_t c)
Definition AudioStreams.h:46
virtual void flush()
Definition AudioStreams.h:54
virtual void end()
Definition AudioStreams.h:32
static uint32_t toTimeUs(uint32_t samplingRate, uint8_t limit=10)
converts sampling rate to delay in microseconds (μs)
Definition AudioTypes.h:242
virtual int readArray(T data[], int len)
reads multiple values
Definition Buffers.h:33
virtual int writeArray(const T data[], int len)
Fills the buffer data.
Definition Buffers.h:55
bool isEmpty()
Definition Buffers.h:86
Abstract Base class for Converters A converter is processing the data in the indicated array.
Definition BaseConverter.h:24
virtual size_t convert(uint8_t *src, size_t size)=0
virtual bool begin()
Definition BaseStream.h:43
virtual void end()
Definition BaseStream.h:44
virtual int available() override
Definition BaseStream.h:58
The Arduino Stream supports operations on single characters. This is usually not the best way to push...
Definition AudioStreams.h:509
void flush() override
empties the buffer
Definition AudioStreams.h:566
void setOutput(Print &out) override
Defines/Changes the output target.
Definition AudioStreams.h:540
size_t minReadBufferSize
Definition AudioStreams.h:632
virtual size_t readExt(uint8_t *data, size_t len)
Definition AudioStreams.h:658
void setMinUnbufferedReadSize(size_t size)
Definition AudioStreams.h:626
size_t write(uint8_t c) override
writes a byte to the buffer
Definition AudioStreams.h:548
Stream * p_in
Definition AudioStreams.h:631
virtual size_t writeExt(const uint8_t *data, size_t len)
Definition AudioStreams.h:655
size_t readBytes(uint8_t *data, size_t len) override
Use this method !!
Definition AudioStreams.h:595
int peek() override
peeks a byte - to be avoided
Definition AudioStreams.h:585
void refill()
refills the buffer with data from the source
Definition AudioStreams.h:635
BufferedStream(Print &out, size_t buffer_size=1024)
Definition AudioStreams.h:516
int available() override
Returns the available bytes.
Definition AudioStreams.h:613
void setStream(Print &out)
Definition AudioStreams.h:541
size_t write(const uint8_t *data, size_t len) override
Use this method: write an array.
Definition AudioStreams.h:556
size_t peekBytes(uint8_t *data, size_t len)
Provides data w/o consuming.
Definition AudioStreams.h:605
Print * p_out
Definition AudioStreams.h:630
BufferedStream(size_t buffer_size)
Definition AudioStreams.h:511
SingleBuffer< uint8_t > buffer
Definition AudioStreams.h:629
void clear()
Clears all the data in the buffer.
Definition AudioStreams.h:619
int read() override
reads a byte - to be avoided
Definition AudioStreams.h:575
BufferedStream(Stream &io, size_t buffer_size=1024)
Definition AudioStreams.h:522
void refill(size_t len)
refill only if not enough data
Definition AudioStreams.h:650
void resize(int size)
Resize the buffer.
Definition AudioStreams.h:622
void setStream(Stream &io) override
Defines/Changes the input & output.
Definition AudioStreams.h:542
BufferedStream(size_t buffer_size, Print &out)
Definition AudioStreams.h:528
BufferedStream(size_t buffer_size, Stream &io)
Definition AudioStreams.h:534
CallbackStream: A Stream that allows to register callback methods for accessing and providing data....
Definition AudioStreams.h:1513
bool active
Definition AudioStreams.h:1647
void setOutput(Print &out) override
Defines/Changes the output target.
Definition AudioStreams.h:1632
void setOutput(Stream &in)
same as setStream
Definition AudioStreams.h:1635
CallbackStream(Print &out, size_t(*cb_update)(uint8_t *data, size_t len))
Allows to change the audio before sending it to the output.
Definition AudioStreams.h:1526
size_t(* cb_read)(uint8_t *data, size_t len)
Definition AudioStreams.h:1649
virtual bool begin(AudioInfo info)
Definition AudioStreams.h:1566
size_t readBytes(uint8_t *data, size_t len) override
Definition AudioStreams.h:1590
virtual bool begin() override
Definition AudioStreams.h:1570
void setReadCallback(size_t(*cb_read)(uint8_t *data, size_t len))
Definition AudioStreams.h:1541
void end() override
Definition AudioStreams.h:1575
int available() override
Definition AudioStreams.h:1577
void setStream(Print &out)
same as set Output
Definition AudioStreams.h:1641
size_t(* cb_write)(const uint8_t *data, size_t len)
Definition AudioStreams.h:1648
size_t write(const uint8_t *data, size_t len) override
Definition AudioStreams.h:1607
CallbackStream(size_t(*cb_read)(uint8_t *data, size_t len), size_t(*cb_write)(const uint8_t *data, size_t len))
Definition AudioStreams.h:1531
void setAvailableCallback(int(*cb)())
Definition AudioStreams.h:1551
Stream * p_stream
Definition AudioStreams.h:1653
void(* cb_audio_info)(AudioInfo info)
Definition AudioStreams.h:1651
void setAvailable(int val)
optioinally define available bytes for next read
Definition AudioStreams.h:1644
Print * p_out
Definition AudioStreams.h:1654
int available_bytes
Definition AudioStreams.h:1655
int(* cb_available)()
Definition AudioStreams.h:1652
void setAudioInfo(AudioInfo info) override
Updates the audio info and calls the callback.
Definition AudioStreams.h:1559
void setStream(Stream &in) override
Defines/Changes the input & output.
Definition AudioStreams.h:1626
size_t(* cb_update)(uint8_t *data, size_t len)
Definition AudioStreams.h:1650
CallbackStream(Stream &io, size_t(*cb_update)(uint8_t *data, size_t len))
Definition AudioStreams.h:1519
void setWriteCallback(size_t(*cb_write)(const uint8_t *data, size_t len))
Definition AudioStreams.h:1537
void setAudioInfoCallback(void(*cb)(AudioInfo info))
defines the callback to receive the actual audio info
Definition AudioStreams.h:1554
void setUpdateCallback(size_t(*cb_update)(uint8_t *data, size_t len))
Definition AudioStreams.h:1545
Converter for n Channels which applies the indicated Filter.
Definition BaseConverter.h:1690
Both the data of the read or write operations will be converted with the help of the indicated conver...
Definition AudioStreams.h:672
BaseConverter * p_converter
Definition AudioStreams.h:727
void setConverter(BaseConverter &cnv)
Definition AudioStreams.h:699
ConverterStream(Stream &stream, BaseConverter &converter)
Definition AudioStreams.h:678
ConverterStream(BaseConverter &converter)
Definition AudioStreams.h:676
virtual int availableForWrite()
Definition AudioStreams.h:701
size_t readBytes(uint8_t *data, size_t len) override
Definition AudioStreams.h:712
void setStream(Stream &stream)
Defines/Changes the input & output.
Definition AudioStreams.h:688
Stream * p_stream
Definition AudioStreams.h:725
virtual size_t write(const uint8_t *data, size_t len)
Definition AudioStreams.h:703
Print * p_out
Definition AudioStreams.h:726
void setOutput(Print &out)
Defines/Changes the output target.
Definition AudioStreams.h:694
ConverterStream(Print &out, BaseConverter &converter)
Definition AudioStreams.h:683
virtual int available() override
Returns the available bytes in the buffer: to be avoided.
Definition AudioStreams.h:719
Abstract filter interface definition;.
Definition Filter.h:28
Stream to which we can apply Filters for each channel. The filter might change the result size!
Definition AudioStreams.h:1666
virtual size_t write(const uint8_t *data, size_t len) override
Definition AudioStreams.h:1720
void setStream(Stream &stream) override
Defines/Changes the input & output.
Definition AudioStreams.h:1684
ConverterNChannels< T, TF > * p_converter
Definition AudioStreams.h:1765
int channels
Definition AudioStreams.h:1762
virtual ~FilteredStream()
Definition AudioStreams.h:1682
size_t readBytes(uint8_t *data, size_t len) override
Definition AudioStreams.h:1726
void setOutput(Print &stream) override
Defines/Changes the output target.
Definition AudioStreams.h:1689
void setFilter(int channel, Filter< TF > &filter)
Definition AudioStreams.h:1757
void end() override
Definition AudioStreams.h:1712
virtual int availableForWrite() override
Definition AudioStreams.h:1739
FilteredStream(Stream &stream, int channels)
Definition AudioStreams.h:1670
Stream * p_stream
Definition AudioStreams.h:1763
FilteredStream(Stream &stream)
Definition AudioStreams.h:1669
void setFilter(int channel, Filter< TF > *filter)
Definition AudioStreams.h:1746
FilteredStream(Print &stream, int channels)
Definition AudioStreams.h:1676
bool begin() override
Definition AudioStreams.h:1701
FilteredStream(Print &stream)
Definition AudioStreams.h:1675
Print * p_print
Definition AudioStreams.h:1764
bool begin(AudioInfo info)
Definition AudioStreams.h:1691
virtual int available() override
Definition AudioStreams.h:1734
Source for reading generated tones. Please note.
Definition AudioStreams.h:397
bool active
Definition AudioStreams.h:494
void flush() override
Definition AudioStreams.h:488
void setInput(SoundGenerator< T > &generator)
Definition AudioStreams.h:406
const char * source_not_defined_error
Definition AudioStreams.h:498
void setAudioInfo(AudioInfo newInfo) override
Defines the input AudioInfo.
Definition AudioStreams.h:418
void resize(int maxReadSize)
Redefine the buffer size which is reported in available()
Definition AudioStreams.h:491
size_t readBytes(uint8_t *data, size_t len) override
privide the data as byte stream
Definition AudioStreams.h:472
void end() override
stop the processing
Definition AudioStreams.h:452
AudioInfo defaultConfig()
Definition AudioStreams.h:410
GeneratedSoundStream(SoundGenerator< T > &generator)
Definition AudioStreams.h:401
bool isActive()
Definition AudioStreams.h:481
bool begin() override
start the processing
Definition AudioStreams.h:426
AudioInfo audioInfo() override
provides the actual input AudioInfo
Definition AudioStreams.h:460
int buffer_size
Definition AudioStreams.h:496
bool begin(AudioInfo cfg)
start the processing
Definition AudioStreams.h:439
virtual int available() override
This is unbounded so we just return the buffer size.
Definition AudioStreams.h:469
SoundGenerator< T > * p_generator
Definition AudioStreams.h:495
Merges multiple input streams. So if you provide 2 mono channels you get a stereo signal as result wi...
Definition AudioStreams.h:1404
InputMerge()=default
Default constructor.
int total_channel_count
Definition AudioStreams.h:1501
virtual bool begin(AudioInfo info)
Definition AudioStreams.h:1424
size_t readBytes(uint8_t *data, size_t len) override
Provides the data from all streams mixed together.
Definition AudioStreams.h:1436
virtual bool begin() override
Definition AudioStreams.h:1429
Vector< MergeRecord > records
Definition AudioStreams.h:1500
void end() override
Remove all input streams.
Definition AudioStreams.h:1471
int available() override
Provides the min available data from all streams.
Definition AudioStreams.h:1477
void add(Stream &in, int channelCount, float weight=1.0)
Adds a new input stream with 1 channel.
Definition AudioStreams.h:1454
void setWeight(int channel, float weight)
Definition AudioStreams.h:1462
int channelCount()
Number of channels to which are mixed together = number of result channels.
Definition AudioStreams.h:1474
InputMerge(Stream &left, Stream &right)
Constructor for stereo signal from to mono input stream.
Definition AudioStreams.h:1412
AudioInfo audioInfo() override
Provides the audio info with the total channel count.
Definition AudioStreams.h:1418
MixerStream is mixing the input from Multiple Input Streams. All streams must have the same audo form...
Definition AudioStreams.h:1196
bool limit_available_data
Definition AudioStreams.h:1332
bool remove()
Removes all streams which have no data available.
Definition AudioStreams.h:1294
Vector< float > gains
Definition AudioStreams.h:1329
int nextEmptyIndex()
Provides you the index of the next empty stream. -1 when none is found.
Definition AudioStreams.h:1317
virtual bool begin(AudioInfo info)
Definition AudioStreams.h:1219
int indexOf(Stream &stream)
Provides the actual index of the stream.
Definition AudioStreams.h:1308
bool set(int index, Stream &in)
Replaces a stream at the indicated index.
Definition AudioStreams.h:1209
size_t readBytes(uint8_t *data, size_t len) override
Provides the data from all streams mixed together.
Definition AudioStreams.h:1252
void recalculateWeights()
Recalculate the weights.
Definition AudioStreams.h:1338
int add(Stream &in, int weight=100)
Adds a new input stream and returns it's actual index position.
Definition AudioStreams.h:1201
void resultAdd(float fact, int samples_eff)
Definition AudioStreams.h:1382
void end() override
Remove all input streams.
Definition AudioStreams.h:1239
bool remove(int idx)
Removes a stream by index position.
Definition AudioStreams.h:1283
Vector< int > weights
Definition AudioStreams.h:1328
int retry_count
Definition AudioStreams.h:1333
Vector< Stream * > streams
Definition AudioStreams.h:1327
int availableBytes()
Provides the available bytes from the first stream with data.
Definition AudioStreams.h:1374
void setLimitToAvailableData(bool flag)
Definition AudioStreams.h:1276
Vector< SumT > result_vect
Definition AudioStreams.h:1334
void setRetryCount(int retry)
Definition AudioStreams.h:1280
int total_weights
Definition AudioStreams.h:1330
Vector< T > current_vect
Definition AudioStreams.h:1335
int readBytesVector(T *p_data, int byteCount)
mixing using a vector of samples
Definition AudioStreams.h:1351
void resultClear(int samples)
Definition AudioStreams.h:1389
void setWeight(int index, int weight)
Definition AudioStreams.h:1229
int frame_size
Definition AudioStreams.h:1331
Stream * operator[](int idx)
Provides the stream pointer at the indicated index.
Definition AudioStreams.h:1311
int size()
Number of stremams to which are mixed together.
Definition AudioStreams.h:1249
Class which measures the thruput.
Definition AudioStreams.h:736
virtual size_t write(const uint8_t *data, size_t len) override
Writes raw PCM audio data, which will be the input for the volume control.
Definition AudioStreams.h:784
void setOutput(Print &out) override
Defines/Changes the output target.
Definition AudioStreams.h:773
uint32_t estimatedTotalTimeFor(uint32_t totalBytes)
Provides the estimated runtime in milliseconds for the indicated total.
Definition AudioStreams.h:837
bool report_bytes
Definition AudioStreams.h:872
uint32_t ms_at_begin
Definition AudioStreams.h:874
uint32_t start_time
Definition AudioStreams.h:866
uint32_t timeSinceBegin()
Provides the time in ms since the last call of begin()
Definition AudioStreams.h:831
size_t readBytes(uint8_t *data, size_t len) override
Provides the data from all streams mixed together.
Definition AudioStreams.h:776
MeasuringStream(Stream &stream, int count=10, Print *logOut=nullptr)
Definition AudioStreams.h:755
int framesPerSecond()
Returns the actual thrughput in frames (samples) per second.
Definition AudioStreams.h:798
uint32_t bytesSinceBegin()
Provides the total processed bytes since the last call of begin()
Definition AudioStreams.h:834
int available() override
Definition AudioStreams.h:781
virtual int availableForWrite() override
Provides the nubmer of bytes we can write.
Definition AudioStreams.h:790
MeasuringStream(int count=10, Print *logOut=nullptr)
Definition AudioStreams.h:738
uint32_t total_bytes_since_begin
Definition AudioStreams.h:875
Stream * p_stream
Definition AudioStreams.h:864
size_t measure(size_t len)
Definition AudioStreams.h:877
int total_bytes
Definition AudioStreams.h:867
void setFrameSize(int size)
Trigger reporting in frames (=samples) per second.
Definition AudioStreams.h:823
int max_count
Definition AudioStreams.h:862
void setReportBytes(bool flag)
Report in bytes instead of samples.
Definition AudioStreams.h:826
uint32_t estimatedOpenTimeFor(uint32_t totalBytes)
Provides the estimated time from now to the end in ms.
Definition AudioStreams.h:844
const char * name
Definition AudioStreams.h:873
void setLogOutput(Print &out)
Defines the logging output.
Definition AudioStreams.h:764
int bytes_per_second
Definition AudioStreams.h:868
MeasuringStream(Print &print, int count=10, Print *logOut=nullptr)
Definition AudioStreams.h:747
bool setProcessedBytes(uint32_t pos)
Definition AudioStreams.h:851
Print * p_logout
Definition AudioStreams.h:871
void printResult()
Definition AudioStreams.h:895
void setName(const char *name)
Definition AudioStreams.h:828
uint32_t startTime()
Provides the time when the last measurement was started.
Definition AudioStreams.h:804
bool begin() override
Definition AudioStreams.h:811
Print * p_print
Definition AudioStreams.h:865
void setAudioInfo(AudioInfo info) override
Defines the input AudioInfo.
Definition AudioStreams.h:806
int count
Definition AudioStreams.h:863
int frame_size
Definition AudioStreams.h:869
void setStream(Stream &io) override
Defines/Changes the input & output.
Definition AudioStreams.h:767
bool begin(AudioInfo info)
Definition AudioStreams.h:817
NullStream null
Definition AudioStreams.h:870
int bytesPerSecond()
Returns the actual thrughput in bytes per second.
Definition AudioStreams.h:795
A simple Stream implementation which is backed by allocated memory.
Definition AudioStreams.h:83
virtual size_t write(const uint8_t *data, size_t len) override
Definition AudioStreams.h:162
MemoryStream(const uint8_t *buffer, int buffer_size, bool isActive=true, MemoryType memoryType=FLASH_RAM)
Definition AudioStreams.h:98
virtual void setLoop(bool loop, int rewindPos)
Automatically rewinds to the indicated position when reaching the end.
Definition AudioStreams.h:262
virtual void clear(bool reset=false)
clears the audio data: sets all values to 0
Definition AudioStreams.h:232
virtual uint8_t * data()
Provides access to the data array.
Definition AudioStreams.h:290
virtual void setAvailable(size_t len)
update the write_pos (e.g. when we used data() to update the array)
Definition AudioStreams.h:293
virtual int read() override
Definition AudioStreams.h:195
~MemoryStream()
Definition AudioStreams.h:117
bool is_active
Definition AudioStreams.h:317
void setValue(const uint8_t *buffer, int buffer_size, MemoryType memoryType=FLASH_RAM)
Update the values (buffer and size)
Definition AudioStreams.h:299
MemoryStream(MemoryStream &&source)
Move Constructor.
Definition AudioStreams.h:111
uint8_t * buffer
Definition AudioStreams.h:313
virtual size_t readBytes(uint8_t *data, size_t len) override
Definition AudioStreams.h:203
MemoryStream(MemoryStream &source)
Copy Constructor.
Definition AudioStreams.h:108
virtual int availableForWrite() override
Definition AudioStreams.h:189
virtual size_t write(uint8_t byte) override
Definition AudioStreams.h:149
virtual void setLoop(bool loop)
Definition AudioStreams.h:251
virtual bool resize(size_t size)
Definition AudioStreams.h:269
int write_pos
Definition AudioStreams.h:309
MemoryType memory_type
Definition AudioStreams.h:314
int read_pos
Definition AudioStreams.h:310
virtual int peek() override
Definition AudioStreams.h:215
bool owns_memory
Definition AudioStreams.h:318
bool memoryCanChange()
Definition AudioStreams.h:320
MemoryStream(int buffer_size, MemoryType memoryType)
Constructor for alloction in RAM.
Definition AudioStreams.h:88
void(* rewind)()
Definition AudioStreams.h:316
int rewind_pos
Definition AudioStreams.h:312
bool begin() override
resets the read pointer
Definition AudioStreams.h:138
void copy(MemoryStream &source)
Definition AudioStreams.h:322
virtual void end() override
Definition AudioStreams.h:226
MemoryStream & operator=(MemoryStream &other)
copy assignement operator
Definition AudioStreams.h:123
bool begin(AudioInfo info)
Define some audio info and start the processing.
Definition AudioStreams.h:132
int buffer_size
Definition AudioStreams.h:311
void setRewindCallback(void(*cb)())
Callback which is executed when we rewind (in loop mode) to the beginning.
Definition AudioStreams.h:296
virtual void flush() override
Definition AudioStreams.h:224
bool is_loop
Definition AudioStreams.h:315
virtual int available() override
Definition AudioStreams.h:175
Abstract class: Objects can be put into a pipleline.
Definition AudioStreams.h:68
virtual void setStream(Stream &in)=0
Defines/Changes the input & output.
virtual void setOutput(Print &out)=0
Defines/Changes the output target.
The Arduino Stream which provides silence and simulates a null device when used as audio target or au...
Definition BaseStream.h:293
static int64_t maxValue(int value_bits_per_sample)
provides the biggest number for the indicated number of bits
Definition AudioTypes.h:301
Definition NoArduino.h:62
virtual int availableForWrite()
Definition NoArduino.h:134
virtual size_t write(const uint8_t *data, size_t len)
Definition NoArduino.h:126
virtual void flush()
Definition NoArduino.h:136
Generic calss to measure the the total bytes which were processed in order to calculate the progress ...
Definition AudioStreams.h:928
bool begin(size_t len)
Definition AudioStreams.h:966
ProgressStream(Print &print)
Definition AudioStreams.h:932
virtual size_t write(const uint8_t *data, size_t len) override
Writes raw PCM audio data, which will be the input for the volume control.
Definition AudioStreams.h:1016
bool begin(ProgressStreamInfo info)
Definition AudioStreams.h:971
size_t size()
Provides the current total size (defined by setSize)
Definition AudioStreams.h:984
void setStream(Stream &stream) override
Defines/Changes the input & output.
Definition AudioStreams.h:948
ProgressStreamInfo & defaultConfig()
Definition AudioStreams.h:941
size_t total_processed
Definition AudioStreams.h:1032
size_t totalSecs()
Converts the totalBytes() to seconds.
Definition AudioStreams.h:996
ProgressStreamInfo progress_info
Definition AudioStreams.h:1028
size_t byteRate()
Definition AudioStreams.h:1039
size_t readBytes(uint8_t *data, size_t len) override
Provides the data from all streams mixed together.
Definition AudioStreams.h:1005
size_t processedBytes()
Provides the number of processed bytes.
Definition AudioStreams.h:987
void setPrint(Print &print)
Definition AudioStreams.h:955
int available() override
Definition AudioStreams.h:1010
void setSize(size_t len)
Updates the total size and restarts the percent calculation.
Definition AudioStreams.h:978
virtual int availableForWrite() override
Provides the nubmer of bytes we can write.
Definition AudioStreams.h:1022
Stream * p_stream
Definition AudioStreams.h:1029
size_t measure(size_t len)
Definition AudioStreams.h:1034
float percentage()
Provides the processed percentage: If no size has been defined we return 0.
Definition AudioStreams.h:999
AudioInfoSupport * p_info_from
Definition AudioStreams.h:1031
size_t processedSecs()
Provides the number of processed seconds.
Definition AudioStreams.h:990
bool begin() override
Definition AudioStreams.h:957
Print * p_print
Definition AudioStreams.h:1030
void setAudioInfo(AudioInfo info) override
Defines the input AudioInfo.
Definition AudioStreams.h:943
size_t totalBytes()
Provides the total_size provided in the configuration.
Definition AudioStreams.h:993
void setStream(Print &print)
Definition AudioStreams.h:953
ProgressStream(Stream &stream)
Definition AudioStreams.h:934
ProgressStream(AudioStream &stream)
Definition AudioStreams.h:936
Configuration for ProgressStream.
Definition AudioStreams.h:917
size_t total_size
Definition AudioStreams.h:919
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 int availableForWrite() override
provides the number of entries that are available to write
Definition Buffers.h:413
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 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
An AudioStream backed by a Ringbuffer. We can write to the end and read from the beginning of the str...
Definition AudioStreams.h:341
virtual size_t write(const uint8_t *data, size_t len) override
Definition AudioStreams.h:370
size_t size()
Definition AudioStreams.h:379
virtual int read() override
Definition AudioStreams.h:360
RingBufferStream(int size=DEFAULT_BUFFER_SIZE)
Definition AudioStreams.h:343
virtual size_t readBytes(uint8_t *data, size_t len) override
Definition AudioStreams.h:366
virtual int availableForWrite() override
Definition AudioStreams.h:350
virtual int peek() override
Definition AudioStreams.h:355
virtual size_t write(uint8_t c) override
Definition AudioStreams.h:375
void resize(int size)
Definition AudioStreams.h:377
RingBuffer< uint8_t > buffer
Definition AudioStreams.h:382
virtual void flush() override
Definition AudioStreams.h:354
virtual int available() override
Definition AudioStreams.h:345
A simple Buffer implementation which just uses a (dynamically sized) array.
Definition Buffers.h:172
size_t setAvailable(size_t available_size)
Definition Buffers.h:296
void trim()
Moves the unprocessed data to the beginning of the buffer.
Definition Buffers.h:273
bool write(T sample) override
write add an entry to the buffer
Definition Buffers.h:206
bool peek(T &result) override
peeks the actual entry from the buffer
Definition Buffers.h:224
bool read(T &result) override
reads a single value
Definition Buffers.h:215
int available() override
provides the number of entries that are available to read
Definition Buffers.h:233
int availableForWrite() override
provides the number of entries that are available to write
Definition Buffers.h:238
T * address() override
Provides address to beginning of the buffer.
Definition Buffers.h:281
bool isFull() override
checks if the buffer is full
Definition Buffers.h:240
bool resize(int size)
Resizes the buffer if supported: returns false if not supported.
Definition Buffers.h:305
int peekArray(uint8_t *data, int len)
Definition Buffers.h:242
void reset() override
clears the buffer
Definition Buffers.h:286
Base class to define the abstract interface for the sound generating classes.
Definition SoundGenerator.h:28
virtual size_t readBytes(uint8_t *data, size_t len)
Provides the data as byte array with the requested number of channels.
Definition SoundGenerator.h:62
virtual bool begin(AudioInfo info)
Definition SoundGenerator.h:34
virtual bool isActive()
Definition SoundGenerator.h:56
virtual AudioInfo audioInfo()
Provides the AudioInfo.
Definition SoundGenerator.h:87
virtual void end()
ends the processing
Definition SoundGenerator.h:52
virtual AudioInfo defaultConfig()
Provides the default configuration.
Definition SoundGenerator.h:75
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
Throttle the sending or receiving of the audio data to limit it to the indicated sample rate.
Definition AudioStreams.h:1070
void setOutput(Print &out) override
Defines/Changes the output target.
Definition AudioStreams.h:1083
uint32_t sum_frames
Definition AudioStreams.h:1179
Throttle(Print &out)
Definition AudioStreams.h:1073
Stream * p_in
Definition AudioStreams.h:1183
Throttle(Stream &io)
Definition AudioStreams.h:1074
uint32_t start_time
Definition AudioStreams.h:1178
ThrottleConfig cfg
Definition AudioStreams.h:1180
size_t readBytes(uint8_t *data, size_t len) override
Definition AudioStreams.h:1136
int64_t getDelayMs(uint64_t frames)
Definition AudioStreams.h:1169
int available() override
Definition AudioStreams.h:1131
size_t write(const uint8_t *data, size_t len) override
Definition AudioStreams.h:1125
int availableForWrite() override
Definition AudioStreams.h:1118
void delayFrames(size_t frames)
Definition AudioStreams.h:1150
void delayBytes(size_t bytes)
Definition AudioStreams.h:1147
bool begin(ThrottleConfig cfg)
Definition AudioStreams.h:1090
Print * p_out
Definition AudioStreams.h:1182
int64_t getDelayUs(uint64_t frames)
Definition AudioStreams.h:1165
int64_t getDelaySec(uint64_t frames)
Definition AudioStreams.h:1173
void startDelay()
Definition AudioStreams.h:1113
bool begin() override
Definition AudioStreams.h:1106
int frame_size
Definition AudioStreams.h:1181
void setStream(Stream &io) override
Defines/Changes the input & output.
Definition AudioStreams.h:1077
ThrottleConfig defaultConfig()
Definition AudioStreams.h:1085
bool begin(AudioInfo info)
Definition AudioStreams.h:1098
Common Interface definition for TimerAlarmRepeating.
Definition AudioTimer.h:29
virtual void setTimer(int timer)
Definition AudioTimer.h:60
virtual void setTimerFunction(TimerFunction function=DirectTimerCallback)
Definition AudioTimer.h:62
void setCallbackParameter(void *obj)
Definition AudioTimer.h:56
bool begin(repeating_timer_callback_t callback_f, uint32_t time, TimeUnit unit=MS)
Definition AudioTimer.h:43
bool end()
Definition AudioTimer.h:51
Callback driven Audio Source (rx_tx_mode==RX_MODE) or Audio Sink (rx_tx_mode==TX_MODE)....
Definition AudioStreams.h:2241
bool active
Definition AudioStreams.h:2329
void begin(TimerCallbackAudioStreamInfo config)
Definition AudioStreams.h:2278
TimerCallbackAudioStream()
Definition AudioStreams.h:2245
TimerCallbackAudioStreamInfo audioInfoExt()
Provides the current audio information.
Definition AudioStreams.h:2275
uint16_t currentSampleRate()
Provides the effective sample rate.
Definition AudioStreams.h:2325
virtual size_t writeExt(const uint8_t *data, size_t len) override
Definition AudioStreams.h:2342
uint16_t frameSize
Definition AudioStreams.h:2335
TimerCallbackAudioStreamInfo defaultConfig()
Provides the default configuration.
Definition AudioStreams.h:2255
bool begin()
Restart the processing.
Definition AudioStreams.h:2304
uint32_t currentRateValue
Definition AudioStreams.h:2338
friend void timerCallback(void *obj)
Definition AudioStreams.h:2400
AudioInfo audioInfo()
provides the actual input AudioInfo
Definition AudioStreams.h:2276
virtual void measureSampleRate()
calculates the effective sample rate
Definition AudioStreams.h:2371
virtual void setAudioInfo(AudioInfo info)
updates the audio information
Definition AudioStreams.h:2261
virtual void printSampleRate()
log and update effective sample rate
Definition AudioStreams.h:2389
virtual size_t readExt(uint8_t *data, size_t len) override
Definition AudioStreams.h:2356
RingBuffer< uint8_t > * buffer
Definition AudioStreams.h:2333
~TimerCallbackAudioStream()
Definition AudioStreams.h:2247
void end()
Stops the processing.
Definition AudioStreams.h:2316
unsigned long lastTimestamp
Definition AudioStreams.h:2337
TimerAlarmRepeating * timer
Definition AudioStreams.h:2332
TimerCallbackAudioStreamInfo cfg
Definition AudioStreams.h:2328
uint32_t time
Definition AudioStreams.h:2336
uint32_t printCount
Definition AudioStreams.h:2339
uint8_t * frame
Definition AudioStreams.h:2334
uint16_t(* frameCallback)(uint8_t *data, uint16_t len)
Definition AudioStreams.h:2330
Vector implementation which provides the most important methods as defined by std::vector....
Definition Vector.h:21
void erase(iterator it)
Definition Vector.h:294
void push_back(T &&value)
Definition Vector.h:182
bool resize(int newSize, T value)
Definition Vector.h:266
void clear()
Definition Vector.h:176
int size()
Definition Vector.h:178
A simple class to determine the volume. You can use it as final output or as output or input in your ...
Definition AudioStreams.h:1780
void setOutput(Print &out) override
Defines/Changes the output target.
Definition AudioStreams.h:1924
void setStream(AudioStream &io)
Definition AudioStreams.h:1920
float volumeRatio()
Volume Ratio: max amplitude is 1.0.
Definition AudioStreams.h:1845
float volumeAvg(int channel)
Average volume of indicated channel.
Definition AudioStreams.h:1886
float volume()
Definition AudioStreams.h:1828
Vector< float > sum
Definition AudioStreams.h:1935
size_t sample_count_per_channel
Definition AudioStreams.h:1939
Vector< float > volumes_tmp
Definition AudioStreams.h:1934
VolumeMeter(AudioOutput &ao)
Definition AudioStreams.h:1784
bool isActive() const
Definition AudioStreams.h:1912
bool is_active
Definition AudioStreams.h:1946
unsigned long activity_duration_ms
Definition AudioStreams.h:1944
float volumePercent()
Volume in %: max amplitude is 100.
Definition AudioStreams.h:1869
void updateVolumes(const uint8_t *data, size_t len)
Definition AudioStreams.h:1949
void setOutput(AudioOutput &out)
Definition AudioStreams.h:1916
size_t readBytes(uint8_t *data, size_t len) override
Definition AudioStreams.h:1819
Vector< float > volumes
Definition AudioStreams.h:1933
float f_volume_tmp
Definition AudioStreams.h:1931
size_t write(const uint8_t *data, size_t len) override
Definition AudioStreams.h:1810
Stream * p_stream
Definition AudioStreams.h:1938
unsigned long inactive_start_time
Definition AudioStreams.h:1947
float volumePercent(int channel)
Volume of indicated channel in %: max amplitude is 100.
Definition AudioStreams.h:1872
float volumeAvg()
Average volume of all channels.
Definition AudioStreams.h:1875
float f_volume
Definition AudioStreams.h:1932
void updateVolumesT(const uint8_t *buffer, size_t size)
Definition AudioStreams.h:1972
bool activity_monitoring_enabled
Definition AudioStreams.h:1945
Print * p_out
Definition AudioStreams.h:1937
Vector< float > sum_tmp
Definition AudioStreams.h:1936
VolumeMeter(Stream &stream)
Definition AudioStreams.h:1786
void updateVolume(float tmp, int j)
Definition AudioStreams.h:1983
void setActivityCallback(ActivityCallback callback, float threshold=0.2, unsigned long duration_ms=2000)
Definition AudioStreams.h:1903
void updateActivityState()
Definition AudioStreams.h:2005
void clear()
Resets the actual volume.
Definition AudioStreams.h:1891
bool begin() override
Definition AudioStreams.h:1793
float volumeRatio(int channel)
Volume Ratio of indicated channel: max amplitude is 1.0.
Definition AudioStreams.h:1850
float activity_threshold
Definition AudioStreams.h:1943
float volumeDB(int channel)
Volume of indicated channel in db: max amplitude is 0.
Definition AudioStreams.h:1862
void setAudioInfo(AudioInfo info) override
Defines the input AudioInfo.
Definition AudioStreams.h:1798
void commit()
Definition AudioStreams.h:1996
ActivityCallback activity_callback
Definition AudioStreams.h:1942
void setStream(Stream &io) override
Defines/Changes the input & output.
Definition AudioStreams.h:1925
float volumeDB()
Volume in db: max amplitude is 0 (range: -1000 to 0)
Definition AudioStreams.h:1855
VolumeMeter(Print &print)
Definition AudioStreams.h:1785
bool begin(AudioInfo info)
Definition AudioStreams.h:1788
float volume(int channel)
Definition AudioStreams.h:1832
VolumeMeter(AudioStream &as)
Definition AudioStreams.h:1783
#define URL_CLIENT_TIMEOUT
Definition esp8266.h:23
MemoryType
Memory types.
Definition AudioTypes.h:37
RxTxMode
The Microcontroller is the Audio Source (TX_MODE) or Audio Sink (RX_MODE). RXTX_MODE is Source and Si...
Definition AudioTypes.h:30
@ RAM
Definition AudioTypes.h:37
@ PS_RAM
Definition AudioTypes.h:37
@ FLASH_RAM
Definition AudioTypes.h:37
@ RX_MODE
Definition AudioTypes.h:30
@ US
Definition AudioTypes.h:48
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10
TimerFunction
Definition AudioTimerBase.h:16
@ DirectTimerCallback
Definition AudioTimerBase.h:17
size_t readSamples(Stream *p_stream, T *data, int samples, int retryCount=-1)
guaranteed to return the requested data
Definition AudioTypes.h:470
void delayMicroseconds(unsigned int us)
Definition Time.h:28
void delay(unsigned long ms)
Definition Time.h:23
static void timerCallback(void *obj)
Definition AudioStreams.h:2400
unsigned long micros(void)
Definition Time.h:33
void(*)(bool isActive) ActivityCallback
Callback function type for activity state changes.
Definition AudioStreams.h:1769
uint32_t millis()
Returns the milliseconds since the start.
Definition Time.h:12
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
void copyFrom(AudioInfo info)
Same as set.
Definition AudioTypes.h:105
sample_rate_t sample_rate
Sample Rate: e.g 44100.
Definition AudioTypes.h:57
uint16_t channels
Number of channels: 2=stereo, 1=mono.
Definition AudioTypes.h:59
uint8_t bits_per_sample
Number of bits per sample (int16_t = 16 bits)
Definition AudioTypes.h:61
virtual void clear()
Definition AudioTypes.h:119
Definition AudioStreams.h:1489
int channels
Definition AudioStreams.h:1491
MergeRecord(Stream *str, int ch, float w)
Definition AudioStreams.h:1494
float weight
Definition AudioStreams.h:1492
Stream * stream
Definition AudioStreams.h:1490
Configure Throttle setting.
Definition AudioStreams.h:1055
ThrottleConfig()
Definition AudioStreams.h:1056
int correction_us
Definition AudioStreams.h:1061
TimerCallbackAudioStream Configuration.
Definition AudioStreams.h:2220
TimerFunction timer_function
Definition AudioStreams.h:2225
RxTxMode rx_tx_mode
Definition AudioStreams.h:2221
uint16_t(* callback)(uint8_t *data, uint16_t len)
Definition AudioStreams.h:2227
bool use_timer
Definition AudioStreams.h:2223
int timer_id
Definition AudioStreams.h:2224
bool adapt_sample_rate
Definition AudioStreams.h:2226
uint16_t buffer_size
Definition AudioStreams.h:2222