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);
42 if (
p_out ==
nullptr)
return 0;
47 size_t resultBytes =
convert(data, len);
55 if (
p_io ==
nullptr)
return 0;
59 size_t in_bytes = 1.0f /
factor * len;
63 assert(len == resultBytes);
85 if (
p_out ==
nullptr)
return 0;
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);
195 LOGD(
"ChannelFormatConverterStream::write: %d", (
int)len);
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);
217 return getConverter<int8_t>()->readBytes(data, len);
219 return getConverter<int16_t>()->readBytes(data, len);
221 return getConverter<int24_t>()->readBytes(data, len);
223 return getConverter<int32_t>()->readBytes(data, len);
233 return getConverter<int8_t>()->available();
235 return getConverter<int16_t>()->available();
237 return getConverter<int24_t>()->available();
239 return getConverter<int32_t>()->available();
249 return getConverter<int8_t>()->availableForWrite();
251 return getConverter<int16_t>()->availableForWrite();
253 return getConverter<int24_t>()->availableForWrite();
255 return getConverter<int32_t>()->availableForWrite();
283 template <
typename T>
292 delete getConverter<int8_t>();
296 delete getConverter<int16_t>();
300 delete getConverter<int24_t>();
304 delete getConverter<int32_t>();
313 template <
typename T>
316 if (
p_io !=
nullptr) {
318 }
else if (
p_out !=
nullptr) {
321 LOGE(
"ChannelFormatConverterStream: no stream or output defined");
324 result->
begin(fromChannels, toChannels);
332 converter = newConverter<int8_t>(fromChannels, toChannels);
335 converter = newConverter<int16_t>(fromChannels, toChannels);
338 converter = newConverter<int24_t>(fromChannels, toChannels);
341 converter = newConverter<int32_t>(fromChannels, toChannels);
364template <
typename TFrom,
typename TTo>
377 LOGW(
"Inconsistent source bits_per_sample %d, using %d", newInfo.
bits_per_sample, (
int)
sizeof(TFrom) * 8);
390 LOGI(
"begin %d -> %d bits", (
int)
sizeof(TFrom)*8, (
int)
sizeof(TTo)*8);
402 if (
p_out ==
nullptr)
return 0;
406 if (std::is_same<TFrom, TTo>::value)
return p_out->
write(data, len);
408 if (
sizeof(TFrom) ==
sizeof(TTo))
return p_out->
write(data, len);
411 size_t samples = len /
sizeof(TFrom);
412 size_t result_size = 0;
413 TFrom* data_source = (TFrom*)data;
416 for (
size_t j = 0; j < samples; j++) {
417 TTo value = NumberConverter::convert<TFrom, TTo>(data_source[j]);
421 int size_bytes =
sizeof(TTo) * samples;
423 NumberConverter::convertArray<TFrom, TTo>(
429 return result_size > 0 ? len : 0;
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;
439 for (
size_t j = 0; j < samples; j++) {
442 data_target[j] = NumberConverter::convert<TFrom, TTo>(source);
448 NumberConverter::convertArray<TFrom, TTo>(data, data_target, samples,
471 return static_cast<float>(
sizeof(TTo)) /
static_cast<float>(
sizeof(TFrom));
500 LOGI(
"-> NumberFormatConverterStream:")
512 LOGE(
"sample_rate does not match")
516 LOGE(
"channels do not match")
581 LOGD(
"NumberFormatConverterStream::write: %d", (
int)len);
582 if (
p_out ==
nullptr)
return 0;
588 return getConverter<int8_t, int16_t>()->write(data, len);
590 return getConverter<int16_t, int8_t>()->write(data, len);
592 return getConverter<int24_t, int16_t>()->write(data, len);
594 return getConverter<int16_t, int24_t>()->write(data, len);
596 return getConverter<int32_t, int16_t>()->write(data, len);
598 return getConverter<int16_t, int32_t>()->write(data, len);
607 LOGD(
"NumberFormatConverterStream::readBytes: %d", (
int)len);
612 return getConverter<int8_t, int16_t>()->readBytes(data, len);
614 return getConverter<int16_t, int8_t>()->readBytes(data, len);
616 return getConverter<int24_t, int16_t>()->readBytes(data, len);
618 return getConverter<int16_t, int24_t>()->readBytes(data, len);
620 return getConverter<int32_t, int16_t>()->readBytes(data, len);
622 return getConverter<int16_t, int32_t>()->readBytes(data, len);
634 return getConverter<int8_t, int16_t>()->available();
636 return getConverter<int16_t, int8_t>()->available();
638 return getConverter<int24_t, int16_t>()->available();
640 return getConverter<int16_t, int24_t>()->available();
642 return getConverter<int32_t, int16_t>()->available();
644 return getConverter<int16_t, int32_t>()->available();
652 if (
p_out ==
nullptr)
return 0;
657 return getConverter<int8_t, int16_t>()->availableForWrite();
659 return getConverter<int16_t, int8_t>()->availableForWrite();
661 return getConverter<int24_t, int16_t>()->availableForWrite();
663 return getConverter<int16_t, int24_t>()->availableForWrite();
665 return getConverter<int32_t, int16_t>()->availableForWrite();
667 return getConverter<int16_t, int32_t>()->availableForWrite();
676 getConverter<int8_t, int16_t>()->setBuffered(flag);
678 getConverter<int16_t, int8_t>()->setBuffered(flag);
680 getConverter<int24_t, int16_t>()->setBuffered(flag);
682 getConverter<int16_t, int24_t>()->setBuffered(flag);
684 getConverter<int32_t, int16_t>()->setBuffered(flag);
686 getConverter<int16_t, int32_t>()->setBuffered(flag);
728 template <
typename TFrom,
typename TTo>
734 if (
p_io !=
nullptr) {
736 getConverter<int8_t, int16_t>()->setStream(*
p_io);
738 getConverter<int16_t, int8_t>()->setStream(*
p_io);
740 getConverter<int24_t, int16_t>()->setStream(*
p_io);
742 getConverter<int16_t, int24_t>()->setStream(*
p_io);
744 getConverter<int32_t, int16_t>()->setStream(*
p_io);
746 getConverter<int16_t, int32_t>()->setStream(*
p_io);
752 getConverter<int8_t, int16_t>()->setOutput(*
p_out);
754 getConverter<int16_t, int8_t>()->setOutput(*
p_out);
756 getConverter<int24_t, int16_t>()->setOutput(*
p_out);
758 getConverter<int16_t, int24_t>()->setOutput(*
p_out);
760 getConverter<int32_t, int16_t>()->setOutput(*
p_out);
762 getConverter<int16_t, int32_t>()->setOutput(*
p_out);
874 LOGE(
"begin failed");
886 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