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
150 void rewind() {
151 if (buffer != nullptr && buffer_size > 0) {
152 read_pos = 0;
153 }
154 }
155
156 virtual size_t write(uint8_t byte) override {
157 if (!is_active) return 0;
158 if (memory_type == FLASH_RAM) return 0;
159 if (buffer == nullptr) return 0;
160 int result = 0;
161 if (write_pos < buffer_size) {
162 result = 1;
164 write_pos++;
165 }
166 return result;
167 }
168
169 virtual size_t write(const uint8_t *data, size_t len) override {
170 if (!is_active) return 0;
171 if (memory_type == FLASH_RAM) return 0;
172 size_t result = 0;
173 for (size_t j = 0; j < len; j++) {
174 if (!write(data[j])) {
175 break;
176 }
177 result = j + 1;
178 }
179 return result;
180 }
181
182 virtual int available() override {
183 if (!is_active) return 0;
184 if (buffer == nullptr) return 0;
185 int result = write_pos - read_pos;
186 if (result <= 0 && is_loop) {
187 // rewind to start
189 result = write_pos - read_pos;
190 // call callback
191 if (rewind_cb != nullptr) rewind_cb();
192 }
193 return is_loop ? DEFAULT_BUFFER_SIZE : result;
194 }
195
196 virtual int availableForWrite() override {
197 if (!is_active) return 0;
198 if (memory_type == FLASH_RAM) return 0;
199 return buffer_size - write_pos;
200 }
201
202 virtual int read() override {
203 int result = peek();
204 if (result >= 0) {
205 read_pos++;
206 }
207 return result;
208 }
209
210 virtual size_t readBytes(uint8_t *data, size_t len) override {
211 if (!is_active) return 0;
212 size_t count = 0;
213 while (count < len) {
214 int c = read();
215 if (c < 0) break;
216 *data++ = (char)c;
217 count++;
218 }
219 return count;
220 }
221
222 virtual int peek() override {
223 if (!is_active) return -1;
224 int result = -1;
225 if (available() > 0) {
226 result = buffer[read_pos];
227 }
228 return result;
229 }
230
231 virtual void flush() override {}
232
233 virtual void end() override {
234 read_pos = 0;
235 is_active = false;
236 }
237
239 virtual void clear(bool reset = false) {
240 if (memoryCanChange()) {
241 write_pos = 0;
242 read_pos = 0;
243 if (owns_memory && buffer == nullptr) {
245 }
246 if (reset) {
247 // we clear the buffer data
249 }
250 } else {
251 read_pos = 0;
252 LOGW("data is read only");
253 }
254 }
255
258 virtual void setLoop(bool loop) {
259 is_loop = loop;
260 rewind_pos = 0;
261 if (buffer != nullptr && buffer_size > 12) {
262 if (memcmp("WAVE", buffer + 8, 4) == 0) {
263 rewind_pos = 44;
264 }
265 }
266 }
267
269 virtual void setLoop(bool loop, int rewindPos) {
270 is_loop = loop;
272 }
273
276 virtual bool resize(size_t size) {
277 if (!memoryCanChange()) return false;
278 if (!owns_memory) return false;
279
280 buffer_size = size;
281 switch (memory_type) {
282#if defined(USE_PSRAM) && defined(ARDUINO)
283 case PS_RAM:
284 buffer = (buffer == nullptr) ? (uint8_t *)ps_calloc(size, 1)
285 : (uint8_t *)ps_realloc(buffer, size);
286 break;
287#endif
288 default:
289 buffer = (buffer == nullptr) ? (uint8_t *)calloc(size, 1)
290 : (uint8_t *)realloc(buffer, size);
291 break;
292 }
293 return buffer != nullptr;
294 }
295
297 virtual uint8_t *data() { return buffer; }
298
300 virtual bool setAvailable(size_t len) {
301 if (len <= buffer_size) {
302 write_pos = len;
304 return true;
305 }
306 return false;
307 }
308
310 void setRewindCallback(void (*cb)()) { this->rewind_cb = cb; }
311
315 this->buffer_size = buffer_size;
316 this->read_pos = 0;
317 this->write_pos = buffer_size;
318 this->buffer = (uint8_t *)buffer;
319 this->memory_type = memoryType;
320 }
321
322 protected:
323 int write_pos = 0;
324 int read_pos = 0;
325 int buffer_size = 0;
326 int rewind_pos = 0;
327 uint8_t *buffer = nullptr;
329 bool is_loop = false;
330 void (*rewind_cb)() = nullptr;
331 bool is_active = false;
332 bool owns_memory = true;
333
335
336 void copy(MemoryStream &source) {
337 if (this == &source) return;
338
339 // Release currently owned mutable buffer.
340 if (memoryCanChange() && owns_memory && buffer != nullptr) {
341 free(buffer);
342 buffer = nullptr;
343 }
344
345 // Shallow copy for FLASH memory source.
346 if (source.memory_type == FLASH_RAM) {
347 owns_memory = false;
348 setValue(source.buffer, source.buffer_size, source.memory_type);
349 is_active = source.is_active;
350 is_loop = source.is_loop;
351 rewind_pos = source.rewind_pos;
352 return;
353 }
354
355 // Deep copy for mutable source memory.
356 owns_memory = true;
357 setValue(nullptr, source.buffer_size, source.memory_type);
358 if (!resize(source.buffer_size)) {
359 setValue(nullptr, 0, source.memory_type);
360 is_active = false;
361 return;
362 }
363
364 if (source.buffer != nullptr && source.buffer_size > 0) {
365 memcpy(buffer, source.buffer, source.buffer_size);
366 }
367
368 write_pos = source.write_pos;
369 read_pos = source.read_pos;
372
373 is_active = source.is_active;
374 is_loop = source.is_loop;
375 rewind_pos = source.rewind_pos;
376 }
377};
378
387 public:
389
390 virtual int available() override {
391 // LOGD("RingBufferStream::available: %zu",buffer->available());
392 return buffer.available();
393 }
394
395 virtual int availableForWrite() override {
396 return buffer.availableForWrite();
397 }
398
399 virtual void flush() override {}
400 virtual int peek() override {
401 uint8_t data = 0;
402 if (!buffer.peek(data)) return -1;
403 return data;
404 }
405 virtual int read() override {
406 uint8_t data = 0;
407 if (!buffer.read(data)) return -1;
408 return data;
409 }
410
411 virtual size_t readBytes(uint8_t *data, size_t len) override {
412 return buffer.readArray(data, len);
413 }
414
415 virtual size_t write(const uint8_t *data, size_t len) override {
416 // LOGD("RingBufferStream::write: %zu",len);
417 return buffer.writeArray(data, len);
418 }
419
420 virtual size_t write(uint8_t c) override { return buffer.write(c); }
421
422 void resize(int size) { buffer.resize(size); }
423
424 size_t size() { return buffer.size(); }
425
426 protected:
428};
429
441template <class T = int16_t>
443 public:
445
447 TRACED();
448 setInput(generator);
449 }
450
451 void setInput(SoundGenerator<T> &generator) {
452 this->p_generator = &generator;
453 }
454
456 if (p_generator == nullptr) {
458 return AudioInfo();
459 }
460 return this->p_generator->defaultConfig();
461 }
462
464 if (newInfo.bits_per_sample != sizeof(T) * 8) {
465 LOGE("Wrong bits_per_sample: %d", newInfo.bits_per_sample);
466 }
468 }
469
471 bool begin() override {
472 TRACED();
473 if (p_generator == nullptr) {
475 return false;
476 }
479 active = true;
480 return active;
481 }
482
484 bool begin(AudioInfo cfg) {
485 TRACED();
486 if (p_generator == nullptr) {
488 return false;
489 }
490 p_generator->begin(cfg);
492 active = true;
493 return active;
494 }
495
497 void end() override {
498 TRACED();
499 if (p_generator != nullptr) {
500 p_generator->end();
501 }
502 active = true; // legacy support - most sketches do not call begin
503 }
504
505 AudioInfo audioInfo() override {
506 if (p_generator == nullptr) {
508 return AudioStream::audioInfo();
509 }
510 return p_generator->audioInfo();
511 }
512
514 virtual int available() override { return active ? buffer_size : 0; }
515
517 size_t readBytes(uint8_t *data, size_t len) override {
518 if (!active) return 0;
519 if (p_generator == nullptr) {
520 return 0;
521 }
522 LOGD("GeneratedSoundStream::readBytes: %u", (unsigned int)len);
523 return p_generator->readBytes(data, len);
524 }
525
526 bool isActive() {
527 if (p_generator == nullptr) return false;
528 return active && p_generator->isActive();
529 }
530
531 operator bool() override { return isActive(); }
532
533 void flush() override {}
534
537
538 protected:
539 bool active = true; // support for legacy sketches
542 DEFAULT_BUFFER_SIZE * 100; // there is no reason to limit this
543 const char *source_not_defined_error = "Source not defined";
544};
545
555 public:
556 BufferedStream(size_t buffer_size) {
557 TRACED();
558 if (buffer_size > 0) resize(buffer_size);
559 }
560
561 BufferedStream(Print &out, size_t buffer_size = 1024) {
562 TRACED();
563 setOutput(out);
564 if (buffer_size > 0) resize(buffer_size);
565 }
566
567 BufferedStream(Stream &io, size_t buffer_size = 1024) {
568 TRACED();
569 setStream(io);
570 if (buffer_size > 0) resize(buffer_size);
571 }
572
573 BufferedStream(size_t buffer_size, Print &out) {
574 TRACED();
575 setOutput(out);
576 if (buffer_size > 0) resize(buffer_size);
577 }
578
579 BufferedStream(size_t buffer_size, Stream &io) {
580 TRACED();
581 setStream(io);
582 if (buffer_size > 0) resize(buffer_size);
583 }
584
585 void setOutput(Print &out) override { p_out = &out; }
586 void setStream(Print &out) { setOutput(out); }
587 void setStream(Stream &io) override {
588 p_in = &io;
589 p_out = &io;
590 }
591
593 size_t write(uint8_t c) override {
594 if (buffer.isFull()) {
595 flush();
596 }
597 return buffer.write(c);
598 }
599
601 size_t write(const uint8_t *data, size_t len) override {
602 LOGD("%s: %zu", LOG_METHOD, len);
603 int result = 0;
604 for (int j = 0; j < len; j++) {
605 result += write(data[j]);
606 }
607 return result;
608 }
609
611 void flush() override {
612 // just dump the memory of the buffer and clear it
613 if (buffer.available() > 0) {
615 buffer.reset();
616 }
617 }
618
620 int read() override {
621 if (buffer.isEmpty()) {
622 refill();
623 }
624 uint8_t result = 0;
625 if (!buffer.read(result)) return -1;
626 return result;
627 }
628
630 int peek() override {
631 if (buffer.isEmpty()) {
632 refill();
633 }
634 uint8_t result = 0;
635 if (!buffer.peek(result)) return -1;
636 return result;
637 };
638
640 size_t readBytes(uint8_t *data, size_t len) override {
641 if (buffer.isEmpty() && len >= minReadBufferSize) {
642 return readExt(data, len);
643 } else {
644 refill(len);
645 return buffer.readArray(data, len);
646 }
647 }
648
650 size_t peekBytes(uint8_t *data, size_t len) {
651 if (buffer.isEmpty()) {
652 refill();
653 }
654 return buffer.peekArray(data, len);
655 }
656
658 int available() override {
659 if (p_in == nullptr) return 0;
660 return buffer.available() + p_in->available();
661 }
662
664 void clear() { buffer.reset(); }
665
667 void resize(int size) { buffer.resize(size); }
668
671 void setMinUnbufferedReadSize(size_t size) { minReadBufferSize = size; }
672
673 protected:
675 Print *p_out = nullptr;
676 Stream *p_in = nullptr;
677 size_t minReadBufferSize = 1024;
678
680 void refill() {
681 // Preserve any existing unread data then append new bytes
682 buffer.trim();
685 if (free_space == 0) {
686 // Buffer full – nothing we can append
687 return;
688 }
689 // Read new data directly behind existing bytes
692 }
693
695 void refill(size_t len) {
696 if (buffer.available() >= len) return;
697 refill();
698 }
699
700 virtual size_t writeExt(const uint8_t *data, size_t len) {
701 return p_out == nullptr ? 0 : p_out->write(data, len);
702 }
703 virtual size_t readExt(uint8_t *data, size_t len) {
704 return p_in == nullptr ? 0 : p_in->readBytes(data, len);
705 }
706};
707
716template <typename T = int16_t>
718 public:
719 ConverterStream() = default;
720
721 ConverterStream(BaseConverter &converter) { setConverter(converter); }
722
723 ConverterStream(Stream &stream, BaseConverter &converter) {
724 setConverter(converter);
725 setStream(stream);
726 }
727
729 setConverter(converter);
730 setOutput(out);
731 }
732
733 void setStream(Stream &stream) {
734 TRACEI();
735 p_stream = &stream;
736 p_out = &stream;
737 }
738
739 void setOutput(Print &out) {
740 TRACEI();
741 p_out = &out;
742 }
743
745
746 virtual int availableForWrite() { return p_out->availableForWrite(); }
747
748 virtual size_t write(const uint8_t *data, size_t len) {
749 size_t result = p_converter->convert((uint8_t *)data, len);
750 if (result > 0) {
751 size_t result_written = p_out->write(data, result);
752 return len * result_written / result;
753 }
754 return 0;
755 }
756
757 size_t readBytes(uint8_t *data, size_t len) override {
758 if (p_stream == nullptr) return 0;
759 size_t result = p_stream->readBytes(data, len);
760 return p_converter->convert(data, result);
761 }
762
764 virtual int available() override {
765 if (p_stream == nullptr) return 0;
766 return p_stream->available();
767 }
768
769 protected:
770 Stream *p_stream = nullptr;
771 Print *p_out = nullptr;
773};
774
782 public:
783 MeasuringStream(int count = 10, Print *logOut = nullptr) {
784 this->count = count;
785 this->max_count = count;
786 p_stream = &null;
787 p_print = &null;
788 start_time = millis();
790 }
791
792 MeasuringStream(Print &print, int count = 10, Print *logOut = nullptr) {
793 this->count = count;
794 this->max_count = count;
795 setOutput(print);
796 start_time = millis();
798 }
799
800 MeasuringStream(Stream &stream, int count = 10, Print *logOut = nullptr) {
801 this->count = count;
802 this->max_count = count;
803 setStream(stream);
804 start_time = millis();
806 }
807
809 void setLogOutput(Print &out) { p_logout = &out; }
810
812 void setStream(Stream &io) override {
813 p_print = &io;
814 p_stream = &io;
815 };
816
818 void setOutput(Print &out) override { p_print = &out; }
819
821 size_t readBytes(uint8_t *data, size_t len) override {
823 return measure(p_stream->readBytes(data, len));
824 }
825
826 int available() override { return p_stream->available(); }
827
829 virtual size_t write(const uint8_t *data, size_t len) override {
831 return measure(p_print->write(data, len));
832 }
833
835 virtual int availableForWrite() override {
836 return p_print->availableForWrite();
837 }
838
841
844 if (frame_size == 0) return 0;
846 }
847
850
855
856 bool begin() override {
859 return AudioStream::begin();
860 }
861
864 return begin();
865 }
866
868 void setFrameSize(int size) { frame_size = size; }
869
872
873 void setName(const char *name) { this->name = name; }
874
877
880
883 if (bytesSinceBegin() == 0) return 0;
884 return static_cast<float>(timeSinceBegin()) / bytesSinceBegin() *
885 totalBytes;
886 }
887
890 if (bytesSinceBegin() == 0) return 0;
891 return estimatedTotalTimeFor(totalBytes) - timeSinceBegin();
892 }
893
897 bool is_regular_update = true;
898 if (pos < total_bytes_since_begin) {
899 begin();
900 is_regular_update = false;
901 }
903 return is_regular_update;
904 }
905
906 protected:
907 int max_count = 0;
908 int count = 0;
909 Stream *p_stream = nullptr;
910 Print *p_print = nullptr;
912 int total_bytes = 0;
914 int frame_size = 0;
916 Print *p_logout = nullptr;
917 bool report_bytes = false;
918 const char *name = "";
921
922 size_t measure(size_t len) {
923 count--;
924 total_bytes += len;
925
926 if (count <= 0) {
928 int time_diff = end_time - start_time; // in ms
929 if (time_diff > 0) {
931 printResult();
933 total_bytes = 0;
935 }
936 }
937 return len;
938 }
939
940 void printResult() {
941 char msg[70];
942 if (report_bytes || frame_size == 0) {
943 snprintf(msg, 70, "%s ==> Bytes per second: %d", name, bytes_per_second);
944 } else {
945 snprintf(msg, 70, "%s ==> Samples per second: %d", name,
947 }
948 if (p_logout != nullptr) {
949 p_logout->println(msg);
950 } else {
951 LOGI("%s", msg);
952 }
953 }
954};
955
963 public:
964 size_t total_size = 0;
965};
974 public:
975 ProgressStream() = default;
976
977 ProgressStream(Print &print) { setPrint(print); }
978
979 ProgressStream(Stream &stream) { setStream(stream); }
980
982 setStream(stream);
983 p_info_from = &stream;
984 }
985
987
992
993 void setStream(Stream &stream) override {
994 p_stream = &stream;
995 p_print = &stream;
996 }
997
998 void setStream(Print &print) { p_print = &print; }
999
1000 void setPrint(Print &print) { p_print = &print; }
1001
1002 bool begin() override {
1003 if (p_info_from != nullptr) {
1005 }
1006 return AudioStream::begin();
1007 }
1008
1011 bool begin(size_t len) {
1012 setSize(len);
1013 return begin();
1014 }
1015
1019 return begin();
1020 }
1021
1023 void setSize(size_t len) {
1024 total_processed = 0;
1026 }
1027
1029 size_t size() { return progress_info.total_size; }
1030
1032 size_t processedBytes() { return total_processed; }
1033
1035 size_t processedSecs() { return total_processed / byteRate(); }
1036
1039
1041 size_t totalSecs() { return totalBytes() / byteRate(); }
1042
1044 float percentage() {
1045 if (progress_info.total_size == 0) return 0;
1046 return 100.0 * total_processed / progress_info.total_size;
1047 }
1048
1050 size_t readBytes(uint8_t *data, size_t len) override {
1051 if (p_stream == nullptr) return 0;
1052 return measure(p_stream->readBytes(data, len));
1053 }
1054
1055 int available() override {
1056 if (p_stream == nullptr) return 0;
1057 return p_stream->available();
1058 }
1059
1061 virtual size_t write(const uint8_t *data, size_t len) override {
1062 if (p_print == nullptr) return 0;
1063 return measure(p_print->write(data, len));
1064 }
1065
1067 virtual int availableForWrite() override {
1068 if (p_print == nullptr) return 0;
1069 return p_print->availableForWrite();
1070 }
1071
1072 protected:
1074 Stream *p_stream = nullptr;
1075 Print *p_print = nullptr;
1078
1079 size_t measure(size_t len) {
1080 total_processed += len;
1081 return len;
1082 }
1083
1084 size_t byteRate() {
1086 int byte_rate = info.sample_rate * info.bits_per_sample * info.channels / 8;
1087 if (byte_rate == 0) {
1088 LOGE("Audio Info not defined");
1089 return 0;
1090 }
1091 return byte_rate;
1092 }
1093};
1094
1100struct ThrottleConfig : public AudioInfo {
1102 sample_rate = 44100;
1103 bits_per_sample = 16;
1104 channels = 2;
1105 }
1107};
1108
1116 public:
1117 Throttle() = default;
1118 Throttle(Print &out) { setOutput(out); }
1120
1122 void setStream(Stream &io) override {
1123 p_out = &io;
1124 p_in = &io;
1125 };
1126
1128 void setOutput(Print &out) override { p_out = &out; }
1129
1132 return c;
1133 }
1134
1136 LOGI("begin sample_rate: %d, channels: %d, bits: %d", (int)info.sample_rate,
1137 (int)info.channels, (int)info.bits_per_sample);
1138 this->info = cfg;
1139 this->cfg = cfg;
1140 return begin();
1141 }
1142
1144 LOGI("begin sample_rate: %d, channels: %d, bits: %d", (int)info.sample_rate,
1145 (int)info.channels, (int)info.bits_per_sample);
1146 this->info = info;
1147 this->cfg.copyFrom(info);
1148 return begin();
1149 }
1150
1151 bool begin() override {
1153 startDelay();
1154 return true;
1155 }
1156
1157 // (re)starts the timing
1158 void startDelay() {
1159 start_time = micros();
1160 sum_frames = 0;
1161 }
1162
1163 int availableForWrite() override {
1164 if (p_out) {
1165 return p_out->availableForWrite();
1166 }
1167 return DEFAULT_BUFFER_SIZE;
1168 }
1169
1170 size_t write(const uint8_t *data, size_t len) override {
1171 size_t result = p_out->write(data, len);
1172 delayBytes(len);
1173 return result;
1174 }
1175
1176 int available() override {
1177 if (p_in == nullptr) return 0;
1178 return p_in->available();
1179 }
1180
1181 size_t readBytes(uint8_t *data, size_t len) override {
1182 if (p_in == nullptr) {
1183 delayBytes(len);
1184 return 0;
1185 }
1186 size_t result = p_in->readBytes(data, len);
1187 delayBytes(len);
1188 return result;
1189 }
1190
1191 // delay
1193
1194 // delay
1195 void delayFrames(size_t frames) {
1196 sum_frames += frames;
1200 LOGD("wait us: %ld", static_cast<long>(waitUs));
1201 if (waitUs > 0) {
1202 int64_t waitMs = waitUs / 1000;
1203 if (waitMs > 0) delay(waitMs);
1204 delayMicroseconds(waitUs - (waitMs * 1000));
1205 } else {
1206 LOGD("negative delay!")
1207 }
1208 }
1209
1210 inline int64_t getDelayUs(uint64_t frames) {
1211 return (frames * 1000000) / cfg.sample_rate;
1212 }
1213
1214 inline int64_t getDelayMs(uint64_t frames) {
1215 return getDelayUs(frames) / 1000;
1216 }
1217
1219 return getDelayUs(frames) / 1000000l;
1220 }
1221
1222 protected:
1226 int frame_size = 0;
1227 Print *p_out = nullptr;
1228 Stream *p_in = nullptr;
1229};
1230
1240template <typename T=int16_t, typename SumT=float>
1241class InputMixer : public AudioStream {
1242 public:
1243 InputMixer() = default;
1244
1246 int add(Stream &in, int weight = 100) {
1247 streams.push_back(&in);
1248 weights.push_back(weight);
1250 return streams.indexOf(&in);
1251 }
1252
1254 bool set(int index, Stream &in) {
1255 if (index < size()) {
1256 streams[index] = &in;
1257 return true;
1258 } else {
1259 LOGE("Invalid index %d - max is %d", index, size() - 1);
1260 return false;
1261 }
1262 }
1263
1264 virtual bool begin(AudioInfo info) {
1267 LOGI("frame_size: %d", frame_size);
1268 return frame_size > 0;
1269 }
1270
1274 void setWeight(int index, int weight) {
1275 if (index < streams.size()) {
1276 weights[index] = weight;
1278 } else {
1279 LOGE("Invalid index %d - max is %d", index, size() - 1);
1280 }
1281 }
1282
1284 void end() override {
1285 streams.clear();
1286 weights.clear();
1287 gains.clear();
1288 result_vect.clear();
1289 current_vect.clear();
1290 total_weights = 0.0;
1291 }
1292
1294 int size() { return streams.size(); }
1295
1297 size_t readBytes(uint8_t *data, size_t len) override {
1298 if (total_weights == 0 || frame_size == 0 || len == 0) {
1299 LOGW("readBytes: %d", (int)len);
1300 return 0;
1301 }
1302
1304 len = min((int)len, availableBytes());
1305 }
1306
1307 int result_len = 0;
1308
1309 if (len > 0) {
1310 // result_len must be full frames
1311 result_len = (len / frame_size) * frame_size;;
1312 // replace sample based with vector based implementation
1313 // readBytesSamples((T*)data, result_len));
1315 }
1316 return result_len;
1317 }
1318
1322
1326
1328 bool remove(int idx) {
1329 if (idx < 0 || idx >= size()) {
1330 return false;
1331 }
1332 streams.erase(idx);
1333 weights.erase(idx);
1335 return true;
1336 }
1337
1339 bool remove() {
1340 bool rc = false;
1341 int idx = nextEmptyIndex();
1342 while (idx >= 0) {
1343 rc = true;
1344 streams.erase(idx);
1345 weights.erase(idx);
1346 idx = nextEmptyIndex();
1347 }
1349 return rc;
1350 }
1351
1353 int indexOf(Stream &stream) { return streams.indexOf(&stream); }
1354
1356 Stream *operator[](int idx) {
1357 if (idx < 0 || idx >= size()) return nullptr;
1358 return streams[idx];
1359 }
1360
1363 for (int i = 0; i < streams.size(); i++) {
1364 if (streams[i]->available() == 0) {
1365 return i;
1366 }
1367 }
1368 return -1;
1369 }
1370
1371 protected:
1376 int frame_size = 4;
1381
1384 int total = 0;
1385 for (int j = 0; j < weights.size(); j++) {
1386 total += weights[j];
1387 }
1388 total_weights = total;
1390 for (int j = 0; j < weights.size(); j++) {
1391 gains[j] = total_weights == 0 ? 0.0f : static_cast<float>(weights[j]) / total_weights;
1392 }
1393 }
1394
1396 int readBytesVector(T *p_data, int byteCount) {
1397 int samples = byteCount / sizeof(T);
1398 if (result_vect.size() < samples) result_vect.resize(samples);
1399 if (current_vect.size() < samples) current_vect.resize(samples);
1400 int stream_count = size();
1401 resultClear(samples);
1402 int samples_eff_max = 0;
1403 for (int j = 0; j < stream_count; j++) {
1404 if (weights[j] > 0) {
1405 int samples_eff =
1406 readSamples(streams[j], current_vect.data(), samples, retry_count);
1409 }
1410 }
1411 // copy result
1412 for (int j = 0; j < samples_eff_max; j++) {
1413 p_data[j] = static_cast<T>(result_vect[j]);
1414 }
1415 return samples_eff_max * sizeof(T);
1416 }
1417
1420 int result = DEFAULT_BUFFER_SIZE;
1421 for (int j = 0; j < size(); j++) {
1422 result = min(result, streams[j]->available());
1423 }
1424 return result;
1425 }
1426
1427 void resultAdd(float fact, int samples_eff) {
1428 // only accumulate samples that were actually read; tail is already zeroed
1429 for (int j = 0; j < samples_eff; j++) {
1430 result_vect[j] += static_cast<SumT>(current_vect[j] * fact);
1431 }
1432 }
1433
1434 void resultClear(int samples) {
1435 memset(result_vect.data(), 0, sizeof(SumT) * samples);
1436 }
1437};
1438
1448template <typename T>
1449class InputMerge : public AudioStream {
1450 public:
1452 InputMerge() = default;
1453
1457 InputMerge(Stream &left, Stream &right) {
1458 add(left, 1);
1459 add(right, 1);
1460 };
1461
1468
1469 virtual bool begin(AudioInfo info) {
1471 return begin();
1472 }
1473
1474 virtual bool begin() override {
1475 // make sure that we use the correct channel count
1477 return AudioStream::begin();
1478 }
1479
1481 size_t readBytes(uint8_t *data, size_t len) override {
1482 LOGD("readBytes: %d", (int)len);
1483 T *p_data = (T *)data;
1484 int result_len = MIN(available(), len);
1485 int frames = result_len / (sizeof(T) * total_channel_count);
1486 int result_idx = 0;
1487 for (int j = 0; j < frames; j++) {
1488 for (int i = 0; i < records.size(); i++) {
1489 for (int ch = 0; ch < records[i].channels; ch++) {
1490 p_data[result_idx++] =
1491 records[i].weight * readSample<T>(records[i].stream);
1492 }
1493 }
1494 }
1495 return result_idx * sizeof(T);
1496 }
1497
1499 void add(Stream &in, int channelCount, float weight = 1.0) {
1500 MergeRecord rec(&in, channelCount, weight);
1501 records.push_back(rec);
1503 }
1504
1507 void setWeight(int channel, float weight) {
1508 if (channel < channelCount()) {
1509 records[channel].weight = weight;
1510 } else {
1511 LOGE("Invalid channel %d - max is %d", channel, channelCount() - 1);
1512 }
1513 }
1514
1516 void end() override { records.clear(); }
1517
1520
1522 int available() override {
1523 int result = records[0].stream->available();
1524 for (int j = 1; j < channelCount(); j++) {
1525 int tmp = records[j].stream->available();
1526 if (tmp < result) {
1527 result = tmp;
1528 }
1529 }
1530 return result;
1531 }
1532
1533 protected:
1535 Stream *stream = nullptr;
1536 int channels = 0;
1537 float weight = 1.0;
1538 MergeRecord() = default;
1539 MergeRecord(Stream *str, int ch, float w) {
1540 stream = str;
1541 channels = ch;
1542 weight = w;
1543 }
1544 };
1547};
1548
1559 public:
1560 CallbackStream() = default;
1561
1564 CallbackStream(Stream &io, size_t (*cb_update)(uint8_t *data, size_t len)) {
1565 p_stream = &io;
1566 p_out = &io;
1568 }
1569
1571 CallbackStream(Print &out, size_t (*cb_update)(uint8_t *data, size_t len)) {
1572 p_out = &out;
1574 }
1575
1576 CallbackStream(size_t (*cb_read)(uint8_t *data, size_t len),
1577 size_t (*cb_write)(const uint8_t *data, size_t len)) {
1580 }
1581
1582 void setWriteCallback(size_t (*cb_write)(const uint8_t *data, size_t len)) {
1583 this->cb_write = cb_write;
1584 }
1585
1586 void setReadCallback(size_t (*cb_read)(uint8_t *data, size_t len)) {
1587 this->cb_read = cb_read;
1588 }
1589
1590 void setUpdateCallback(size_t (*cb_update)(uint8_t *data, size_t len)) {
1591 this->cb_update = cb_update;
1592 }
1593
1594 // callback result negative -> no change; callbeack result >=0 provides the
1595 // result
1596 void setAvailableCallback(int (*cb)()) { this->cb_available = cb; }
1597
1600 this->cb_audio_info = cb;
1601 }
1602
1604 void setAudioInfo(AudioInfo info) override {
1606 if (cb_audio_info != nullptr) {
1608 }
1609 }
1610
1611 virtual bool begin(AudioInfo info) {
1613 return begin();
1614 }
1615 virtual bool begin() override {
1616 active = true;
1617 return true;
1618 }
1619
1620 void end() override { active = false; }
1621
1622 int available() override {
1623 int result = AudioStream::available();
1624 // determine value from opional variable
1625 if (available_bytes >= 0) return available_bytes;
1626 // check if there is a callback
1627 if (cb_available == nullptr) return result;
1628 // determine value from callback
1630 if (tmp_available < 0) return result;
1631
1632 return tmp_available;
1633 }
1634
1635 size_t readBytes(uint8_t *data, size_t len) override {
1636 if (!active) return 0;
1637 // provide data from callback
1638 if (cb_read) {
1639 return cb_read(data, len);
1640 }
1641 // provide data from source
1642 size_t result = 0;
1643 if (p_stream) {
1644 result = p_stream->readBytes(data, len);
1645 }
1646 if (cb_update) {
1647 result = cb_update(data, result);
1648 }
1649 return result;
1650 }
1651
1652 size_t write(const uint8_t *data, size_t len) override {
1653 if (!active) return 0;
1654 // write to callback
1655 if (cb_write) {
1656 return cb_write(data, len);
1657 }
1658 // write to output
1659 if (p_out) {
1660 size_t result = len;
1661 if (cb_update) {
1662 result = cb_update((uint8_t *)data, len);
1663 }
1664 return p_out->write(data, result);
1665 }
1666 // no processing possible
1667 return 0;
1668 }
1669
1671 void setStream(Stream &in) override {
1672 p_stream = &in;
1673 p_out = &in;
1674 }
1675
1677 void setOutput(Print &out) override { p_out = &out; }
1678
1680 void setOutput(Stream &in) {
1681 p_stream = &in;
1682 p_out = &in;
1683 }
1684
1686 void setStream(Print &out) { p_out = &out; }
1687
1690
1691 protected:
1692 bool active = true;
1693 size_t (*cb_write)(const uint8_t *data, size_t len) = nullptr;
1694 size_t (*cb_read)(uint8_t *data, size_t len) = nullptr;
1695 size_t (*cb_update)(uint8_t *data, size_t len) = nullptr;
1697 int (*cb_available)() = nullptr;
1698 Stream *p_stream = nullptr;
1699 Print *p_out = nullptr;
1701};
1702
1710template <typename T = int16_t, class TF = float>
1712 public:
1713 FilteredStream() = default;
1716 this->channels = channels;
1717 setStream(stream);
1719 }
1722 this->channels = channels;
1723 setOutput(stream);
1725 }
1726
1727 virtual ~FilteredStream() { end(); }
1728
1729 void setStream(Stream &stream) override {
1730 p_stream = &stream;
1731 p_print = &stream;
1732 }
1733
1734 void setOutput(Print &stream) override { p_print = &stream; }
1735
1738 this->channels = info.channels;
1739 if (p_converter != nullptr && p_converter->getChannels() != channels) {
1740 LOGE("Inconsistent number of channels");
1741 return false;
1742 }
1743 return begin();
1744 }
1745
1746 bool begin() override {
1747 if (channels == 0) {
1748 LOGE("channels must not be 0");
1749 return false;
1750 }
1751 if (p_converter == nullptr) {
1753 }
1754 return AudioStream::begin();
1755 }
1756
1757 void end() override {
1759 if (p_converter != nullptr) {
1760 delete p_converter;
1761 p_converter = nullptr;
1762 }
1763 }
1764
1765 virtual size_t write(const uint8_t *data, size_t len) override {
1766 if (p_converter == nullptr) return 0;
1767 size_t result = p_converter->convert((uint8_t *)data, len);
1768 return p_print->write(data, result);
1769 }
1770
1771 size_t readBytes(uint8_t *data, size_t len) override {
1772 if (p_converter == nullptr) return 0;
1773 if (p_stream == nullptr) return 0;
1774 size_t result = p_stream->readBytes(data, len);
1775 result = p_converter->convert(data, result);
1776 return result;
1777 }
1778
1779 virtual int available() override {
1780 if (p_stream == nullptr) return 0;
1781 return p_stream->available();
1782 }
1783
1784 virtual int availableForWrite() override {
1785 return p_print->availableForWrite();
1786 }
1787
1791 void setFilter(int channel, Filter<TF> *filter) {
1792 if (p_converter != nullptr) {
1793 p_converter->setFilter(channel, filter);
1794 } else {
1795 LOGE("p_converter is null");
1796 }
1797 }
1798
1802 void setFilter(int channel, Filter<TF> &filter) {
1803 setFilter(channel, &filter);
1804 }
1805
1806 protected:
1807 int channels = 0;
1808 Stream *p_stream = nullptr;
1809 Print *p_print = nullptr;
1811};
1812
1814using ActivityCallback = void (*)(bool isActive);
1815
1826 public:
1827 VolumeMeter() = default;
1830 VolumeMeter(Print &print) { setOutput(print); }
1831 VolumeMeter(Stream &stream) { setStream(stream); }
1832
1835 return begin();
1836 }
1837
1838 bool begin() override {
1840 return true;
1841 }
1842
1843 void setAudioInfo(AudioInfo info) override {
1844 int channels = info.channels;
1845 LOGI("VolumeMeter::setAudioInfo: channels %d", channels);
1847 if (channels > 0) {
1848 volumes.resize(channels);
1849 volumes_tmp.resize(channels);
1850 sum.resize(channels);
1851 sum_tmp.resize(channels);
1852 }
1853 }
1854
1855 size_t write(const uint8_t *data, size_t len) override {
1856 updateVolumes(data, len);
1857 size_t result = len;
1858 if (p_out != nullptr) {
1859 result = p_out->write(data, len);
1860 }
1861 return result;
1862 }
1863
1864 size_t readBytes(uint8_t *data, size_t len) override {
1865 if (p_stream == nullptr) return 0;
1866 size_t result = p_stream->readBytes(data, len);
1867 updateVolumes((const uint8_t *)data, len);
1868 return result;
1869 }
1870
1873 float volume() { return f_volume; }
1874
1877 float volume(int channel) {
1878 if (volumes.size() == 0) {
1879 LOGE("begin not called!");
1880 return 0.0f;
1881 }
1882 if (channel >= volumes.size()) {
1883 LOGE("invalid channel %d", channel);
1884 return 0.0f;
1885 }
1886 return volumes[channel];
1887 }
1888
1893
1895 float volumeRatio(int channel) {
1897 }
1898
1900 float volumeDB() {
1901 // prevent infinite value
1902 if (volumeRatio() == 0) return -1000;
1903 return 20.0f * log10(volumeRatio());
1904 }
1905
1907 float volumeDB(int channel) {
1908 // prevent infinite value
1909 if (volumeRatio(channel) == 0) return -1000;
1910 return 20.0f * log10(volumeRatio(channel));
1911 }
1912
1914 float volumePercent() { return 100.0f * volumeRatio(); }
1915
1917 float volumePercent(int channel) { return 100.0f * volumeRatio(channel); }
1918
1920 float volumeAvg() {
1921 float total = 0;
1922 size_t count = 0;
1923 for (int j = 0; j < info.channels; j++) {
1924 total += sum[j];
1925 count += sample_count_per_channel;
1926 }
1927 return total / count;
1928 }
1929
1931 float volumeAvg(int channel) {
1932 return sum[channel] / sample_count_per_channel;
1933 }
1934
1936 void clear() {
1937 f_volume_tmp = 0;
1938 for (int j = 0; j < info.channels; j++) {
1939 volumes_tmp[j] = 0;
1940 sum_tmp[j] = 0;
1941 }
1942 }
1943
1948 void setActivityCallback(ActivityCallback callback, float threshold = 0.2, unsigned long duration_ms = 2000) {
1949 activity_callback = callback;
1950 activity_threshold = threshold;
1951 activity_duration_ms = duration_ms;
1952 activity_monitoring_enabled = (callback != nullptr);
1953 }
1954
1957 bool isActive() const {
1958 return is_active;
1959 }
1960
1963 setOutput((Print &)out);
1964 }
1967 setStream((Stream &)io);
1968 }
1969 void setOutput(Print &out) override { p_out = &out; }
1970 void setStream(Stream &io) override {
1971 p_out = &io;
1972 p_stream = &io;
1973 }
1974
1975 protected:
1976 float f_volume_tmp = 0;
1977 float f_volume = 0;
1982 Print *p_out = nullptr;
1983 Stream *p_stream = nullptr;
1985
1986 // Activity monitoring
1989 unsigned long activity_duration_ms = 0;
1991 bool is_active = false;
1992 unsigned long inactive_start_time = 0;
1993
1994 void updateVolumes(const uint8_t *data, size_t len) {
1995 if (data == nullptr || len == 0) return;
1996 clear();
1997 switch (info.bits_per_sample) {
1998 case 8:
1999 updateVolumesT<int8_t>(data, len);
2000 break;
2001 case 16:
2002 updateVolumesT<int16_t>(data, len);
2003 break;
2004 case 24:
2005 updateVolumesT<int24_t>(data, len);
2006 break;
2007 case 32:
2008 updateVolumesT<int32_t>(data, len);
2009 break;
2010 default:
2011 LOGE("Unsupported bits_per_sample: %d", info.bits_per_sample);
2012 break;
2013 }
2014 }
2015
2016 template <typename T>
2017 void updateVolumesT(const uint8_t *buffer, size_t size) {
2018 T *bufferT = (T *)buffer;
2019 int samplesCount = size / sizeof(T);
2021 for (int j = 0; j < samplesCount; j++) {
2022 float tmp = abs(static_cast<float>(bufferT[j]));
2023 updateVolume(tmp, j);
2024 }
2025 commit();
2026 }
2027
2028 void updateVolume(float tmp, int j) {
2029 if (tmp > f_volume_tmp) {
2030 f_volume_tmp = tmp;
2031 }
2032 if (volumes_tmp.size() > 0 && info.channels > 0) {
2033 int ch = j % info.channels;
2034 if (tmp > volumes_tmp[ch]) {
2035 volumes_tmp[ch] = tmp;
2036 sum_tmp[ch] = tmp;
2037 }
2038 }
2039 }
2040
2041 void commit() {
2043 for (int j = 0; j < info.channels; j++) {
2044 volumes[j] = volumes_tmp[j];
2045 sum[j] = sum_tmp[j];
2046 }
2048 }
2049
2051 if (!activity_monitoring_enabled || activity_callback == nullptr) return;
2052
2055 unsigned long current_time = millis();
2056
2057 if (above_threshold) {
2058 // Volume is above threshold - should be active
2059 if (!is_active) {
2060 is_active = true;
2061 activity_callback(true);
2062 }
2063 inactive_start_time = 0; // Reset inactive timer
2064 } else {
2065 // Volume is below threshold
2066 if (is_active) {
2067 // Currently active, check if we should transition to inactive
2068 if (inactive_start_time == 0) {
2069 // Start timing the inactive period
2070 inactive_start_time = current_time;
2071 } else if (current_time - inactive_start_time >= activity_duration_ms) {
2072 // Been below threshold long enough
2073 is_active = false;
2074 activity_callback(false);
2076 }
2077 }
2078 }
2079 }
2080};
2081
2082// legacy names
2086
2090
2104 public:
2154
2160
2168 return begin();
2169 }
2170
2175 bool begin() override {
2177 return true;
2178 }
2179
2188
2195 size_t write(const uint8_t *data, size_t len) override {
2196 size_t result = volume_meter.write(data, len);
2197 if (result > 0 && volume_meter.volumePercent() > limit_percent) {
2199 }
2200 return result;
2201 }
2202
2209 size_t readBytes(uint8_t *data, size_t len) override {
2210 size_t result = volume_meter.readBytes(data, len);
2211 if (result > 0 && volume_meter.volumePercent() > limit_percent) {
2213 }
2214 return result;
2215 }
2216
2221 void setOutput(Print &out) override { volume_meter.setOutput(out); }
2231 void setStream(Stream &io) override { volume_meter.setStream(io); }
2237
2243
2249 bool isActive(uint16_t time_ms = 1000) {
2250 return (millis() - time_over_last_volume_limit) < time_ms;
2251 }
2252
2253protected:
2257};
2258
2259#ifdef USE_TIMER
2274
2275// forward declaration: relevant only if use_timer == true
2276static void timerCallback(void *obj);
2287 friend void timerCallback(void *obj);
2288
2289 public:
2291
2293 TRACED();
2294 if (timer != nullptr) delete timer;
2295 if (buffer != nullptr) delete buffer;
2296 if (frame != nullptr) delete[] frame;
2297 }
2298
2304
2318
2322
2324 LOGD("%s: %s", LOG_METHOD,
2325 config.rx_tx_mode == RX_MODE ? "RX_MODE" : "TX_MODE");
2326 this->cfg = config;
2327 this->frameCallback = config.callback;
2328 if (cfg.use_timer) {
2330 frame = new uint8_t[frameSize];
2332 timer = new TimerAlarmRepeating();
2334 if (cfg.timer_id >= 0) {
2336 }
2338 LOGI("sample_rate: %u -> time: %u milliseconds",
2339 (unsigned int)cfg.sample_rate, (unsigned int)time);
2342 }
2343
2345 active = true;
2346 }
2347
2349 bool begin() {
2350 TRACED();
2351 if (this->frameCallback != nullptr) {
2352 if (cfg.use_timer) {
2353 timer->begin(timerCallback, time, TimeUnit::US);
2354 }
2355 active = true;
2356 }
2357 return active;
2358 }
2359
2361 void end() {
2362 TRACED();
2363 if (cfg.use_timer) {
2364 timer->end();
2365 }
2366 active = false;
2367 }
2368
2371
2372 protected:
2374 bool active = false;
2376 // below only relevant with timer
2379 uint8_t *frame = nullptr;
2382 unsigned long lastTimestamp = 0u;
2385
2386 // used for audio sink
2387 virtual size_t writeExt(const uint8_t *data, size_t len) override {
2388 if (!active) return 0;
2389 TRACED();
2390 size_t result = 0;
2391 if (!cfg.use_timer) {
2392 result = frameCallback((uint8_t *)data, len);
2393 } else {
2394 result = buffer->writeArray((uint8_t *)data, len);
2395 }
2396 if (++printCount % 10000 == 0) printSampleRate();
2397 return result;
2398 }
2399
2400 // used for audio source
2401 virtual size_t readExt(uint8_t *data, size_t len) override {
2402 if (!active) return 0;
2403 TRACED();
2404
2405 size_t result = 0;
2406 if (!cfg.use_timer) {
2407 result = frameCallback(data, len);
2408 } else {
2409 result = buffer->readArray(data, len);
2410 }
2411 if (++printCount % 10000 == 0) printSampleRate();
2412 return result;
2413 }
2414
2416 virtual void measureSampleRate() {
2417 unsigned long ms = millis();
2418 if (lastTimestamp > 0u) {
2420 if (diff > 0) {
2421 uint16_t rate = 1 * 1000 / diff;
2422
2423 if (currentRateValue == 0) {
2424 currentRateValue = rate;
2425 } else {
2426 currentRateValue = (currentRateValue + rate) / 2;
2427 }
2428 }
2429 }
2430 lastTimestamp = ms;
2431 }
2432
2434 virtual void printSampleRate() {
2435 LOGI("effective sample rate: %u", (unsigned int)currentRateValue);
2436 if (cfg.adapt_sample_rate &&
2437 abs((int)currentRateValue - (int)cfg.sample_rate) > 200) {
2440 }
2441 }
2442};
2443
2444// relevant only if use_timer == true
2447 if (src != nullptr) {
2448 // LOGD("%s: %s", LOG_METHOD, src->cfg.rx_tx_mode==RX_MODE ?
2449 // "RX_MODE":"TX_MODE");
2450 if (src->cfg.rx_tx_mode == RX_MODE) {
2451 // input
2452 uint16_t available_bytes = src->frameCallback(src->frame, src->frameSize);
2453 uint16_t buffer_available = src->buffer->availableForWrite();
2454 if (buffer_available < available_bytes) {
2455 // if buffer is full make space
2456 uint16_t to_clear = available_bytes - buffer_available;
2457 uint8_t tmp[to_clear];
2458 src->buffer->readArray(tmp, to_clear);
2459 }
2460 if (src->buffer->writeArray(src->frame, available_bytes) !=
2461 available_bytes) {
2462 assert(false);
2463 }
2464 } else {
2465 // output
2466 if (src->buffer != nullptr && src->frame != nullptr &&
2467 src->frameSize > 0) {
2468 uint16_t available_bytes =
2469 src->buffer->readArray(src->frame, src->frameSize);
2470 if (available_bytes !=
2471 src->frameCallback(src->frame, available_bytes)) {
2472 LOGE("data underflow");
2473 }
2474 }
2475 }
2476 src->measureSampleRate();
2477 }
2478}
2479
2480#endif
2481
2482} // 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:2103
void setOutput(Print &out) override
Set the output target.
Definition AudioStreams.h:2221
void setStream(AudioStream &io)
Set the input stream.
Definition AudioStreams.h:2236
AudioInputMonitor(AudioOutput &ao, uint8_t limitPercent=20)
Construct a new AudioInputMonitor with an output.
Definition AudioStreams.h:2127
uint8_t limit_percent
Threshold percent.
Definition AudioStreams.h:2255
AudioInputMonitor(Print &print, uint8_t limitPercent=20)
Construct a new AudioInputMonitor with a Print output.
Definition AudioStreams.h:2136
bool isActive(uint16_t time_ms=1000)
Returns true if the volume exceeded the limit during the last period.
Definition AudioStreams.h:2249
VolumeMeter volume_meter
Volume calculation.
Definition AudioStreams.h:2254
AudioInputMonitor(uint8_t limitPercent=20)
Construct a new AudioInputMonitor with a volume limit in percent.
Definition AudioStreams.h:2109
void setOutput(AudioOutput &out)
Set the output target.
Definition AudioStreams.h:2226
size_t readBytes(uint8_t *data, size_t len) override
Read audio data from the monitor (same as VolumeMeter)
Definition AudioStreams.h:2209
uint64_t time_over_last_volume_limit
Last over-limit time (ms)
Definition AudioStreams.h:2256
VolumeMeter & getVolumeMeter()
Access the underlying VolumeMeter.
Definition AudioStreams.h:2242
size_t write(const uint8_t *data, size_t len) override
Write audio data to the monitor (same as VolumeMeter)
Definition AudioStreams.h:2195
uint8_t limitPercent() const
Get the current volume threshold as percent.
Definition AudioStreams.h:2159
AudioInputMonitor(Stream &stream, uint8_t limitPercent=20)
Construct a new AudioInputMonitor with a Stream input.
Definition AudioStreams.h:2145
bool begin() override
Begin processing with the current audio information.
Definition AudioStreams.h:2175
void setAudioInfo(AudioInfo info) override
Set the audio information.
Definition AudioStreams.h:2184
void setStream(Stream &io) override
Set the input stream.
Definition AudioStreams.h:2231
void setLimitPercent(uint8_t percent)
Set the volume threshold as percent.
Definition AudioStreams.h:2153
bool begin(AudioInfo info)
Begin processing with the given audio information.
Definition AudioStreams.h:2166
AudioInputMonitor(AudioStream &as, uint8_t limitPercent=20)
Construct a new AudioInputMonitor with an input stream.
Definition AudioStreams.h:2118
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:554
void flush() override
empties the buffer
Definition AudioStreams.h:611
void setOutput(Print &out) override
Defines/Changes the output target.
Definition AudioStreams.h:585
size_t minReadBufferSize
Definition AudioStreams.h:677
virtual size_t readExt(uint8_t *data, size_t len)
Definition AudioStreams.h:703
void setMinUnbufferedReadSize(size_t size)
Definition AudioStreams.h:671
size_t write(uint8_t c) override
writes a byte to the buffer
Definition AudioStreams.h:593
Stream * p_in
Definition AudioStreams.h:676
virtual size_t writeExt(const uint8_t *data, size_t len)
Definition AudioStreams.h:700
size_t readBytes(uint8_t *data, size_t len) override
Use this method !!
Definition AudioStreams.h:640
int peek() override
peeks a byte - to be avoided
Definition AudioStreams.h:630
void refill()
refills the buffer with data from the source
Definition AudioStreams.h:680
BufferedStream(Print &out, size_t buffer_size=1024)
Definition AudioStreams.h:561
int available() override
Returns the available bytes.
Definition AudioStreams.h:658
void setStream(Print &out)
Definition AudioStreams.h:586
size_t write(const uint8_t *data, size_t len) override
Use this method: write an array.
Definition AudioStreams.h:601
size_t peekBytes(uint8_t *data, size_t len)
Provides data w/o consuming.
Definition AudioStreams.h:650
Print * p_out
Definition AudioStreams.h:675
BufferedStream(size_t buffer_size)
Definition AudioStreams.h:556
SingleBuffer< uint8_t > buffer
Definition AudioStreams.h:674
void clear()
Clears all the data in the buffer.
Definition AudioStreams.h:664
int read() override
reads a byte - to be avoided
Definition AudioStreams.h:620
BufferedStream(Stream &io, size_t buffer_size=1024)
Definition AudioStreams.h:567
void refill(size_t len)
refill only if not enough data
Definition AudioStreams.h:695
void resize(int size)
Resize the buffer.
Definition AudioStreams.h:667
void setStream(Stream &io) override
Defines/Changes the input & output.
Definition AudioStreams.h:587
BufferedStream(size_t buffer_size, Print &out)
Definition AudioStreams.h:573
BufferedStream(size_t buffer_size, Stream &io)
Definition AudioStreams.h:579
CallbackStream: A Stream that allows to register callback methods for accessing and providing data....
Definition AudioStreams.h:1558
bool active
Definition AudioStreams.h:1692
void setOutput(Print &out) override
Defines/Changes the output target.
Definition AudioStreams.h:1677
void setOutput(Stream &in)
same as setStream
Definition AudioStreams.h:1680
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:1571
size_t(* cb_read)(uint8_t *data, size_t len)
Definition AudioStreams.h:1694
virtual bool begin(AudioInfo info)
Definition AudioStreams.h:1611
size_t readBytes(uint8_t *data, size_t len) override
Definition AudioStreams.h:1635
virtual bool begin() override
Definition AudioStreams.h:1615
void setReadCallback(size_t(*cb_read)(uint8_t *data, size_t len))
Definition AudioStreams.h:1586
void end() override
Definition AudioStreams.h:1620
int available() override
Definition AudioStreams.h:1622
void setStream(Print &out)
same as set Output
Definition AudioStreams.h:1686
size_t(* cb_write)(const uint8_t *data, size_t len)
Definition AudioStreams.h:1693
size_t write(const uint8_t *data, size_t len) override
Definition AudioStreams.h:1652
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:1576
void setAvailableCallback(int(*cb)())
Definition AudioStreams.h:1596
Stream * p_stream
Definition AudioStreams.h:1698
void(* cb_audio_info)(AudioInfo info)
Definition AudioStreams.h:1696
void setAvailable(int val)
optioinally define available bytes for next read
Definition AudioStreams.h:1689
Print * p_out
Definition AudioStreams.h:1699
int available_bytes
Definition AudioStreams.h:1700
int(* cb_available)()
Definition AudioStreams.h:1697
void setAudioInfo(AudioInfo info) override
Updates the audio info and calls the callback.
Definition AudioStreams.h:1604
void setStream(Stream &in) override
Defines/Changes the input & output.
Definition AudioStreams.h:1671
size_t(* cb_update)(uint8_t *data, size_t len)
Definition AudioStreams.h:1695
CallbackStream(Stream &io, size_t(*cb_update)(uint8_t *data, size_t len))
Definition AudioStreams.h:1564
void setWriteCallback(size_t(*cb_write)(const uint8_t *data, size_t len))
Definition AudioStreams.h:1582
void setAudioInfoCallback(void(*cb)(AudioInfo info))
defines the callback to receive the actual audio info
Definition AudioStreams.h:1599
void setUpdateCallback(size_t(*cb_update)(uint8_t *data, size_t len))
Definition AudioStreams.h:1590
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:717
BaseConverter * p_converter
Definition AudioStreams.h:772
void setConverter(BaseConverter &cnv)
Definition AudioStreams.h:744
ConverterStream(Stream &stream, BaseConverter &converter)
Definition AudioStreams.h:723
ConverterStream(BaseConverter &converter)
Definition AudioStreams.h:721
virtual int availableForWrite()
Definition AudioStreams.h:746
size_t readBytes(uint8_t *data, size_t len) override
Definition AudioStreams.h:757
void setStream(Stream &stream)
Defines/Changes the input & output.
Definition AudioStreams.h:733
Stream * p_stream
Definition AudioStreams.h:770
virtual size_t write(const uint8_t *data, size_t len)
Definition AudioStreams.h:748
Print * p_out
Definition AudioStreams.h:771
void setOutput(Print &out)
Defines/Changes the output target.
Definition AudioStreams.h:739
ConverterStream(Print &out, BaseConverter &converter)
Definition AudioStreams.h:728
virtual int available() override
Returns the available bytes in the buffer: to be avoided.
Definition AudioStreams.h:764
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:1711
virtual size_t write(const uint8_t *data, size_t len) override
Definition AudioStreams.h:1765
void setStream(Stream &stream) override
Defines/Changes the input & output.
Definition AudioStreams.h:1729
ConverterNChannels< T, TF > * p_converter
Definition AudioStreams.h:1810
int channels
Definition AudioStreams.h:1807
virtual ~FilteredStream()
Definition AudioStreams.h:1727
size_t readBytes(uint8_t *data, size_t len) override
Definition AudioStreams.h:1771
void setOutput(Print &stream) override
Defines/Changes the output target.
Definition AudioStreams.h:1734
void setFilter(int channel, Filter< TF > &filter)
Definition AudioStreams.h:1802
void end() override
Definition AudioStreams.h:1757
virtual int availableForWrite() override
Definition AudioStreams.h:1784
FilteredStream(Stream &stream, int channels)
Definition AudioStreams.h:1715
Stream * p_stream
Definition AudioStreams.h:1808
FilteredStream(Stream &stream)
Definition AudioStreams.h:1714
void setFilter(int channel, Filter< TF > *filter)
Definition AudioStreams.h:1791
FilteredStream(Print &stream, int channels)
Definition AudioStreams.h:1721
bool begin() override
Definition AudioStreams.h:1746
FilteredStream(Print &stream)
Definition AudioStreams.h:1720
Print * p_print
Definition AudioStreams.h:1809
bool begin(AudioInfo info)
Definition AudioStreams.h:1736
virtual int available() override
Definition AudioStreams.h:1779
Source for reading generated tones. Please note.
Definition AudioStreams.h:442
bool active
Definition AudioStreams.h:539
void flush() override
Definition AudioStreams.h:533
void setInput(SoundGenerator< T > &generator)
Definition AudioStreams.h:451
const char * source_not_defined_error
Definition AudioStreams.h:543
void setAudioInfo(AudioInfo newInfo) override
Defines the input AudioInfo.
Definition AudioStreams.h:463
void resize(int maxReadSize)
Redefine the buffer size which is reported in available()
Definition AudioStreams.h:536
size_t readBytes(uint8_t *data, size_t len) override
privide the data as byte stream
Definition AudioStreams.h:517
void end() override
stop the processing
Definition AudioStreams.h:497
AudioInfo defaultConfig()
Definition AudioStreams.h:455
GeneratedSoundStream(SoundGenerator< T > &generator)
Definition AudioStreams.h:446
bool isActive()
Definition AudioStreams.h:526
bool begin() override
start the processing
Definition AudioStreams.h:471
AudioInfo audioInfo() override
provides the actual input AudioInfo
Definition AudioStreams.h:505
int buffer_size
Definition AudioStreams.h:541
bool begin(AudioInfo cfg)
start the processing
Definition AudioStreams.h:484
virtual int available() override
This is unbounded so we just return the buffer size.
Definition AudioStreams.h:514
SoundGenerator< T > * p_generator
Definition AudioStreams.h:540
Merges multiple input streams. So if you provide 2 mono channels you get a stereo signal as result wi...
Definition AudioStreams.h:1449
InputMerge()=default
Default constructor.
int total_channel_count
Definition AudioStreams.h:1546
virtual bool begin(AudioInfo info)
Definition AudioStreams.h:1469
size_t readBytes(uint8_t *data, size_t len) override
Provides the data from all streams mixed together.
Definition AudioStreams.h:1481
virtual bool begin() override
Definition AudioStreams.h:1474
Vector< MergeRecord > records
Definition AudioStreams.h:1545
void end() override
Remove all input streams.
Definition AudioStreams.h:1516
int available() override
Provides the min available data from all streams.
Definition AudioStreams.h:1522
void add(Stream &in, int channelCount, float weight=1.0)
Adds a new input stream with 1 channel.
Definition AudioStreams.h:1499
void setWeight(int channel, float weight)
Definition AudioStreams.h:1507
int channelCount()
Number of channels to which are mixed together = number of result channels.
Definition AudioStreams.h:1519
InputMerge(Stream &left, Stream &right)
Constructor for stereo signal from to mono input stream.
Definition AudioStreams.h:1457
AudioInfo audioInfo() override
Provides the audio info with the total channel count.
Definition AudioStreams.h:1463
MixerStream is mixing the input from Multiple Input Streams. All streams must have the same audo form...
Definition AudioStreams.h:1241
bool limit_available_data
Definition AudioStreams.h:1377
bool remove()
Removes all streams which have no data available.
Definition AudioStreams.h:1339
Vector< float > gains
Definition AudioStreams.h:1374
int nextEmptyIndex()
Provides you the index of the next empty stream. -1 when none is found.
Definition AudioStreams.h:1362
virtual bool begin(AudioInfo info)
Definition AudioStreams.h:1264
int indexOf(Stream &stream)
Provides the actual index of the stream.
Definition AudioStreams.h:1353
bool set(int index, Stream &in)
Replaces a stream at the indicated index.
Definition AudioStreams.h:1254
size_t readBytes(uint8_t *data, size_t len) override
Provides the data from all streams mixed together.
Definition AudioStreams.h:1297
void recalculateWeights()
Recalculate the weights.
Definition AudioStreams.h:1383
int add(Stream &in, int weight=100)
Adds a new input stream and returns it's actual index position.
Definition AudioStreams.h:1246
void resultAdd(float fact, int samples_eff)
Definition AudioStreams.h:1427
void end() override
Remove all input streams.
Definition AudioStreams.h:1284
bool remove(int idx)
Removes a stream by index position.
Definition AudioStreams.h:1328
Vector< int > weights
Definition AudioStreams.h:1373
int retry_count
Definition AudioStreams.h:1378
Vector< Stream * > streams
Definition AudioStreams.h:1372
int availableBytes()
Provides the available bytes from the first stream with data.
Definition AudioStreams.h:1419
void setLimitToAvailableData(bool flag)
Definition AudioStreams.h:1321
Vector< SumT > result_vect
Definition AudioStreams.h:1379
void setRetryCount(int retry)
Definition AudioStreams.h:1325
int total_weights
Definition AudioStreams.h:1375
Vector< T > current_vect
Definition AudioStreams.h:1380
int readBytesVector(T *p_data, int byteCount)
mixing using a vector of samples
Definition AudioStreams.h:1396
void resultClear(int samples)
Definition AudioStreams.h:1434
void setWeight(int index, int weight)
Definition AudioStreams.h:1274
int frame_size
Definition AudioStreams.h:1376
Stream * operator[](int idx)
Provides the stream pointer at the indicated index.
Definition AudioStreams.h:1356
int size()
Number of stremams to which are mixed together.
Definition AudioStreams.h:1294
Class which measures the thruput.
Definition AudioStreams.h:781
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:829
void setOutput(Print &out) override
Defines/Changes the output target.
Definition AudioStreams.h:818
uint32_t estimatedTotalTimeFor(uint32_t totalBytes)
Provides the estimated runtime in milliseconds for the indicated total.
Definition AudioStreams.h:882
bool report_bytes
Definition AudioStreams.h:917
uint32_t ms_at_begin
Definition AudioStreams.h:919
uint32_t start_time
Definition AudioStreams.h:911
uint32_t timeSinceBegin()
Provides the time in ms since the last call of begin()
Definition AudioStreams.h:876
size_t readBytes(uint8_t *data, size_t len) override
Provides the data from all streams mixed together.
Definition AudioStreams.h:821
MeasuringStream(Stream &stream, int count=10, Print *logOut=nullptr)
Definition AudioStreams.h:800
int framesPerSecond()
Returns the actual thrughput in frames (samples) per second.
Definition AudioStreams.h:843
uint32_t bytesSinceBegin()
Provides the total processed bytes since the last call of begin()
Definition AudioStreams.h:879
int available() override
Definition AudioStreams.h:826
virtual int availableForWrite() override
Provides the nubmer of bytes we can write.
Definition AudioStreams.h:835
MeasuringStream(int count=10, Print *logOut=nullptr)
Definition AudioStreams.h:783
uint32_t total_bytes_since_begin
Definition AudioStreams.h:920
Stream * p_stream
Definition AudioStreams.h:909
size_t measure(size_t len)
Definition AudioStreams.h:922
int total_bytes
Definition AudioStreams.h:912
void setFrameSize(int size)
Trigger reporting in frames (=samples) per second.
Definition AudioStreams.h:868
int max_count
Definition AudioStreams.h:907
void setReportBytes(bool flag)
Report in bytes instead of samples.
Definition AudioStreams.h:871
uint32_t estimatedOpenTimeFor(uint32_t totalBytes)
Provides the estimated time from now to the end in ms.
Definition AudioStreams.h:889
const char * name
Definition AudioStreams.h:918
void setLogOutput(Print &out)
Defines the logging output.
Definition AudioStreams.h:809
int bytes_per_second
Definition AudioStreams.h:913
MeasuringStream(Print &print, int count=10, Print *logOut=nullptr)
Definition AudioStreams.h:792
bool setProcessedBytes(uint32_t pos)
Definition AudioStreams.h:896
Print * p_logout
Definition AudioStreams.h:916
void printResult()
Definition AudioStreams.h:940
void setName(const char *name)
Definition AudioStreams.h:873
uint32_t startTime()
Provides the time when the last measurement was started.
Definition AudioStreams.h:849
bool begin() override
Definition AudioStreams.h:856
Print * p_print
Definition AudioStreams.h:910
void setAudioInfo(AudioInfo info) override
Defines the input AudioInfo.
Definition AudioStreams.h:851
int count
Definition AudioStreams.h:908
int frame_size
Definition AudioStreams.h:914
void setStream(Stream &io) override
Defines/Changes the input & output.
Definition AudioStreams.h:812
bool begin(AudioInfo info)
Definition AudioStreams.h:862
NullStream null
Definition AudioStreams.h:915
int bytesPerSecond()
Returns the actual thrughput in bytes per second.
Definition AudioStreams.h:840
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:169
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:269
virtual void clear(bool reset=false)
clears the audio data: sets all values to 0
Definition AudioStreams.h:239
virtual uint8_t * data()
Provides access to the data array.
Definition AudioStreams.h:297
virtual int read() override
Definition AudioStreams.h:202
~MemoryStream()
Definition AudioStreams.h:117
bool is_active
Definition AudioStreams.h:331
void setValue(const uint8_t *buffer, int buffer_size, MemoryType memoryType=FLASH_RAM)
Update the values (buffer and size)
Definition AudioStreams.h:313
MemoryStream(MemoryStream &&source)
Move Constructor.
Definition AudioStreams.h:111
uint8_t * buffer
Definition AudioStreams.h:327
virtual size_t readBytes(uint8_t *data, size_t len) override
Definition AudioStreams.h:210
MemoryStream(MemoryStream &source)
Copy Constructor.
Definition AudioStreams.h:108
virtual int availableForWrite() override
Definition AudioStreams.h:196
void(* rewind_cb)()
Definition AudioStreams.h:330
virtual size_t write(uint8_t byte) override
Definition AudioStreams.h:156
virtual void setLoop(bool loop)
Definition AudioStreams.h:258
virtual bool resize(size_t size)
Definition AudioStreams.h:276
virtual bool setAvailable(size_t len)
update the write_pos (e.g. when we used data() to update the array)
Definition AudioStreams.h:300
int write_pos
Definition AudioStreams.h:323
MemoryType memory_type
Definition AudioStreams.h:328
int read_pos
Definition AudioStreams.h:324
virtual int peek() override
Definition AudioStreams.h:222
bool owns_memory
Definition AudioStreams.h:332
bool memoryCanChange()
Definition AudioStreams.h:334
MemoryStream(int buffer_size, MemoryType memoryType)
Constructor for alloction in RAM.
Definition AudioStreams.h:88
int rewind_pos
Definition AudioStreams.h:326
void rewind()
Resets the read pointer.
Definition AudioStreams.h:150
bool begin() override
resets the read pointer and write pointer if the memory is changeable
Definition AudioStreams.h:138
void copy(MemoryStream &source)
Definition AudioStreams.h:336
virtual void end() override
Definition AudioStreams.h:233
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:325
void setRewindCallback(void(*cb)())
Callback which is executed when we rewind (in loop mode) to the beginning.
Definition AudioStreams.h:310
virtual void flush() override
Definition AudioStreams.h:231
bool is_loop
Definition AudioStreams.h:329
virtual int available() override
Definition AudioStreams.h:182
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:343
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:973
bool begin(size_t len)
Definition AudioStreams.h:1011
ProgressStream(Print &print)
Definition AudioStreams.h:977
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:1061
bool begin(ProgressStreamInfo info)
Definition AudioStreams.h:1016
size_t size()
Provides the current total size (defined by setSize)
Definition AudioStreams.h:1029
void setStream(Stream &stream) override
Defines/Changes the input & output.
Definition AudioStreams.h:993
ProgressStreamInfo & defaultConfig()
Definition AudioStreams.h:986
size_t total_processed
Definition AudioStreams.h:1077
size_t totalSecs()
Converts the totalBytes() to seconds.
Definition AudioStreams.h:1041
ProgressStreamInfo progress_info
Definition AudioStreams.h:1073
size_t byteRate()
Definition AudioStreams.h:1084
size_t readBytes(uint8_t *data, size_t len) override
Provides the data from all streams mixed together.
Definition AudioStreams.h:1050
size_t processedBytes()
Provides the number of processed bytes.
Definition AudioStreams.h:1032
void setPrint(Print &print)
Definition AudioStreams.h:1000
int available() override
Definition AudioStreams.h:1055
void setSize(size_t len)
Updates the total size and restarts the percent calculation.
Definition AudioStreams.h:1023
virtual int availableForWrite() override
Provides the nubmer of bytes we can write.
Definition AudioStreams.h:1067
Stream * p_stream
Definition AudioStreams.h:1074
size_t measure(size_t len)
Definition AudioStreams.h:1079
float percentage()
Provides the processed percentage: If no size has been defined we return 0.
Definition AudioStreams.h:1044
AudioInfoSupport * p_info_from
Definition AudioStreams.h:1076
size_t processedSecs()
Provides the number of processed seconds.
Definition AudioStreams.h:1035
bool begin() override
Definition AudioStreams.h:1002
Print * p_print
Definition AudioStreams.h:1075
void setAudioInfo(AudioInfo info) override
Defines the input AudioInfo.
Definition AudioStreams.h:988
size_t totalBytes()
Provides the total_size provided in the configuration.
Definition AudioStreams.h:1038
void setStream(Print &print)
Definition AudioStreams.h:998
ProgressStream(Stream &stream)
Definition AudioStreams.h:979
ProgressStream(AudioStream &stream)
Definition AudioStreams.h:981
Configuration for ProgressStream.
Definition AudioStreams.h:962
size_t total_size
Definition AudioStreams.h:964
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:386
virtual size_t write(const uint8_t *data, size_t len) override
Definition AudioStreams.h:415
size_t size()
Definition AudioStreams.h:424
virtual int read() override
Definition AudioStreams.h:405
RingBufferStream(int size=DEFAULT_BUFFER_SIZE)
Definition AudioStreams.h:388
virtual size_t readBytes(uint8_t *data, size_t len) override
Definition AudioStreams.h:411
virtual int availableForWrite() override
Definition AudioStreams.h:395
virtual int peek() override
Definition AudioStreams.h:400
virtual size_t write(uint8_t c) override
Definition AudioStreams.h:420
void resize(int size)
Definition AudioStreams.h:422
RingBuffer< uint8_t > buffer
Definition AudioStreams.h:427
virtual void flush() override
Definition AudioStreams.h:399
virtual int available() override
Definition AudioStreams.h:390
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:63
virtual bool begin(AudioInfo info)
Starts the processing with the provided AudioInfo.
Definition SoundGenerator.h:35
virtual bool isActive()
Checks if the begin method has been called - after end() isActive is false.
Definition SoundGenerator.h:57
virtual AudioInfo audioInfo()
Provides the AudioInfo.
Definition SoundGenerator.h:88
virtual void end()
Ends the processing.
Definition SoundGenerator.h:54
virtual AudioInfo defaultConfig()
Provides the default configuration.
Definition SoundGenerator.h:76
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:1115
void setOutput(Print &out) override
Defines/Changes the output target.
Definition AudioStreams.h:1128
uint32_t sum_frames
Definition AudioStreams.h:1224
Throttle(Print &out)
Definition AudioStreams.h:1118
Stream * p_in
Definition AudioStreams.h:1228
Throttle(Stream &io)
Definition AudioStreams.h:1119
uint32_t start_time
Definition AudioStreams.h:1223
ThrottleConfig cfg
Definition AudioStreams.h:1225
size_t readBytes(uint8_t *data, size_t len) override
Definition AudioStreams.h:1181
int64_t getDelayMs(uint64_t frames)
Definition AudioStreams.h:1214
int available() override
Definition AudioStreams.h:1176
size_t write(const uint8_t *data, size_t len) override
Definition AudioStreams.h:1170
int availableForWrite() override
Definition AudioStreams.h:1163
void delayFrames(size_t frames)
Definition AudioStreams.h:1195
void delayBytes(size_t bytes)
Definition AudioStreams.h:1192
bool begin(ThrottleConfig cfg)
Definition AudioStreams.h:1135
Print * p_out
Definition AudioStreams.h:1227
int64_t getDelayUs(uint64_t frames)
Definition AudioStreams.h:1210
int64_t getDelaySec(uint64_t frames)
Definition AudioStreams.h:1218
void startDelay()
Definition AudioStreams.h:1158
bool begin() override
Definition AudioStreams.h:1151
int frame_size
Definition AudioStreams.h:1226
void setStream(Stream &io) override
Defines/Changes the input & output.
Definition AudioStreams.h:1122
ThrottleConfig defaultConfig()
Definition AudioStreams.h:1130
bool begin(AudioInfo info)
Definition AudioStreams.h:1143
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:2286
bool active
Definition AudioStreams.h:2374
void begin(TimerCallbackAudioStreamInfo config)
Definition AudioStreams.h:2323
TimerCallbackAudioStream()
Definition AudioStreams.h:2290
TimerCallbackAudioStreamInfo audioInfoExt()
Provides the current audio information.
Definition AudioStreams.h:2320
uint16_t currentSampleRate()
Provides the effective sample rate.
Definition AudioStreams.h:2370
virtual size_t writeExt(const uint8_t *data, size_t len) override
Definition AudioStreams.h:2387
uint16_t frameSize
Definition AudioStreams.h:2380
TimerCallbackAudioStreamInfo defaultConfig()
Provides the default configuration.
Definition AudioStreams.h:2300
bool begin()
Restart the processing.
Definition AudioStreams.h:2349
uint32_t currentRateValue
Definition AudioStreams.h:2383
friend void timerCallback(void *obj)
Definition AudioStreams.h:2445
AudioInfo audioInfo()
provides the actual input AudioInfo
Definition AudioStreams.h:2321
virtual void measureSampleRate()
calculates the effective sample rate
Definition AudioStreams.h:2416
virtual void setAudioInfo(AudioInfo info)
updates the audio information
Definition AudioStreams.h:2306
virtual void printSampleRate()
log and update effective sample rate
Definition AudioStreams.h:2434
virtual size_t readExt(uint8_t *data, size_t len) override
Definition AudioStreams.h:2401
RingBuffer< uint8_t > * buffer
Definition AudioStreams.h:2378
~TimerCallbackAudioStream()
Definition AudioStreams.h:2292
void end()
Stops the processing.
Definition AudioStreams.h:2361
unsigned long lastTimestamp
Definition AudioStreams.h:2382
TimerAlarmRepeating * timer
Definition AudioStreams.h:2377
TimerCallbackAudioStreamInfo cfg
Definition AudioStreams.h:2373
uint32_t time
Definition AudioStreams.h:2381
uint32_t printCount
Definition AudioStreams.h:2384
uint8_t * frame
Definition AudioStreams.h:2379
uint16_t(* frameCallback)(uint8_t *data, uint16_t len)
Definition AudioStreams.h:2375
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:1825
void setOutput(Print &out) override
Defines/Changes the output target.
Definition AudioStreams.h:1969
void setStream(AudioStream &io)
Definition AudioStreams.h:1965
float volumeRatio()
Volume Ratio: max amplitude is 1.0.
Definition AudioStreams.h:1890
float volumeAvg(int channel)
Average volume of indicated channel.
Definition AudioStreams.h:1931
float volume()
Definition AudioStreams.h:1873
Vector< float > sum
Definition AudioStreams.h:1980
size_t sample_count_per_channel
Definition AudioStreams.h:1984
Vector< float > volumes_tmp
Definition AudioStreams.h:1979
VolumeMeter(AudioOutput &ao)
Definition AudioStreams.h:1829
bool isActive() const
Definition AudioStreams.h:1957
bool is_active
Definition AudioStreams.h:1991
unsigned long activity_duration_ms
Definition AudioStreams.h:1989
float volumePercent()
Volume in %: max amplitude is 100.
Definition AudioStreams.h:1914
void updateVolumes(const uint8_t *data, size_t len)
Definition AudioStreams.h:1994
void setOutput(AudioOutput &out)
Definition AudioStreams.h:1961
size_t readBytes(uint8_t *data, size_t len) override
Definition AudioStreams.h:1864
Vector< float > volumes
Definition AudioStreams.h:1978
float f_volume_tmp
Definition AudioStreams.h:1976
size_t write(const uint8_t *data, size_t len) override
Definition AudioStreams.h:1855
Stream * p_stream
Definition AudioStreams.h:1983
unsigned long inactive_start_time
Definition AudioStreams.h:1992
float volumePercent(int channel)
Volume of indicated channel in %: max amplitude is 100.
Definition AudioStreams.h:1917
float volumeAvg()
Average volume of all channels.
Definition AudioStreams.h:1920
float f_volume
Definition AudioStreams.h:1977
void updateVolumesT(const uint8_t *buffer, size_t size)
Definition AudioStreams.h:2017
bool activity_monitoring_enabled
Definition AudioStreams.h:1990
Print * p_out
Definition AudioStreams.h:1982
Vector< float > sum_tmp
Definition AudioStreams.h:1981
VolumeMeter(Stream &stream)
Definition AudioStreams.h:1831
void updateVolume(float tmp, int j)
Definition AudioStreams.h:2028
void setActivityCallback(ActivityCallback callback, float threshold=0.2, unsigned long duration_ms=2000)
Definition AudioStreams.h:1948
void updateActivityState()
Definition AudioStreams.h:2050
void clear()
Resets the actual volume.
Definition AudioStreams.h:1936
bool begin() override
Definition AudioStreams.h:1838
float volumeRatio(int channel)
Volume Ratio of indicated channel: max amplitude is 1.0.
Definition AudioStreams.h:1895
float activity_threshold
Definition AudioStreams.h:1988
float volumeDB(int channel)
Volume of indicated channel in db: max amplitude is 0.
Definition AudioStreams.h:1907
void setAudioInfo(AudioInfo info) override
Defines the input AudioInfo.
Definition AudioStreams.h:1843
void commit()
Definition AudioStreams.h:2041
ActivityCallback activity_callback
Definition AudioStreams.h:1987
void setStream(Stream &io) override
Defines/Changes the input & output.
Definition AudioStreams.h:1970
float volumeDB()
Volume in db: max amplitude is 0 (range: -1000 to 0)
Definition AudioStreams.h:1900
VolumeMeter(Print &print)
Definition AudioStreams.h:1830
bool begin(AudioInfo info)
Definition AudioStreams.h:1833
float volume(int channel)
Definition AudioStreams.h:1877
VolumeMeter(AudioStream &as)
Definition AudioStreams.h:1828
#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:2445
unsigned long micros(void)
Definition Time.h:33
void(*)(bool isActive) ActivityCallback
Callback function type for activity state changes.
Definition AudioStreams.h:1814
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:1534
int channels
Definition AudioStreams.h:1536
MergeRecord(Stream *str, int ch, float w)
Definition AudioStreams.h:1539
float weight
Definition AudioStreams.h:1537
Stream * stream
Definition AudioStreams.h:1535
Configure Throttle setting.
Definition AudioStreams.h:1100
ThrottleConfig()
Definition AudioStreams.h:1101
int correction_us
Definition AudioStreams.h:1106
TimerCallbackAudioStream Configuration.
Definition AudioStreams.h:2265
TimerFunction timer_function
Definition AudioStreams.h:2270
RxTxMode rx_tx_mode
Definition AudioStreams.h:2266
uint16_t(* callback)(uint8_t *data, uint16_t len)
Definition AudioStreams.h:2272
bool use_timer
Definition AudioStreams.h:2268
int timer_id
Definition AudioStreams.h:2269
bool adapt_sample_rate
Definition AudioStreams.h:2271
uint16_t buffer_size
Definition AudioStreams.h:2267