6# define PRINT_FLUSH_OVERRIDE override
8# define PRINT_FLUSH_OVERRIDE
79 LOGE(
"step_size %f is out of range for fixed point (+/-32768) - falling back is not implemented, output will wrap", cfg.
step_size);
139 LOGI(
"-> ResampleStream:")
155 LOGI(
"setStepSize: %f", step);
158 step_size_fixed = (
int32_t) lround(step * 65536.0f);
167 return sampleRateFrom / sampleRateTo;
176 LOGD(
"ResampleStream::write: %d", (
int)len);
178 if (
p_out ==
nullptr) {
179 LOGE(
"output not defined");
183 if (frame_bytes <= 0) {
188 const uint8_t *proc_data = data;
189 size_t proc_len = len;
208 size_t whole = (proc_len / (
size_t)frame_bytes) * (
size_t)frame_bytes;
209 size_t leftover = proc_len - whole;
216 writeFixed(proc_data, whole, written);
218 write<int16_t>(proc_data, whole, written);
222 write<int24_t>(proc_data, whole, written);
225 write<int32_t>(proc_data, whole, written);
236 memcpy(
carry.
data(), proc_data + whole, leftover);
282 int32_t step_size_fixed = 1 << 16;
291 int last_samples_size = cfg.
channels * bytes_per_sample;
297 template <
typename T>
305 LOGE(
"channels is 0");
308 T *data = (T *)buffer;
309 int samples = bytes /
sizeof(T);
316 setupLastSamples<T>(data, 0);
320 size_t frame_size =
sizeof(frame);
323 while (
idx < frames - 1) {
325 T result = getValue<T>(data,
idx, ch);
338 written += tmp_written;
339 if (frame_size != tmp_written) {
345 if (tmp != frame_size) {
346 LOGE(
"Failed to write %d bytes: %d", (
int)frame_size, tmp);
356 setupLastSamples<T>(data, frames - 1);
360 LOGD(
"write: %d vs %d", (
int)bytes, (
int)written);
370 size_t writeFixed(
const uint8_t *buffer,
size_t bytes,
size_t &written) {
377 LOGE(
"channels is 0");
381 int samples = bytes /
sizeof(
int16_t);
388 setupLastSamples<int16_t>(data, 0);
392 size_t frame_size =
sizeof(frame);
396 while (idx_fixed < frames_fixed) {
398 frame[ch] = getValueFixed(data, idx_fixed, ch);
410 written += tmp_written;
411 if (frame_size != tmp_written) {
417 if (tmp != frame_size) {
418 LOGE(
"Failed to write %d bytes: %d", (
int)frame_size, tmp);
422 idx_fixed += step_size_fixed;
428 setupLastSamples<int16_t>(data, frames - 1);
429 idx_fixed -= (
int32_t)frames << 16;
440 int32_t frame_idx0 = frame_idx_fixed >> 16;
441 int32_t frame_idx1 = frame_idx0 + 1;
442 int16_t val0 = lookup<int16_t>(data, frame_idx0, channel);
443 int16_t val1 = lookup<int16_t>(data, frame_idx1, channel);
447 int32_t weight = (frame_idx_fixed >> 8) & 0xFF;
450 int32_t result = (
int32_t)val0 + (((diff * weight) + (1 << 7)) >> 8);
456 template <
typename T>
457 T
getValue(T *data,
float frame_idx,
int channel) {
459 int frame_idx0 = frame_idx;
461 if (frame_idx0 == 0 && frame_idx < 0) frame_idx0 = -1;
462 int frame_idx1 = frame_idx0 + 1;
463 T val0 = lookup<T>(data, frame_idx0, channel);
464 T val1 = lookup<T>(data, frame_idx1, channel);
469 float frac = frame_idx - frame_idx0;
470 float result = val0 + frac * (val1 - val0);
471 LOGD(
"getValue idx: %d:%d / val: %d:%d / %f -> %f", frame_idx0, frame_idx1,
472 (
int)val0, (
int)val1, frame_idx, result)
473 return (T)(result + (result >= 0 ? 0.5f : -0.5f));
477 template <
typename T>
478 T
lookup(T *data,
int frame,
int channel) {
484 return pt_last_samples[channel];
488 template <
typename T>
492 pt_last_samples[ch] = data[(frame *
info.
channels) + ch];
493 LOGD(
"setupLastSamples ch:%d - %d", ch, (
int)pt_last_samples[ch])
#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 PRINT_FLUSH_OVERRIDE
Definition AudioOutput.h:15
#define DEFAULT_BUFFER_SIZE
Definition avr.h:20
virtual size_t write(const uint8_t *data, size_t len)
Definition Arduino.h:120
virtual void flush()
Definition Arduino.h:130