23 bool begin(
int fromChannels,
int toChannels) {
24 LOGI(
"begin %d -> %d channels", fromChannels, toChannels);
28 factor =
static_cast<float>(toChannels) /
static_cast<float>(fromChannels);
40 virtual size_t write(
const uint8_t* data,
size_t len)
override {
42 if (
p_print ==
nullptr)
return 0;
47 size_t resultBytes =
convert(data, len);
53 size_t readBytes(uint8_t* data,
size_t len)
override {
59 size_t in_bytes = 1.0f /
factor * len;
63 assert(len == resultBytes);
64 memcpy(data, (uint8_t*)
buffer.data(), len);
85 if (
p_print ==
nullptr)
return 0;
101 size_t convert(
const uint8_t* in_data,
size_t size) {
103 size_t result_samples = size /
sizeof(T) *
factor;
104 buffer.resize(result_samples);
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)));
167 if (toChannels == 0) {
168 LOGE(
"toChannels is 0");
175 LOGI(
"--> ChannelFormatConverterStream");
177 LOGI(
"begin %d -> %d channels", cfg.
channels, toChannels);
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;
200 return getConverter<int8_t>()->write(data, len);
202 return getConverter<int16_t>()->write(data, len);
204 return getConverter<int24_t>()->write(data, len);
206 return getConverter<int32_t>()->write(data, len);
213 LOGD(
"ChannelFormatConverterStream::readBytes: %d", (
int)len);
216 return getConverter<int8_t>()->readBytes(data, len);
218 return getConverter<int16_t>()->readBytes(data, len);
220 return getConverter<int24_t>()->readBytes(data, len);
222 return getConverter<int32_t>()->readBytes(data, len);
231 return getConverter<int8_t>()->available();
233 return getConverter<int16_t>()->available();
235 return getConverter<int24_t>()->available();
237 return getConverter<int32_t>()->available();
246 return getConverter<int8_t>()->availableForWrite();
248 return getConverter<int16_t>()->availableForWrite();
250 return getConverter<int24_t>()->availableForWrite();
252 return getConverter<int32_t>()->availableForWrite();
280 template <
typename T>
289 delete getConverter<int8_t>();
293 delete getConverter<int16_t>();
297 delete getConverter<int24_t>();
301 delete getConverter<int32_t>();
313 getConverter<int8_t>()->begin(fromChannels, toChannels);
317 getConverter<int16_t>()->begin(fromChannels, toChannels);
321 getConverter<int24_t>()->begin(fromChannels, toChannels);
325 getConverter<int32_t>()->begin(fromChannels, toChannels);
347template <
typename TFrom,
typename TTo>
360 LOGW(
"Inconsistent source bits_per_sample %d, using %d", newInfo.
bits_per_sample, (
int)
sizeof(TFrom) * 8);
373 LOGI(
"begin %d -> %d bits", (
int)
sizeof(TFrom)*8, (
int)
sizeof(TTo)*8);
383 virtual size_t write(
const uint8_t* data,
size_t len)
override {
385 if (
p_print ==
nullptr)
return 0;
389 if (std::is_same<TFrom, TTo>::value)
return p_print->
write(data, len);
391 if (
sizeof(TFrom) ==
sizeof(TTo))
return p_print->
write(data, len);
394 size_t samples = len /
sizeof(TFrom);
395 size_t result_size = 0;
396 TFrom* data_source = (TFrom*)data;
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));
404 int size_bytes =
sizeof(TTo) * samples;
406 NumberConverter::convertArray<TFrom, TTo>(
412 return result_size > 0 ? len : 0;
416 LOGD(
"NumberFormatConverterStreamT::readBytes: %d", (
int)len);
418 size_t samples = len /
sizeof(TTo);
419 TTo* data_target = (TTo*)data;
422 for (
size_t j = 0; j < samples; j++) {
425 data_target[j] = NumberConverter::convert<TFrom, TTo>(source);
431 NumberConverter::convertArray<TFrom, TTo>(data, data_target, samples,
454 return static_cast<float>(
sizeof(TTo)) /
static_cast<float>(
sizeof(TFrom));
483 LOGI(
"-> NumberFormatConverterStream:")
495 LOGE(
"sample_rate does not match")
499 LOGE(
"channels do not match")
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;
571 return getConverter<int8_t, int16_t>()->write(data, len);
573 return getConverter<int16_t, int8_t>()->write(data, len);
575 return getConverter<int24_t, int16_t>()->write(data, len);
577 return getConverter<int16_t, int24_t>()->write(data, len);
579 return getConverter<int32_t, int16_t>()->write(data, len);
581 return getConverter<int16_t, int32_t>()->write(data, len);
590 LOGD(
"NumberFormatConverterStream::readBytes: %d", (
int)len);
595 return getConverter<int8_t, int16_t>()->readBytes(data, len);
597 return getConverter<int16_t, int8_t>()->readBytes(data, len);
599 return getConverter<int24_t, int16_t>()->readBytes(data, len);
601 return getConverter<int16_t, int24_t>()->readBytes(data, len);
603 return getConverter<int32_t, int16_t>()->readBytes(data, len);
605 return getConverter<int16_t, int32_t>()->readBytes(data, len);
617 return getConverter<int8_t, int16_t>()->available();
619 return getConverter<int16_t, int8_t>()->available();
621 return getConverter<int24_t, int16_t>()->available();
623 return getConverter<int16_t, int24_t>()->available();
625 return getConverter<int32_t, int16_t>()->available();
627 return getConverter<int16_t, int32_t>()->available();
635 if (
p_print ==
nullptr)
return 0;
640 return getConverter<int8_t, int16_t>()->availableForWrite();
642 return getConverter<int16_t, int8_t>()->availableForWrite();
644 return getConverter<int24_t, int16_t>()->availableForWrite();
646 return getConverter<int16_t, int24_t>()->availableForWrite();
648 return getConverter<int32_t, int16_t>()->availableForWrite();
650 return getConverter<int16_t, int32_t>()->availableForWrite();
659 getConverter<int8_t, int16_t>()->setBuffered(flag);
661 getConverter<int16_t, int8_t>()->setBuffered(flag);
663 getConverter<int24_t, int16_t>()->setBuffered(flag);
665 getConverter<int16_t, int24_t>()->setBuffered(flag);
667 getConverter<int32_t, int16_t>()->setBuffered(flag);
669 getConverter<int16_t, int32_t>()->setBuffered(flag);
711 template <
typename TFrom,
typename TTo>
719 getConverter<int8_t, int16_t>()->setStream(*
p_stream);
721 getConverter<int16_t, int8_t>()->setStream(*
p_stream);
723 getConverter<int24_t, int16_t>()->setStream(*
p_stream);
725 getConverter<int16_t, int24_t>()->setStream(*
p_stream);
727 getConverter<int32_t, int16_t>()->setStream(*
p_stream);
729 getConverter<int16_t, int32_t>()->setStream(*
p_stream);
735 getConverter<int8_t, int16_t>()->setOutput(*
p_print);
737 getConverter<int16_t, int8_t>()->setOutput(*
p_print);
739 getConverter<int24_t, int16_t>()->setOutput(*
p_print);
741 getConverter<int16_t, int24_t>()->setOutput(*
p_print);
743 getConverter<int32_t, int16_t>()->setOutput(*
p_print);
745 getConverter<int16_t, int32_t>()->setOutput(*
p_print);
857 LOGE(
"begin failed");
868 virtual size_t write(
const uint8_t* data,
size_t len)
override {
869 LOGD(
"FormatConverterStream::write: %d", (
int)len);
#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 int availableForWrite()
Definition Arduino.h:128
virtual size_t write(const uint8_t *data, size_t len)
Definition Arduino.h:120
virtual size_t readBytes(uint8_t *data, size_t len)
Definition Arduino.h:140
virtual int available()
Definition Arduino.h:139