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;
175 size_t write(
const uint8_t *data,
size_t len)
override {
176 LOGD(
"ResampleStream::write: %d", (
int)len);
179 if (frame_bytes <= 0) {
184 const uint8_t *proc_data = data;
185 size_t proc_len = len;
204 size_t whole = (proc_len / (size_t)frame_bytes) * (size_t)frame_bytes;
205 size_t leftover = proc_len - whole;
212 writeFixed(
p_print, proc_data, whole, written);
214 write<int16_t>(
p_print, proc_data, whole, written);
218 write<int24_t>(
p_print, proc_data, whole, written);
221 write<int32_t>(
p_print, proc_data, whole, written);
232 memcpy(
carry.
data(), proc_data + whole, leftover);
277 int32_t idx_fixed = 0;
278 int32_t step_size_fixed = 1 << 16;
288 int last_samples_size = cfg.
channels * bytes_per_sample;
294 template <
typename T>
304 LOGE(
"channels is 0");
307 T *data = (T *)buffer;
308 int samples = bytes /
sizeof(T);
315 setupLastSamples<T>(data, 0);
319 size_t frame_size =
sizeof(frame);
322 while (
idx < frames - 1) {
324 T result = getValue<T>(data,
idx, ch);
337 written += tmp_written;
338 if (frame_size != tmp_written) {
342 int tmp =
p_out->
write((
const uint8_t *)&frame, frame_size);
344 if (tmp != frame_size) {
345 LOGE(
"Failed to write %d bytes: %d", (
int)frame_size, tmp);
355 setupLastSamples<T>(data, frames - 1);
359 LOGD(
"write: %d vs %d", (
int)bytes, (
int)written);
369 size_t writeFixed(
Print *
p_out,
const uint8_t *buffer,
size_t bytes,
378 LOGE(
"channels is 0");
381 int16_t *data = (int16_t *)buffer;
382 int samples = bytes /
sizeof(int16_t);
389 setupLastSamples<int16_t>(data, 0);
393 size_t frame_size =
sizeof(frame);
395 int32_t frames_fixed = ((int32_t)frames - 1) << 16;
397 while (idx_fixed < frames_fixed) {
399 frame[ch] = getValueFixed(data, idx_fixed, ch);
411 written += tmp_written;
412 if (frame_size != tmp_written) {
416 int tmp =
p_out->
write((
const uint8_t *)&frame, frame_size);
418 if (tmp != frame_size) {
419 LOGE(
"Failed to write %d bytes: %d", (
int)frame_size, tmp);
423 idx_fixed += step_size_fixed;
429 setupLastSamples<int16_t>(data, frames - 1);
430 idx_fixed -= (int32_t)frames << 16;
438 int16_t getValueFixed(int16_t *data, int32_t frame_idx_fixed,
int channel) {
441 int32_t frame_idx0 = frame_idx_fixed >> 16;
442 int32_t frame_idx1 = frame_idx0 + 1;
443 int16_t val0 = lookup<int16_t>(data, frame_idx0, channel);
444 int16_t val1 = lookup<int16_t>(data, frame_idx1, channel);
448 int32_t weight = (frame_idx_fixed >> 8) & 0xFF;
449 int32_t diff = (int32_t)val1 - (int32_t)val0;
451 int32_t result = (int32_t)val0 + (((diff * weight) + (1 << 7)) >> 8);
452 return (int16_t)result;
457 template <
typename T>
458 T
getValue(T *data,
float frame_idx,
int channel) {
460 int frame_idx0 = frame_idx;
462 if (frame_idx0 == 0 && frame_idx < 0) frame_idx0 = -1;
463 int frame_idx1 = frame_idx0 + 1;
464 T val0 = lookup<T>(data, frame_idx0, channel);
465 T val1 = lookup<T>(data, frame_idx1, channel);
470 float frac = frame_idx - frame_idx0;
471 float result = val0 + frac * (val1 - val0);
472 LOGD(
"getValue idx: %d:%d / val: %d:%d / %f -> %f", frame_idx0, frame_idx1,
473 (
int)val0, (
int)val1, frame_idx, result)
474 return (T)(result + (result >= 0 ? 0.5f : -0.5f));
478 template <
typename T>
479 T
lookup(T *data,
int frame,
int channel) {
485 return pt_last_samples[channel];
489 template <
typename T>
493 pt_last_samples[ch] = data[(frame *
info.
channels) + ch];
494 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
uint32_t sample_rate_t
Type alias for sample rate values.
Definition AudioTypes.h:19