arduino-audio-tools
Loading...
Searching...
No Matches
AudioStreamsConverter.h
Go to the documentation of this file.
1#pragma once
2#include "AudioIO.h"
5
6namespace audio_tools {
7
14template <typename T>
16 public:
21 ChannelFormatConverterStreamT const&) = delete;
22
23 bool begin(int fromChannels, int toChannels) {
24 LOGI("begin %d -> %d channels", fromChannels, toChannels);
25 // is_output_notify = false;
26 from_channels = fromChannels;
27 to_channels = toChannels;
28 factor = static_cast<float>(toChannels) / static_cast<float>(fromChannels);
29
32
33 return true;
34 }
35
36 bool begin() override { return begin(from_channels, to_channels); }
37
38 void setToChannels(uint16_t channels) { to_channels = channels; }
39
40 virtual size_t write(const uint8_t* data, size_t len) override {
41 TRACED();
42 if (p_out == nullptr) return 0;
43 // addNotifyOnFirstWrite();
45 return p_out->write(data, len);
46 }
47 size_t resultBytes = convert(data, len);
48 // assert(resultBytes == factor * len);
49 p_out->write((uint8_t*)buffer.data(), resultBytes);
50 return len;
51 }
52
53 size_t readBytes(uint8_t* data, size_t len) override {
54 TRACED();
55 if (p_io == nullptr) return 0;
57 return p_io->readBytes(data, len);
58 }
59 size_t in_bytes = 1.0f / factor * len;
60 bufferTmp.resize(in_bytes);
61 p_io->readBytes(bufferTmp.data(), in_bytes);
62 size_t resultBytes = convert(bufferTmp.data(), in_bytes);
63 assert(len == resultBytes);
64 memcpy(data, (uint8_t*)buffer.data(), len);
65 return len;
66 }
67
68 void setAudioInfo(AudioInfo cfg) override {
71 }
72
75 AudioInfo out = audioInfo();
77 return out;
78 }
79
80 virtual int available() override {
81 return p_io != nullptr ? p_io->available() : 0;
82 }
83
84 virtual int availableForWrite() override {
85 if (p_out == nullptr) return 0;
86 return 1.0f / factor * p_out->availableForWrite();
87 }
88
89 float getByteFactor() override {
90 return static_cast<float>(to_channels) / static_cast<float>(from_channels);
91 }
92
93 protected:
95 int to_channels = 2;
96 float factor = 1;
100
101 size_t convert(const uint8_t* in_data, size_t size) {
102 size_t result;
103 size_t result_samples = size / sizeof(T) * factor;
104 buffer.resize(result_samples);
105 result =
106 converter.convert((uint8_t*)buffer.data(), (uint8_t*)in_data, size);
107 if (result != result_samples * sizeof(T)) {
108 LOGE("size %d -> result: %d - expeced: %d", (int)size, (int)result,
109 static_cast<int>(result_samples * sizeof(T)));
110 }
111 return result;
112 }
113};
114
122 public:
131 copy(from);
132 return *this;
133 }
134
135 void setAudioInfo(AudioInfo cfg) override {
136 TRACED();
137 if (is_active) {
138 end();
139 begin(cfg, to_channels);
140 } else {
143 }
144 }
145
148 AudioInfo out = audioInfo();
149 out.channels = to_channels;
150 return out;
151 }
152
153 bool begin(AudioInfo from, AudioInfo to) {
154 if (from.sample_rate != to.sample_rate) {
155 LOGE("invalid sample_rate: %d", (int)to.sample_rate);
156 return false;
157 }
158 if (from.bits_per_sample != to.bits_per_sample) {
159 LOGE("invalid bits_per_sample: %d", (int)to.bits_per_sample);
160 return false;
161 }
162 return begin(from, to.channels);
163 }
164
165 bool begin(AudioInfo cfg, int toChannels) {
166 // assert(toChannels != 0);
167 if (toChannels == 0) {
168 LOGE("toChannels is 0");
169 return false;
170 }
171 // is_output_notify = false;
172 to_channels = toChannels;
175 LOGI("--> ChannelFormatConverterStream");
177 LOGI("begin %d -> %d channels", cfg.channels, toChannels);
178 is_active = setupConverter(cfg.channels, toChannels);
179 if (!is_active) {
180 TRACEE()
181 }
182 return is_active;
183 }
184
185 bool begin() override { return begin(audioInfo(), to_channels); }
186
187 void end() override {
189 is_active = false;
190 }
191
192 void setToChannels(uint16_t channels) { to_channels = channels; }
193
194 virtual size_t write(const uint8_t* data, size_t len) override {
195 LOGD("ChannelFormatConverterStream::write: %d", (int)len);
196 if (p_out == nullptr || converter == nullptr) return 0;
197 // addNotifyOnFirstWrite();
198 switch (bits_per_sample) {
199 case 8:
200 return getConverter<int8_t>()->write(data, len);
201 case 16:
202 return getConverter<int16_t>()->write(data, len);
203 case 24:
204 return getConverter<int24_t>()->write(data, len);
205 case 32:
206 return getConverter<int32_t>()->write(data, len);
207 default:
208 return 0;
209 }
210 }
211
212 size_t readBytes(uint8_t* data, size_t len) override {
213 LOGD("ChannelFormatConverterStream::readBytes: %d", (int)len);
214 if (converter == nullptr) return 0;
215 switch (bits_per_sample) {
216 case 8:
217 return getConverter<int8_t>()->readBytes(data, len);
218 case 16:
219 return getConverter<int16_t>()->readBytes(data, len);
220 case 24:
221 return getConverter<int24_t>()->readBytes(data, len);
222 case 32:
223 return getConverter<int32_t>()->readBytes(data, len);
224 default:
225 return 0;
226 }
227 }
228
229 virtual int available() override {
230 if (converter == nullptr) return 0;
231 switch (bits_per_sample) {
232 case 8:
233 return getConverter<int8_t>()->available();
234 case 16:
235 return getConverter<int16_t>()->available();
236 case 24:
237 return getConverter<int24_t>()->available();
238 case 32:
239 return getConverter<int32_t>()->available();
240 default:
241 return 0;
242 }
243 }
244
245 virtual int availableForWrite() override {
246 if (converter == nullptr) return 0;
247 switch (bits_per_sample) {
248 case 8:
249 return getConverter<int8_t>()->availableForWrite();
250 case 16:
251 return getConverter<int16_t>()->availableForWrite();
252 case 24:
253 return getConverter<int24_t>()->availableForWrite();
254 case 32:
255 return getConverter<int32_t>()->availableForWrite();
256 default:
257 return 0;
258 }
259 }
260
261 float getByteFactor() override {
262 return static_cast<float>(to_channels) / static_cast<float>(from_channels);
263 }
264
265 protected:
266 void* converter = nullptr;
268 int to_channels = 2;
270 bool is_active = false;
271
273 converter = nullptr;
274 if (from.converter != nullptr) {
276 }
280 is_active = from.is_active;
281 };
282
283 template <typename T>
287
289 if (converter == nullptr) return;
290 switch (bits_per_sample) {
291 case 8:
292 delete getConverter<int8_t>();
293 converter = nullptr;
294 break;
295 case 16:
296 delete getConverter<int16_t>();
297 converter = nullptr;
298 break;
299 case 24:
300 delete getConverter<int24_t>();
301 converter = nullptr;
302 break;
303 case 32:
304 delete getConverter<int32_t>();
305 converter = nullptr;
306 break;
307 }
308 }
309
313 template <typename T>
314 ChannelFormatConverterStreamT<T>* newConverter(int fromChannels, int toChannels) {
315 ChannelFormatConverterStreamT<T>* result = nullptr;
316 if (p_io != nullptr) {
318 } else if (p_out != nullptr) {
320 } else {
321 LOGE("ChannelFormatConverterStream: no stream or output defined");
322 return nullptr;
323 }
324 result->begin(fromChannels, toChannels);
325 return result;
326 }
327
328 bool setupConverter(int fromChannels, int toChannels) {
330 switch (bits_per_sample) {
331 case 8:
332 converter = newConverter<int8_t>(fromChannels, toChannels);
333 break;
334 case 16:
335 converter = newConverter<int16_t>(fromChannels, toChannels);
336 break;
337 case 24:
338 converter = newConverter<int24_t>(fromChannels, toChannels);
339 break;
340 case 32:
341 converter = newConverter<int32_t>(fromChannels, toChannels);
342 break;
343 default:
344 LOGE("ChannelFormatConverterStream: unsupported bits_per_sample %d", bits_per_sample);
345 return false;
346 }
347 return converter != nullptr;
348 }
349};
350
364template <typename TFrom, typename TTo>
366 public:
373
374 void setAudioInfo(AudioInfo newInfo) override {
375 TRACED();
376 if (newInfo.bits_per_sample != sizeof(TFrom) * 8) {
377 LOGW("Inconsistent source bits_per_sample %d, using %d", newInfo.bits_per_sample, (int)sizeof(TFrom) * 8);
378 }
380 }
381
383 AudioInfo to_format;
384 to_format.copyFrom(info);
385 to_format.bits_per_sample = sizeof(TTo) * 8;
386 return to_format;
387 }
388
389 bool begin() override {
390 LOGI("begin %d -> %d bits", (int)sizeof(TFrom)*8, (int)sizeof(TTo)*8);
391 // is_output_notify = false;
392 return true;
393 }
394
397 return begin();
398 }
399
400 virtual size_t write(const uint8_t* data, size_t len) override {
401 TRACED();
402 if (p_out == nullptr) return 0;
403 // addNotifyOnFirstWrite();
404
405#ifdef USE_TYPETRAITS
406 if (std::is_same<TFrom, TTo>::value) return p_out->write(data, len);
407#else
408 if (sizeof(TFrom) == sizeof(TTo)) return p_out->write(data, len);
409#endif
410
411 size_t samples = len / sizeof(TFrom);
412 size_t result_size = 0;
413 TFrom* data_source = (TFrom*)data;
414
415 if (!is_buffered) {
416 for (size_t j = 0; j < samples; j++) {
417 TTo value = NumberConverter::convert<TFrom, TTo>(data_source[j]);
418 result_size += p_out->write((uint8_t*)&value, sizeof(TTo));
419 }
420 } else {
421 int size_bytes = sizeof(TTo) * samples;
422 buffer.resize(size_bytes);
423 NumberConverter::convertArray<TFrom, TTo>(
424 data_source, (TTo*)buffer.data(), samples, gain);
425 result_size = p_out->write((uint8_t*)buffer.address(), size_bytes);
426 buffer.reset();
427 }
428
429 return result_size > 0 ? len : 0;
430 }
431
432 size_t readBytes(uint8_t* data, size_t len) override {
433 LOGD("NumberFormatConverterStreamT::readBytes: %d", (int)len);
434 if (p_io == nullptr) return 0;
435 size_t samples = len / sizeof(TTo);
436 TTo* data_target = (TTo*)data;
437 TFrom source;
438 if (!is_buffered) {
439 for (size_t j = 0; j < samples; j++) {
440 source = 0;
441 p_io->readBytes((uint8_t*)&source, sizeof(TFrom));
442 data_target[j] = NumberConverter::convert<TFrom, TTo>(source);
443 }
444 } else {
445 buffer.resize(sizeof(TFrom) * samples);
446 readSamples<TFrom>(p_io, (TFrom*)buffer.address(), samples);
447 TFrom* data = (TFrom*)buffer.address();
448 NumberConverter::convertArray<TFrom, TTo>(data, data_target, samples,
449 gain);
450 buffer.reset();
451 }
452 return len;
453 }
454
455 virtual int available() override {
456 return p_io != nullptr ? p_io->available() : 0;
457 }
458
459 virtual int availableForWrite() override {
460 return p_out == nullptr ? 0 : p_out->availableForWrite();
461 }
462
465 void setBuffered(bool flag) { is_buffered = flag; }
466
468 void setGain(float value) { gain = value; }
469
470 float getByteFactor() override {
471 return static_cast<float>(sizeof(TTo)) / static_cast<float>(sizeof(TFrom));
472 }
473
474 protected:
476 bool is_buffered = true;
477 float gain = 1.0f;
478};
479
489 public:
496
497 void setAudioInfo(AudioInfo newInfo) override {
498 TRACED();
500 LOGI("-> NumberFormatConverterStream:")
502 }
503
505 AudioInfo result = audioInfo();
507 return result;
508 }
509
510 bool begin(AudioInfo info, AudioInfo to, float gain = 1.0f) {
511 if (info.sample_rate != to.sample_rate) {
512 LOGE("sample_rate does not match")
513 return false;
514 }
515 if (info.channels != to.channels) {
516 LOGE("channels do not match")
517 return false;
518 }
519 return begin(info, to.bits_per_sample, gain);
520 }
521
522 bool begin(AudioInfo info, int toBits, float gain = 1.0f) {
524 return begin(info.bits_per_sample, toBits, gain);
525 }
526
527 bool begin() override {
529 }
530
531 void end() override { cleanupConverter(); }
532
533 void setToBits(uint8_t bits) { to_bit_per_samples = bits; }
534
536 float gain = 1.0) {
537 LOGI("begin %d -> %d bits", from_bit_per_samples, to_bit_per_samples);
538 bool result = true;
540
542 if (p_converter != nullptr) end();
543
544 // store variables
545 this->gain = gain;
546 this->from_bit_per_samples = from_bit_per_samples;
547 this->to_bit_per_samples = to_bit_per_samples;
548
550 LOGI("no bit conversion: %d -> %d", from_bit_per_samples,
552 } else if (from_bit_per_samples == 8 && to_bit_per_samples == 16) {
554 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 8) {
556 } else if (from_bit_per_samples == 24 && to_bit_per_samples == 16) {
558 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 24) {
560 } else if (from_bit_per_samples == 32 && to_bit_per_samples == 16) {
562 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 32) {
564 } else {
565 result = false;
566 LOGE("bit combination not supported %d -> %d", from_bit_per_samples,
568 }
569
571 setupStream();
572 }
573
574 if (!result) {
575 TRACEE()
576 }
577 return result;
578 }
579
580 virtual size_t write(const uint8_t* data, size_t len) override {
581 LOGD("NumberFormatConverterStream::write: %d", (int)len);
582 if (p_out == nullptr) return 0;
584 return p_out->write(data, len);
585 }
586
587 if (from_bit_per_samples == 8 && to_bit_per_samples == 16) {
588 return getConverter<int8_t, int16_t>()->write(data, len);
589 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 8) {
590 return getConverter<int16_t, int8_t>()->write(data, len);
591 } else if (from_bit_per_samples == 24 && to_bit_per_samples == 16) {
592 return getConverter<int24_t, int16_t>()->write(data, len);
593 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 24) {
594 return getConverter<int16_t, int24_t>()->write(data, len);
595 } else if (from_bit_per_samples == 32 && to_bit_per_samples == 16) {
596 return getConverter<int32_t, int16_t>()->write(data, len);
597 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 32) {
598 return getConverter<int16_t, int32_t>()->write(data, len);
599 } else {
600 LOGE("bit combination not supported %d -> %d", from_bit_per_samples,
602 return 0;
603 }
604 }
605
606 size_t readBytes(uint8_t* data, size_t len) override {
607 LOGD("NumberFormatConverterStream::readBytes: %d", (int)len);
609 return p_io->readBytes(data, len);
610 }
611 if (from_bit_per_samples == 8 && to_bit_per_samples == 16) {
612 return getConverter<int8_t, int16_t>()->readBytes(data, len);
613 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 8) {
614 return getConverter<int16_t, int8_t>()->readBytes(data, len);
615 } else if (from_bit_per_samples == 24 && to_bit_per_samples == 16) {
616 return getConverter<int24_t, int16_t>()->readBytes(data, len);
617 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 24) {
618 return getConverter<int16_t, int24_t>()->readBytes(data, len);
619 } else if (from_bit_per_samples == 32 && to_bit_per_samples == 16) {
620 return getConverter<int32_t, int16_t>()->readBytes(data, len);
621 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 32) {
622 return getConverter<int16_t, int32_t>()->readBytes(data, len);
623 } else {
624 TRACEE();
625 return 0;
626 }
627 }
628
629 virtual int available() override {
631 return p_io->available();
632 }
633 if (from_bit_per_samples == 8 && to_bit_per_samples == 16) {
634 return getConverter<int8_t, int16_t>()->available();
635 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 8) {
636 return getConverter<int16_t, int8_t>()->available();
637 } else if (from_bit_per_samples == 24 && to_bit_per_samples == 16) {
638 return getConverter<int24_t, int16_t>()->available();
639 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 24) {
640 return getConverter<int16_t, int24_t>()->available();
641 } else if (from_bit_per_samples == 32 && to_bit_per_samples == 16) {
642 return getConverter<int32_t, int16_t>()->available();
643 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 32) {
644 return getConverter<int16_t, int32_t>()->available();
645 } else {
646 TRACEE();
647 return 0;
648 }
649 }
650
651 virtual int availableForWrite() override {
652 if (p_out == nullptr) return 0;
654 return p_out->availableForWrite();
655 }
656 if (from_bit_per_samples == 8 && to_bit_per_samples == 16) {
657 return getConverter<int8_t, int16_t>()->availableForWrite();
658 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 8) {
659 return getConverter<int16_t, int8_t>()->availableForWrite();
660 } else if (from_bit_per_samples == 24 && to_bit_per_samples == 16) {
661 return getConverter<int24_t, int16_t>()->availableForWrite();
662 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 24) {
663 return getConverter<int16_t, int24_t>()->availableForWrite();
664 } else if (from_bit_per_samples == 32 && to_bit_per_samples == 16) {
665 return getConverter<int32_t, int16_t>()->availableForWrite();
666 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 32) {
667 return getConverter<int16_t, int32_t>()->availableForWrite();
668 } else {
669 TRACEE();
670 return 0;
671 }
672 }
673
674 void setBuffered(bool flag) {
675 if (from_bit_per_samples == 8 && to_bit_per_samples == 16) {
676 getConverter<int8_t, int16_t>()->setBuffered(flag);
677 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 8) {
678 getConverter<int16_t, int8_t>()->setBuffered(flag);
679 } else if (from_bit_per_samples == 24 && to_bit_per_samples == 16) {
680 getConverter<int24_t, int16_t>()->setBuffered(flag);
681 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 24) {
682 getConverter<int16_t, int24_t>()->setBuffered(flag);
683 } else if (from_bit_per_samples == 32 && to_bit_per_samples == 16) {
684 getConverter<int32_t, int16_t>()->setBuffered(flag);
685 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 32) {
686 getConverter<int16_t, int32_t>()->setBuffered(flag);
687 }
688 }
689
690 float getByteFactor() override {
691 return static_cast<float>(to_bit_per_samples) /
692 static_cast<float>(from_bit_per_samples);
693 }
694
695 protected:
696 void* p_converter = nullptr;
699 float gain = 1.0;
700
702 if (p_converter == nullptr) return;
703
704 if (from_bit_per_samples == 8 && to_bit_per_samples == 16) {
707 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 8) {
710 } else if (from_bit_per_samples == 24 && to_bit_per_samples == 16) {
713 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 24) {
716 } else if (from_bit_per_samples == 32 && to_bit_per_samples == 16) {
719 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 32) {
722 } else {
723 TRACEE();
724 }
725 p_converter = nullptr;
726 }
727
728 template <typename TFrom, typename TTo>
732
733 void setupStream() {
734 if (p_io != nullptr) {
735 if (from_bit_per_samples == 8 && to_bit_per_samples == 16) {
736 getConverter<int8_t, int16_t>()->setStream(*p_io);
737 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 8) {
738 getConverter<int16_t, int8_t>()->setStream(*p_io);
739 } else if (from_bit_per_samples == 24 && to_bit_per_samples == 16) {
740 getConverter<int24_t, int16_t>()->setStream(*p_io);
741 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 24) {
742 getConverter<int16_t, int24_t>()->setStream(*p_io);
743 } else if (from_bit_per_samples == 32 && to_bit_per_samples == 16) {
744 getConverter<int32_t, int16_t>()->setStream(*p_io);
745 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 32) {
746 getConverter<int16_t, int32_t>()->setStream(*p_io);
747 } else {
748 TRACEE();
749 }
750 } else {
751 if (from_bit_per_samples == 8 && to_bit_per_samples == 16) {
752 getConverter<int8_t, int16_t>()->setOutput(*p_out);
753 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 8) {
754 getConverter<int16_t, int8_t>()->setOutput(*p_out);
755 } else if (from_bit_per_samples == 24 && to_bit_per_samples == 16) {
756 getConverter<int24_t, int16_t>()->setOutput(*p_out);
757 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 24) {
758 getConverter<int16_t, int24_t>()->setOutput(*p_out);
759 } else if (from_bit_per_samples == 32 && to_bit_per_samples == 16) {
760 getConverter<int32_t, int16_t>()->setOutput(*p_out);
761 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 32) {
762 getConverter<int16_t, int32_t>()->setOutput(*p_out);
763 } else {
764 TRACEE();
765 }
766 }
767 }
768};
769
779 public:
784 to_cfg = stream.audioInfo();
785 from_cfg = stream.audioInfo();
786 setStream(stream);
787 }
789 to_cfg = print.audioInfo();
790 setOutput(print);
791 }
792
793 void setStream(Stream& io) override {
794 TRACED();
797 }
798
799 void setStream(AudioStream& io) override {
800 TRACED();
803 }
804
805 void setOutput(Print& print) override {
806 TRACED();
809 }
810
811 void setOutput(AudioOutput& print) override {
812 TRACED();
815 }
816
818 void setAudioInfo(AudioInfo info) override {
819 TRACEI();
820 info.logInfo("FormatConverterStream");
822 // ChannelFormatConverter -> NumberFormatConverter -> SampleRateCoverter
824 }
825
827
828 AudioInfo audioInfoOut() override { return to_cfg; }
829
830 bool begin(AudioInfo from, AudioInfo to) {
831 TRACED();
832 setAudioInfoOut(to);
833 return begin(from);
834 }
835
837 bool begin(AudioInfo from) {
838 setAudioInfo(from);
839 return begin();
840 }
841
843 bool begin() override {
844 TRACED();
845 // build output chain: ChannelFormatConverter -> NumberFormatConverter ->
846 // SampleRateConverter
847 if (getStream() != nullptr) {
849 }
850 if (getPrint() != nullptr) {
852 }
855
856 // start individual converters
858
859 AudioInfo from_actual_cfg(from_cfg);
860 from_actual_cfg.channels = to_cfg.channels;
861 result &=
863
866
867 from_actual_cfg.bits_per_sample = to_cfg.bits_per_sample;
868 result &= sampleRateConverter.begin(from_actual_cfg, to_cfg.sample_rate);
869
870 // setup reader to support readBytes()
871 setupReader();
872
873 if (!result) {
874 LOGE("begin failed");
875 }
876 is_active = result;
877 return result;
878 }
879
880 void end() {
881 is_active = false;
883 }
884
885 virtual size_t write(const uint8_t* data, size_t len) override {
886 LOGD("FormatConverterStream::write: %d", (int)len);
887 if (!is_active) return 0;
888 // addNotifyOnFirstWrite();
889 return channelFormatConverter.write(data, len);
890 }
891
893 void setBuffered(bool active) { is_buffered = active; }
894
899
902
907
912
913 protected:
919 bool is_buffered = true;
920 bool is_active = false;
921};
922
923} // 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 TRACEE()
Definition AudioLoggerIDF.h:34
#define LOGD(...)
Definition AudioLoggerIDF.h:27
#define LOGE(...)
Definition AudioLoggerIDF.h:30
#define assert(T)
Definition avr.h:10
Definition Arduino.h:56
virtual int availableForWrite()
Definition Arduino.h:128
virtual size_t write(const uint8_t *data, size_t len)
Definition Arduino.h:120
Definition Arduino.h:136
virtual size_t readBytes(uint8_t *data, size_t len)
Definition Arduino.h:140
virtual int available()
Definition Arduino.h:139
virtual void setAudioInfo(AudioInfo info)=0
Defines the input AudioInfo.
Abstract Audio Ouptut class.
Definition AudioOutput.h:25
virtual AudioInfo audioInfo() override
provides the actual input AudioInfo
Definition AudioOutput.h:62
Base class for all Audio Streams. It support the boolean operator to test if the object is ready with...
Definition BaseStream.h:120
AudioInfo info
Definition BaseStream.h:171
virtual void setAudioInfo(AudioInfo newInfo) override
Defines the input AudioInfo.
Definition BaseStream.h:128
virtual AudioInfo audioInfo() override
provides the actual input AudioInfo
Definition BaseStream.h:151
Increasing or decreasing the number of channels.
Definition BaseConverter.h:1561
void setTargetChannels(int channelCountOfTarget)
Definition BaseConverter.h:1574
size_t convert(uint8_t *target, uint8_t *src, size_t size)
Definition BaseConverter.h:1578
void setSourceChannels(int channelCountOfSource)
Definition BaseConverter.h:1570
Channel converter which does not use a template.
Definition AudioStreamsConverter.h:121
virtual size_t write(const uint8_t *data, size_t len) override
Definition AudioStreamsConverter.h:194
ChannelFormatConverterStream(Stream &stream)
Definition AudioStreamsConverter.h:124
int bits_per_sample
Definition AudioStreamsConverter.h:267
void * converter
Definition AudioStreamsConverter.h:266
bool setupConverter(int fromChannels, int toChannels)
Definition AudioStreamsConverter.h:328
bool begin(AudioInfo from, AudioInfo to)
Definition AudioStreamsConverter.h:153
ChannelFormatConverterStreamT< T > * newConverter(int fromChannels, int toChannels)
Definition AudioStreamsConverter.h:314
bool is_active
Definition AudioStreamsConverter.h:270
ChannelFormatConverterStream(Print &print)
Definition AudioStreamsConverter.h:125
size_t readBytes(uint8_t *data, size_t len) override
Definition AudioStreamsConverter.h:212
ChannelFormatConverterStream & operator=(ChannelFormatConverterStream &from)
Definition AudioStreamsConverter.h:130
void end() override
Definition AudioStreamsConverter.h:187
ChannelFormatConverterStreamT< T > * getConverter()
Definition AudioStreamsConverter.h:284
virtual int availableForWrite() override
Definition AudioStreamsConverter.h:245
int from_channels
Definition AudioStreamsConverter.h:269
void setToChannels(uint16_t channels)
Definition AudioStreamsConverter.h:192
bool begin(AudioInfo cfg, int toChannels)
Definition AudioStreamsConverter.h:165
float getByteFactor() override
Definition AudioStreamsConverter.h:261
void copy(ChannelFormatConverterStream &from)
Definition AudioStreamsConverter.h:272
ChannelFormatConverterStream(ChannelFormatConverterStream &from)
Definition AudioStreamsConverter.h:126
AudioInfo audioInfoOut() override
Returns the AudioInfo with the to_channels.
Definition AudioStreamsConverter.h:147
virtual ~ChannelFormatConverterStream()
Definition AudioStreamsConverter.h:129
bool begin() override
Definition AudioStreamsConverter.h:185
int to_channels
Definition AudioStreamsConverter.h:268
void cleanupConverter()
Definition AudioStreamsConverter.h:288
void setAudioInfo(AudioInfo cfg) override
Defines the input AudioInfo.
Definition AudioStreamsConverter.h:135
virtual int available() override
Definition AudioStreamsConverter.h:229
Converter for reducing or increasing the number of Channels.
Definition AudioStreamsConverter.h:15
virtual size_t write(const uint8_t *data, size_t len) override
Definition AudioStreamsConverter.h:40
float factor
Definition AudioStreamsConverter.h:96
size_t readBytes(uint8_t *data, size_t len) override
Definition AudioStreamsConverter.h:53
size_t convert(const uint8_t *in_data, size_t size)
Definition AudioStreamsConverter.h:101
virtual int availableForWrite() override
Definition AudioStreamsConverter.h:84
int from_channels
Definition AudioStreamsConverter.h:94
Vector< uint8_t > bufferTmp
Definition AudioStreamsConverter.h:98
void setToChannels(uint16_t channels)
Definition AudioStreamsConverter.h:38
ChannelFormatConverterStreamT(Print &print)
Definition AudioStreamsConverter.h:18
ChannelConverter< T > converter
Definition AudioStreamsConverter.h:99
float getByteFactor() override
Definition AudioStreamsConverter.h:89
ChannelFormatConverterStreamT & operator=(ChannelFormatConverterStreamT const &)=delete
ChannelFormatConverterStreamT(ChannelFormatConverterStreamT const &)=delete
bool begin(int fromChannels, int toChannels)
Definition AudioStreamsConverter.h:23
Vector< T > buffer
Definition AudioStreamsConverter.h:97
AudioInfo audioInfoOut() override
Returns the AudioInfo with the to_channels.
Definition AudioStreamsConverter.h:74
bool begin() override
Definition AudioStreamsConverter.h:36
int to_channels
Definition AudioStreamsConverter.h:95
ChannelFormatConverterStreamT(Stream &stream)
Definition AudioStreamsConverter.h:17
void setAudioInfo(AudioInfo cfg) override
Defines the input AudioInfo.
Definition AudioStreamsConverter.h:68
virtual int available() override
Definition AudioStreamsConverter.h:80
Converter which converts bits_per_sample, channels and the sample_rate. The conversion is supported b...
Definition AudioStreamsConverter.h:778
virtual size_t write(const uint8_t *data, size_t len) override
Definition AudioStreamsConverter.h:885
bool is_buffered
Definition AudioStreamsConverter.h:919
void setOutput(Print &print) override
Defines/Changes the output target.
Definition AudioStreamsConverter.h:805
void setOutput(AudioOutput &print) override
Defines/Changes the output target and registers for audio change notifications.
Definition AudioStreamsConverter.h:811
bool begin(AudioInfo from, AudioInfo to)
Definition AudioStreamsConverter.h:830
ChannelFormatConverterStream & getChannelFormatConverterStream()
Returns the channel format converter stream.
Definition AudioStreamsConverter.h:904
bool is_active
Definition AudioStreamsConverter.h:920
void setBuffered(bool active)
Buffering is active by default to minimize the number of output calls.
Definition AudioStreamsConverter.h:893
void setStream(AudioStream &io) override
Defines/Changes the input & output and registers for audio change notifications.
Definition AudioStreamsConverter.h:799
NumberFormatConverterStream numberFormatConverter
Definition AudioStreamsConverter.h:916
ResampleStream sampleRateConverter
Definition AudioStreamsConverter.h:918
FormatConverterStream(Stream &stream)
Definition AudioStreamsConverter.h:781
FormatConverterStream(Print &print)
Definition AudioStreamsConverter.h:782
float getByteFactor() override
Definition AudioStreamsConverter.h:895
bool begin(AudioInfo from)
Starts the processing: call setAudioInfoOut before to define the target.
Definition AudioStreamsConverter.h:837
AudioInfo to_cfg
Definition AudioStreamsConverter.h:915
FormatConverterStream(AudioOutput &print)
Definition AudioStreamsConverter.h:788
void end()
Definition AudioStreamsConverter.h:880
AudioInfo & from_cfg
Definition AudioStreamsConverter.h:914
AudioInfo audioInfoOut() override
Definition AudioStreamsConverter.h:828
ChannelFormatConverterStream channelFormatConverter
Definition AudioStreamsConverter.h:917
bool begin() override
(Re-)Starts the processing: call setAudioInfo and setAudioInfoOut before
Definition AudioStreamsConverter.h:843
void setAudioInfo(AudioInfo info) override
Set the input audio information.
Definition AudioStreamsConverter.h:818
void setAudioInfoOut(AudioInfo to)
Definition AudioStreamsConverter.h:826
void setStream(Stream &io) override
Defines/Changes the input & output.
Definition AudioStreamsConverter.h:793
NumberFormatConverterStream & getNumberFormatConverterStream()
Returns the number format converter stream.
Definition AudioStreamsConverter.h:909
ResampleStream & getResampleStream()
Returns the sample rate converter stream.
Definition AudioStreamsConverter.h:901
FormatConverterStream(AudioStream &stream)
Definition AudioStreamsConverter.h:783
Converter which converts between bits_per_sample and 16 bits. The templated NumberFormatConverterStre...
Definition AudioStreamsConverter.h:488
virtual size_t write(const uint8_t *data, size_t len) override
Definition AudioStreamsConverter.h:580
virtual ~NumberFormatConverterStream()
Definition AudioStreamsConverter.h:495
bool begin(AudioInfo info, AudioInfo to, float gain=1.0f)
Definition AudioStreamsConverter.h:510
NumberFormatConverterStream(Print &print)
Definition AudioStreamsConverter.h:493
void setAudioInfo(AudioInfo newInfo) override
Defines the input AudioInfo.
Definition AudioStreamsConverter.h:497
void setupStream()
Definition AudioStreamsConverter.h:733
void * p_converter
Definition AudioStreamsConverter.h:696
size_t readBytes(uint8_t *data, size_t len) override
Definition AudioStreamsConverter.h:606
void setToBits(uint8_t bits)
Definition AudioStreamsConverter.h:533
void end() override
Definition AudioStreamsConverter.h:531
NumberFormatConverterStream(AudioStream &stream)
Definition AudioStreamsConverter.h:492
virtual int availableForWrite() override
Definition AudioStreamsConverter.h:651
void setBuffered(bool flag)
Definition AudioStreamsConverter.h:674
float getByteFactor() override
Definition AudioStreamsConverter.h:690
int from_bit_per_samples
Definition AudioStreamsConverter.h:697
bool begin(int from_bit_per_samples, int to_bit_per_samples, float gain=1.0)
Definition AudioStreamsConverter.h:535
AudioInfo audioInfoOut() override
Definition AudioStreamsConverter.h:504
NumberFormatConverterStream(Stream &stream)
Definition AudioStreamsConverter.h:491
bool begin(AudioInfo info, int toBits, float gain=1.0f)
Definition AudioStreamsConverter.h:522
float gain
Definition AudioStreamsConverter.h:699
bool begin() override
Definition AudioStreamsConverter.h:527
int to_bit_per_samples
Definition AudioStreamsConverter.h:698
NumberFormatConverterStreamT< TFrom, TTo > * getConverter()
Definition AudioStreamsConverter.h:729
NumberFormatConverterStream(AudioOutput &print)
Definition AudioStreamsConverter.h:494
void cleanupConverter()
Definition AudioStreamsConverter.h:701
virtual int available() override
Definition AudioStreamsConverter.h:629
A more generic templated Converter which converts from a source type to a target type: You can use e....
Definition AudioStreamsConverter.h:365
virtual size_t write(const uint8_t *data, size_t len) override
Definition AudioStreamsConverter.h:400
NumberFormatConverterStreamT(float gain)
Definition AudioStreamsConverter.h:368
bool is_buffered
Definition AudioStreamsConverter.h:476
void setAudioInfo(AudioInfo newInfo) override
Defines the input AudioInfo.
Definition AudioStreamsConverter.h:374
size_t readBytes(uint8_t *data, size_t len) override
Definition AudioStreamsConverter.h:432
NumberFormatConverterStreamT(AudioOutput &print)
Definition AudioStreamsConverter.h:372
virtual int availableForWrite() override
Definition AudioStreamsConverter.h:459
void setBuffered(bool flag)
Definition AudioStreamsConverter.h:465
float getByteFactor() override
Definition AudioStreamsConverter.h:470
NumberFormatConverterStreamT(AudioStream &stream)
Definition AudioStreamsConverter.h:370
void setGain(float value)
Defines the gain (only available when buffered is true)
Definition AudioStreamsConverter.h:468
SingleBuffer< uint8_t > buffer
Definition AudioStreamsConverter.h:475
AudioInfo audioInfoOut() override
Definition AudioStreamsConverter.h:382
NumberFormatConverterStreamT(Stream &stream)
Definition AudioStreamsConverter.h:369
float gain
Definition AudioStreamsConverter.h:477
bool begin() override
Definition AudioStreamsConverter.h:389
NumberFormatConverterStreamT(Print &print)
Definition AudioStreamsConverter.h:371
bool begin(AudioInfo info)
Definition AudioStreamsConverter.h:395
virtual int available() override
Definition AudioStreamsConverter.h:455
Base class for chained converting streams.
Definition AudioIO.h:268
virtual void setStream(Stream &stream) override
Defines/Changes the input & output.
Definition AudioIO.h:270
void end() override
Definition AudioIO.h:321
virtual Stream * getStream()
Definition AudioIO.h:297
virtual void setOutput(AudioOutput &print)
Defines/Changes the output target and registers for audio change notifications.
Definition AudioIO.h:284
Print * p_out
Definition AudioIO.h:346
virtual Print * getPrint()
Definition AudioIO.h:295
void setupReader()
Definition AudioIO.h:348
Stream * p_io
Definition AudioIO.h:345
Dynamic Resampling. We can use a variable factor to speed up or slow down the playback.
Definition ResampleStream.h:33
void setBuffered(bool active)
Activates buffering to avoid small incremental writes.
Definition ResampleStream.h:246
bool begin(ResampleConfig cfg)
Definition ResampleStream.h:63
A simple Buffer implementation which just uses a (dynamically sized) array.
Definition Buffers.h:194
T * address() override
Provides address to beginning of the buffer.
Definition Buffers.h:303
T * data()
Provides address of actual data.
Definition Buffers.h:306
bool resize(size_t size)
Resizes the buffer if supported: returns false if not supported.
Definition Buffers.h:327
void reset() override
clears the buffer
Definition Buffers.h:308
Vector implementation which provides the most important methods as defined by std::vector....
Definition Vector.h:21
bool resize(size_t newSize, T value)
Definition Vector.h:266
T * data()
Definition Vector.h:321
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition LMSEchoCancellationStream.h:6
Basic Audio information which drives e.g. I2S.
Definition AudioTypes.h:56
void copyFrom(AudioInfo info)
Same as set.
Definition AudioTypes.h:106
sample_rate_t sample_rate
Sample Rate: e.g 44100.
Definition AudioTypes.h:58
uint16_t channels
Number of channels: 2=stereo, 1=mono.
Definition AudioTypes.h:60
uint8_t bits_per_sample
Number of bits per sample (int16_t = 16 bits)
Definition AudioTypes.h:62
virtual void logInfo(const char *source="")
Definition AudioTypes.h:127