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;
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_print == nullptr) return 0;
43 // addNotifyOnFirstWrite();
45 return p_print->write(data, len);
46 }
47 size_t resultBytes = convert(data, len);
48 // assert(resultBytes == factor * len);
50 return len;
51 }
52
53 size_t readBytes(uint8_t* data, size_t len) override {
54 TRACED();
55 if (p_stream == nullptr) return 0;
57 return p_stream->readBytes(data, len);
58 }
59 size_t in_bytes = 1.0f / factor * len;
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_stream != nullptr ? p_stream->available() : 0;
82 }
83
84 virtual int availableForWrite() override {
85 if (p_print == nullptr) return 0;
86 return 1.0f / factor * p_print->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;
175 LOGI("--> ChannelFormatConverterStream");
177 LOGI("begin %d -> %d channels", 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_print == 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 switch (bits_per_sample) {
215 case 8:
216 return getConverter<int8_t>()->readBytes(data, len);
217 case 16:
218 return getConverter<int16_t>()->readBytes(data, len);
219 case 24:
220 return getConverter<int24_t>()->readBytes(data, len);
221 case 32:
222 return getConverter<int32_t>()->readBytes(data, len);
223 default:
224 return 0;
225 }
226 }
227
228 virtual int available() override {
229 switch (bits_per_sample) {
230 case 8:
231 return getConverter<int8_t>()->available();
232 case 16:
233 return getConverter<int16_t>()->available();
234 case 24:
235 return getConverter<int24_t>()->available();
236 case 32:
237 return getConverter<int32_t>()->available();
238 default:
239 return 0;
240 }
241 }
242
243 virtual int availableForWrite() override {
244 switch (bits_per_sample) {
245 case 8:
246 return getConverter<int8_t>()->availableForWrite();
247 case 16:
248 return getConverter<int16_t>()->availableForWrite();
249 case 24:
250 return getConverter<int24_t>()->availableForWrite();
251 case 32:
252 return getConverter<int32_t>()->availableForWrite();
253 default:
254 return 0;
255 }
256 }
257
258 float getByteFactor() override {
259 return static_cast<float>(to_channels) / static_cast<float>(from_channels);
260 }
261
262 protected:
263 void* converter = nullptr;
265 int to_channels = 2;
267 bool is_active = false;
268
270 converter = nullptr;
271 if (from.converter != nullptr) {
273 }
277 is_active = from.is_active;
278 };
279
280 template <typename T>
284
286 if (converter == nullptr) return;
287 switch (bits_per_sample) {
288 case 8:
289 delete getConverter<int8_t>();
290 converter = nullptr;
291 break;
292 case 16:
293 delete getConverter<int16_t>();
294 converter = nullptr;
295 break;
296 case 24:
297 delete getConverter<int24_t>();
298 converter = nullptr;
299 break;
300 case 32:
301 delete getConverter<int32_t>();
302 converter = nullptr;
303 break;
304 }
305 }
306
308 bool result = true;
310 switch (bits_per_sample) {
311 case 8:
314 break;
315 case 16:
318 break;
319 case 24:
322 break;
323 case 32:
326 break;
327 default:
328 result = false;
329 }
330 return result;
331 }
332};
333
347template <typename TFrom, typename TTo>
349 public:
356
358 TRACED();
359 if (newInfo.bits_per_sample != sizeof(TFrom) * 8) {
360 LOGW("Inconsistent source bits_per_sample %d, using %d", newInfo.bits_per_sample, (int)sizeof(TFrom) * 8);
361 }
363 }
364
368 to_format.bits_per_sample = sizeof(TTo) * 8;
369 return to_format;
370 }
371
372 bool begin() override {
373 LOGI("begin %d -> %d bits", (int)sizeof(TFrom)*8, (int)sizeof(TTo)*8);
374 // is_output_notify = false;
375 return true;
376 }
377
380 return begin();
381 }
382
383 virtual size_t write(const uint8_t* data, size_t len) override {
384 TRACED();
385 if (p_print == nullptr) return 0;
386 // addNotifyOnFirstWrite();
387
388#ifdef USE_TYPETRAITS
389 if (std::is_same<TFrom, TTo>::value) return p_print->write(data, len);
390#else
391 if (sizeof(TFrom) == sizeof(TTo)) return p_print->write(data, len);
392#endif
393
394 size_t samples = len / sizeof(TFrom);
395 size_t result_size = 0;
396 TFrom* data_source = (TFrom*)data;
397
398 if (!is_buffered) {
399 for (size_t j = 0; j < samples; j++) {
400 TTo value = NumberConverter::convert<TFrom, TTo>(data_source[j]);
401 result_size += p_print->write((uint8_t*)&value, sizeof(TTo));
402 }
403 } else {
404 int size_bytes = sizeof(TTo) * samples;
405 buffer.resize(size_bytes);
406 NumberConverter::convertArray<TFrom, TTo>(
407 data_source, (TTo*)buffer.data(), samples, gain);
408 result_size = p_print->write((uint8_t*)buffer.address(), size_bytes);
409 buffer.reset();
410 }
411
412 return result_size > 0 ? len : 0;
413 }
414
415 size_t readBytes(uint8_t* data, size_t len) override {
416 LOGD("NumberFormatConverterStreamT::readBytes: %d", (int)len);
417 if (p_stream == nullptr) return 0;
418 size_t samples = len / sizeof(TTo);
419 TTo* data_target = (TTo*)data;
420 TFrom source;
421 if (!is_buffered) {
422 for (size_t j = 0; j < samples; j++) {
423 source = 0;
424 p_stream->readBytes((uint8_t*)&source, sizeof(TFrom));
425 data_target[j] = NumberConverter::convert<TFrom, TTo>(source);
426 }
427 } else {
428 buffer.resize(sizeof(TFrom) * samples);
430 TFrom* data = (TFrom*)buffer.address();
431 NumberConverter::convertArray<TFrom, TTo>(data, data_target, samples,
432 gain);
433 buffer.reset();
434 }
435 return len;
436 }
437
438 virtual int available() override {
439 return p_stream != nullptr ? p_stream->available() : 0;
440 }
441
442 virtual int availableForWrite() override {
443 return p_print == nullptr ? 0 : p_print->availableForWrite();
444 }
445
449
451 void setGain(float value) { gain = value; }
452
453 float getByteFactor() override {
454 return static_cast<float>(sizeof(TTo)) / static_cast<float>(sizeof(TFrom));
455 }
456
457 protected:
459 bool is_buffered = true;
460 float gain = 1.0f;
461};
462
472 public:
479
481 TRACED();
483 LOGI("-> NumberFormatConverterStream:")
485 }
486
488 AudioInfo result = audioInfo();
490 return result;
491 }
492
493 bool begin(AudioInfo info, AudioInfo to, float gain = 1.0f) {
494 if (info.sample_rate != to.sample_rate) {
495 LOGE("sample_rate does not match")
496 return false;
497 }
498 if (info.channels != to.channels) {
499 LOGE("channels do not match")
500 return false;
501 }
502 return begin(info, to.bits_per_sample, gain);
503 }
504
505 bool begin(AudioInfo info, int toBits, float gain = 1.0f) {
507 return begin(info.bits_per_sample, toBits, gain);
508 }
509
510 bool begin() override {
512 }
513
514 void end() override { cleanupConverter(); }
515
516 void setToBits(uint8_t bits) { to_bit_per_samples = bits; }
517
519 float gain = 1.0) {
520 LOGI("begin %d -> %d bits", from_bit_per_samples, to_bit_per_samples);
521 bool result = true;
523
525 if (p_converter != nullptr) end();
526
527 // store variables
528 this->gain = gain;
529 this->from_bit_per_samples = from_bit_per_samples;
530 this->to_bit_per_samples = to_bit_per_samples;
531
533 LOGI("no bit conversion: %d -> %d", from_bit_per_samples,
535 } else if (from_bit_per_samples == 8 && to_bit_per_samples == 16) {
537 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 8) {
539 } else if (from_bit_per_samples == 24 && to_bit_per_samples == 16) {
541 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 24) {
543 } else if (from_bit_per_samples == 32 && to_bit_per_samples == 16) {
545 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 32) {
547 } else {
548 result = false;
549 LOGE("bit combination not supported %d -> %d", from_bit_per_samples,
551 }
552
554 setupStream();
555 }
556
557 if (!result) {
558 TRACEE()
559 }
560 return result;
561 }
562
563 virtual size_t write(const uint8_t* data, size_t len) override {
564 LOGD("NumberFormatConverterStream::write: %d", (int)len);
565 if (p_print == nullptr) return 0;
567 return p_print->write(data, len);
568 }
569
570 if (from_bit_per_samples == 8 && to_bit_per_samples == 16) {
571 return getConverter<int8_t, int16_t>()->write(data, len);
572 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 8) {
573 return getConverter<int16_t, int8_t>()->write(data, len);
574 } else if (from_bit_per_samples == 24 && to_bit_per_samples == 16) {
575 return getConverter<int24_t, int16_t>()->write(data, len);
576 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 24) {
577 return getConverter<int16_t, int24_t>()->write(data, len);
578 } else if (from_bit_per_samples == 32 && to_bit_per_samples == 16) {
579 return getConverter<int32_t, int16_t>()->write(data, len);
580 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 32) {
581 return getConverter<int16_t, int32_t>()->write(data, len);
582 } else {
583 LOGE("bit combination not supported %d -> %d", from_bit_per_samples,
585 return 0;
586 }
587 }
588
589 size_t readBytes(uint8_t* data, size_t len) override {
590 LOGD("NumberFormatConverterStream::readBytes: %d", (int)len);
592 return p_stream->readBytes(data, len);
593 }
594 if (from_bit_per_samples == 8 && to_bit_per_samples == 16) {
595 return getConverter<int8_t, int16_t>()->readBytes(data, len);
596 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 8) {
597 return getConverter<int16_t, int8_t>()->readBytes(data, len);
598 } else if (from_bit_per_samples == 24 && to_bit_per_samples == 16) {
599 return getConverter<int24_t, int16_t>()->readBytes(data, len);
600 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 24) {
601 return getConverter<int16_t, int24_t>()->readBytes(data, len);
602 } else if (from_bit_per_samples == 32 && to_bit_per_samples == 16) {
603 return getConverter<int32_t, int16_t>()->readBytes(data, len);
604 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 32) {
605 return getConverter<int16_t, int32_t>()->readBytes(data, len);
606 } else {
607 TRACEE();
608 return 0;
609 }
610 }
611
612 virtual int available() override {
614 return p_stream->available();
615 }
616 if (from_bit_per_samples == 8 && to_bit_per_samples == 16) {
617 return getConverter<int8_t, int16_t>()->available();
618 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 8) {
619 return getConverter<int16_t, int8_t>()->available();
620 } else if (from_bit_per_samples == 24 && to_bit_per_samples == 16) {
621 return getConverter<int24_t, int16_t>()->available();
622 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 24) {
623 return getConverter<int16_t, int24_t>()->available();
624 } else if (from_bit_per_samples == 32 && to_bit_per_samples == 16) {
625 return getConverter<int32_t, int16_t>()->available();
626 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 32) {
627 return getConverter<int16_t, int32_t>()->available();
628 } else {
629 TRACEE();
630 return 0;
631 }
632 }
633
634 virtual int availableForWrite() override {
635 if (p_print == nullptr) return 0;
637 return p_print->availableForWrite();
638 }
639 if (from_bit_per_samples == 8 && to_bit_per_samples == 16) {
640 return getConverter<int8_t, int16_t>()->availableForWrite();
641 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 8) {
642 return getConverter<int16_t, int8_t>()->availableForWrite();
643 } else if (from_bit_per_samples == 24 && to_bit_per_samples == 16) {
644 return getConverter<int24_t, int16_t>()->availableForWrite();
645 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 24) {
646 return getConverter<int16_t, int24_t>()->availableForWrite();
647 } else if (from_bit_per_samples == 32 && to_bit_per_samples == 16) {
648 return getConverter<int32_t, int16_t>()->availableForWrite();
649 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 32) {
650 return getConverter<int16_t, int32_t>()->availableForWrite();
651 } else {
652 TRACEE();
653 return 0;
654 }
655 }
656
657 void setBuffered(bool flag) {
658 if (from_bit_per_samples == 8 && to_bit_per_samples == 16) {
659 getConverter<int8_t, int16_t>()->setBuffered(flag);
660 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 8) {
661 getConverter<int16_t, int8_t>()->setBuffered(flag);
662 } else if (from_bit_per_samples == 24 && to_bit_per_samples == 16) {
663 getConverter<int24_t, int16_t>()->setBuffered(flag);
664 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 24) {
665 getConverter<int16_t, int24_t>()->setBuffered(flag);
666 } else if (from_bit_per_samples == 32 && to_bit_per_samples == 16) {
667 getConverter<int32_t, int16_t>()->setBuffered(flag);
668 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 32) {
669 getConverter<int16_t, int32_t>()->setBuffered(flag);
670 }
671 }
672
673 float getByteFactor() override {
674 return static_cast<float>(to_bit_per_samples) /
675 static_cast<float>(from_bit_per_samples);
676 }
677
678 protected:
679 void* p_converter = nullptr;
682 float gain = 1.0;
683
685 if (p_converter == nullptr) return;
686
687 if (from_bit_per_samples == 8 && to_bit_per_samples == 16) {
690 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 8) {
693 } else if (from_bit_per_samples == 24 && to_bit_per_samples == 16) {
696 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 24) {
699 } else if (from_bit_per_samples == 32 && to_bit_per_samples == 16) {
702 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 32) {
705 } else {
706 TRACEE();
707 }
708 p_converter = nullptr;
709 }
710
711 template <typename TFrom, typename TTo>
715
716 void setupStream() {
717 if (p_stream != nullptr) {
718 if (from_bit_per_samples == 8 && to_bit_per_samples == 16) {
720 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 8) {
722 } else if (from_bit_per_samples == 24 && to_bit_per_samples == 16) {
724 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 24) {
726 } else if (from_bit_per_samples == 32 && to_bit_per_samples == 16) {
728 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 32) {
730 } else {
731 TRACEE();
732 }
733 } else {
734 if (from_bit_per_samples == 8 && to_bit_per_samples == 16) {
736 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 8) {
738 } else if (from_bit_per_samples == 24 && to_bit_per_samples == 16) {
740 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 24) {
742 } else if (from_bit_per_samples == 32 && to_bit_per_samples == 16) {
744 } else if (from_bit_per_samples == 16 && to_bit_per_samples == 32) {
746 } else {
747 TRACEE();
748 }
749 }
750 }
751};
752
762 public:
767 to_cfg = stream.audioInfo();
768 from_cfg = stream.audioInfo();
769 setStream(stream);
770 }
772 to_cfg = print.audioInfo();
773 setOutput(print);
774 }
775
776 void setStream(Stream& io) override {
777 TRACED();
780 }
781
782 void setStream(AudioStream& io) override {
783 TRACED();
786 }
787
788 void setOutput(Print& print) override {
789 TRACED();
792 }
793
794 void setOutput(AudioOutput& print) override {
795 TRACED();
798 }
799
801 void setAudioInfo(AudioInfo info) override {
802 TRACEI();
803 info.logInfo("FormatConverterStream");
805 // ChannelFormatConverter -> NumberFormatConverter -> SampleRateCoverter
807 }
808
810
811 AudioInfo audioInfoOut() override { return to_cfg; }
812
813 bool begin(AudioInfo from, AudioInfo to) {
814 TRACED();
815 setAudioInfoOut(to);
816 return begin(from);
817 }
818
820 bool begin(AudioInfo from) {
821 setAudioInfo(from);
822 return begin();
823 }
824
826 bool begin() override {
827 TRACED();
828 // build output chain: ChannelFormatConverter -> NumberFormatConverter ->
829 // SampleRateConverter
830 if (getStream() != nullptr) {
832 }
833 if (getPrint() != nullptr) {
835 }
838
839 // start individual converters
841
844 result &=
846
849
850 from_actual_cfg.bits_per_sample = to_cfg.bits_per_sample;
852
853 // setup reader to support readBytes()
854 setupReader();
855
856 if (!result) {
857 LOGE("begin failed");
858 }
859 is_active = result;
860 return result;
861 }
862
863 void end() {
864 is_active = false;
866 }
867
868 virtual size_t write(const uint8_t* data, size_t len) override {
869 LOGD("FormatConverterStream::write: %d", (int)len);
870 if (!is_active) return 0;
871 // addNotifyOnFirstWrite();
872 return channelFormatConverter.write(data, len);
873 }
874
876 void setBuffered(bool active) { is_buffered = active; }
877
882
883 protected:
889 bool is_buffered = true;
890 bool is_active = false;
891};
892
893} // 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
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: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
Increasing or decreasing the number of channels.
Definition BaseConverter.h:1509
void setTargetChannels(int channelCountOfTarget)
Definition BaseConverter.h:1522
size_t convert(uint8_t *target, uint8_t *src, size_t size)
Definition BaseConverter.h:1526
void setSourceChannels(int channelCountOfSource)
Definition BaseConverter.h:1518
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:264
void * converter
Definition AudioStreamsConverter.h:263
bool setupConverter(int fromChannels, int toChannels)
Definition AudioStreamsConverter.h:307
bool begin(AudioInfo from, AudioInfo to)
Definition AudioStreamsConverter.h:153
bool is_active
Definition AudioStreamsConverter.h:267
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:281
virtual int availableForWrite() override
Definition AudioStreamsConverter.h:243
int from_channels
Definition AudioStreamsConverter.h:266
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:258
void copy(ChannelFormatConverterStream &from)
Definition AudioStreamsConverter.h:269
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:265
void cleanupConverter()
Definition AudioStreamsConverter.h:285
void setAudioInfo(AudioInfo cfg) override
Defines the input AudioInfo.
Definition AudioStreamsConverter.h:135
virtual int available() override
Definition AudioStreamsConverter.h:228
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:761
virtual size_t write(const uint8_t *data, size_t len) override
Definition AudioStreamsConverter.h:868
bool is_buffered
Definition AudioStreamsConverter.h:889
void setOutput(Print &print) override
Defines/Changes the output target.
Definition AudioStreamsConverter.h:788
void setOutput(AudioOutput &print) override
Definition AudioStreamsConverter.h:794
bool begin(AudioInfo from, AudioInfo to)
Definition AudioStreamsConverter.h:813
bool is_active
Definition AudioStreamsConverter.h:890
void setBuffered(bool active)
Buffering is active by default to minimize the number of output calls.
Definition AudioStreamsConverter.h:876
void setStream(AudioStream &io) override
Definition AudioStreamsConverter.h:782
NumberFormatConverterStream numberFormatConverter
Definition AudioStreamsConverter.h:886
ResampleStream sampleRateConverter
Definition AudioStreamsConverter.h:888
FormatConverterStream(Stream &stream)
Definition AudioStreamsConverter.h:764
FormatConverterStream(Print &print)
Definition AudioStreamsConverter.h:765
float getByteFactor() override
Definition AudioStreamsConverter.h:878
bool begin(AudioInfo from)
Starts the processing: call setAudioInfoOut before to define the target.
Definition AudioStreamsConverter.h:820
AudioInfo to_cfg
Definition AudioStreamsConverter.h:885
FormatConverterStream(AudioOutput &print)
Definition AudioStreamsConverter.h:771
void end()
Definition AudioStreamsConverter.h:863
AudioInfo & from_cfg
Definition AudioStreamsConverter.h:884
AudioInfo audioInfoOut() override
Definition AudioStreamsConverter.h:811
ChannelFormatConverterStream channelFormatConverter
Definition AudioStreamsConverter.h:887
bool begin() override
(Re-)Starts the processing: call setAudioInfo and setAudioInfoOut before
Definition AudioStreamsConverter.h:826
void setAudioInfo(AudioInfo info) override
Set the input audio information.
Definition AudioStreamsConverter.h:801
void setAudioInfoOut(AudioInfo to)
Definition AudioStreamsConverter.h:809
void setStream(Stream &io) override
Defines/Changes the input & output.
Definition AudioStreamsConverter.h:776
FormatConverterStream(AudioStream &stream)
Definition AudioStreamsConverter.h:766
Converter which converts between bits_per_sample and 16 bits. The templated NumberFormatConverterStre...
Definition AudioStreamsConverter.h:471
virtual size_t write(const uint8_t *data, size_t len) override
Definition AudioStreamsConverter.h:563
virtual ~NumberFormatConverterStream()
Definition AudioStreamsConverter.h:478
bool begin(AudioInfo info, AudioInfo to, float gain=1.0f)
Definition AudioStreamsConverter.h:493
NumberFormatConverterStream(Print &print)
Definition AudioStreamsConverter.h:476
void setAudioInfo(AudioInfo newInfo) override
Defines the input AudioInfo.
Definition AudioStreamsConverter.h:480
void setupStream()
Definition AudioStreamsConverter.h:716
void * p_converter
Definition AudioStreamsConverter.h:679
size_t readBytes(uint8_t *data, size_t len) override
Definition AudioStreamsConverter.h:589
void setToBits(uint8_t bits)
Definition AudioStreamsConverter.h:516
void end() override
Definition AudioStreamsConverter.h:514
NumberFormatConverterStream(AudioStream &stream)
Definition AudioStreamsConverter.h:475
virtual int availableForWrite() override
Definition AudioStreamsConverter.h:634
void setBuffered(bool flag)
Definition AudioStreamsConverter.h:657
float getByteFactor() override
Definition AudioStreamsConverter.h:673
int from_bit_per_samples
Definition AudioStreamsConverter.h:680
bool begin(int from_bit_per_samples, int to_bit_per_samples, float gain=1.0)
Definition AudioStreamsConverter.h:518
AudioInfo audioInfoOut() override
Definition AudioStreamsConverter.h:487
NumberFormatConverterStream(Stream &stream)
Definition AudioStreamsConverter.h:474
bool begin(AudioInfo info, int toBits, float gain=1.0f)
Definition AudioStreamsConverter.h:505
float gain
Definition AudioStreamsConverter.h:682
bool begin() override
Definition AudioStreamsConverter.h:510
int to_bit_per_samples
Definition AudioStreamsConverter.h:681
NumberFormatConverterStreamT< TFrom, TTo > * getConverter()
Definition AudioStreamsConverter.h:712
NumberFormatConverterStream(AudioOutput &print)
Definition AudioStreamsConverter.h:477
void cleanupConverter()
Definition AudioStreamsConverter.h:684
virtual int available() override
Definition AudioStreamsConverter.h:612
A more generic templated Converter which converts from a source type to a target type: You can use e....
Definition AudioStreamsConverter.h:348
virtual size_t write(const uint8_t *data, size_t len) override
Definition AudioStreamsConverter.h:383
NumberFormatConverterStreamT(float gain)
Definition AudioStreamsConverter.h:351
bool is_buffered
Definition AudioStreamsConverter.h:459
void setAudioInfo(AudioInfo newInfo) override
Defines the input AudioInfo.
Definition AudioStreamsConverter.h:357
size_t readBytes(uint8_t *data, size_t len) override
Definition AudioStreamsConverter.h:415
NumberFormatConverterStreamT(AudioOutput &print)
Definition AudioStreamsConverter.h:355
virtual int availableForWrite() override
Definition AudioStreamsConverter.h:442
void setBuffered(bool flag)
Definition AudioStreamsConverter.h:448
float getByteFactor() override
Definition AudioStreamsConverter.h:453
NumberFormatConverterStreamT(AudioStream &stream)
Definition AudioStreamsConverter.h:353
void setGain(float value)
Defines the gain (only available when buffered is true)
Definition AudioStreamsConverter.h:451
SingleBuffer< uint8_t > buffer
Definition AudioStreamsConverter.h:458
AudioInfo audioInfoOut() override
Definition AudioStreamsConverter.h:365
NumberFormatConverterStreamT(Stream &stream)
Definition AudioStreamsConverter.h:352
float gain
Definition AudioStreamsConverter.h:460
bool begin() override
Definition AudioStreamsConverter.h:372
NumberFormatConverterStreamT(Print &print)
Definition AudioStreamsConverter.h:354
bool begin(AudioInfo info)
Definition AudioStreamsConverter.h:378
virtual int available() override
Definition AudioStreamsConverter.h:438
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
Base class for chained converting streams.
Definition AudioIO.h:151
virtual void setStream(Stream &stream) override
Defines/Changes the input & output.
Definition AudioIO.h:153
void end() override
Definition AudioIO.h:197
virtual Stream * getStream()
Definition AudioIO.h:180
virtual void setOutput(AudioOutput &print)
Definition AudioIO.h:167
Stream * p_stream
Definition AudioIO.h:214
virtual Print * getPrint()
Definition AudioIO.h:178
Print * p_print
Definition AudioIO.h:215
void setupReader()
Definition AudioIO.h:217
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:180
bool begin(ResampleConfig cfg)
Definition ResampleStream.h:63
A simple Buffer implementation which just uses a (dynamically sized) array.
Definition Buffers.h:172
T * address() override
Provides address to beginning of the buffer.
Definition Buffers.h:281
bool resize(int size)
Resizes the buffer if supported: returns false if not supported.
Definition Buffers.h:305
T * data()
Provides address of actual data.
Definition Buffers.h:284
void reset() override
clears the buffer
Definition Buffers.h:286
Definition NoArduino.h:142
virtual size_t readBytes(uint8_t *data, size_t len)
Definition NoArduino.h:147
virtual int available()
Definition NoArduino.h:146
Vector implementation which provides the most important methods as defined by std::vector....
Definition Vector.h:21
bool resize(int newSize, T value)
Definition Vector.h:266
T * data()
Definition Vector.h:316
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10
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 logInfo(const char *source="")
Definition AudioTypes.h:125