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);
138 LOGI(
"-> ResampleStream:")
154 LOGI(
"setStepSize: %f", step);
157 step_size_fixed = (int32_t) lround(step * 65536.0f);
166 return sampleRateFrom / sampleRateTo;
174 size_t write(
const uint8_t *data,
size_t len)
override {
175 LOGD(
"ResampleStream::write: %d", (
int)len);
181 return writeFixed(
p_print, data, len, written);
183 return write<int16_t>(
p_print, data, len, written);
186 return write<int24_t>(
p_print, data, len, written);
188 return write<int32_t>(
p_print, data, len, written);
225 int32_t idx_fixed = 0;
226 int32_t step_size_fixed = 1 << 16;
236 int last_samples_size = cfg.
channels * bytes_per_sample;
242 template <
typename T>
252 LOGE(
"channels is 0");
255 T *data = (T *)buffer;
256 int samples = bytes /
sizeof(T);
263 setupLastSamples<T>(data, 0);
267 size_t frame_size =
sizeof(frame);
270 while (
idx < frames - 1) {
272 T result = getValue<T>(data,
idx, ch);
285 written += tmp_written;
286 if (frame_size != tmp_written) {
290 int tmp =
p_out->
write((
const uint8_t *)&frame, frame_size);
292 if (tmp != frame_size) {
293 LOGE(
"Failed to write %d bytes: %d", (
int)frame_size, tmp);
303 setupLastSamples<T>(data, frames - 1);
307 LOGD(
"write: %d vs %d", (
int)bytes, (
int)written);
317 size_t writeFixed(
Print *
p_out,
const uint8_t *buffer,
size_t bytes,
326 LOGE(
"channels is 0");
329 int16_t *data = (int16_t *)buffer;
330 int samples = bytes /
sizeof(int16_t);
337 setupLastSamples<int16_t>(data, 0);
341 size_t frame_size =
sizeof(frame);
343 int32_t frames_fixed = ((int32_t)frames - 1) << 16;
345 while (idx_fixed < frames_fixed) {
347 frame[ch] = getValueFixed(data, idx_fixed, ch);
359 written += tmp_written;
360 if (frame_size != tmp_written) {
364 int tmp =
p_out->
write((
const uint8_t *)&frame, frame_size);
366 if (tmp != frame_size) {
367 LOGE(
"Failed to write %d bytes: %d", (
int)frame_size, tmp);
371 idx_fixed += step_size_fixed;
377 setupLastSamples<int16_t>(data, frames - 1);
378 idx_fixed -= (int32_t)frames << 16;
386 int16_t getValueFixed(int16_t *data, int32_t frame_idx_fixed,
int channel) {
389 int32_t frame_idx0 = frame_idx_fixed >> 16;
390 int32_t frame_idx1 = frame_idx0 + 1;
391 int16_t val0 = lookup<int16_t>(data, frame_idx0, channel);
392 int16_t val1 = lookup<int16_t>(data, frame_idx1, channel);
396 int32_t weight = (frame_idx_fixed >> 8) & 0xFF;
397 int32_t diff = (int32_t)val1 - (int32_t)val0;
399 int32_t result = (int32_t)val0 + (((diff * weight) + (1 << 7)) >> 8);
400 return (int16_t)result;
405 template <
typename T>
406 T
getValue(T *data,
float frame_idx,
int channel) {
408 int frame_idx0 = frame_idx;
410 if (frame_idx0 == 0 && frame_idx < 0) frame_idx0 = -1;
411 int frame_idx1 = frame_idx0 + 1;
412 T val0 = lookup<T>(data, frame_idx0, channel);
413 T val1 = lookup<T>(data, frame_idx1, channel);
418 float frac = frame_idx - frame_idx0;
419 float result = val0 + frac * (val1 - val0);
420 LOGD(
"getValue idx: %d:%d / val: %d:%d / %f -> %f", frame_idx0, frame_idx1,
421 (
int)val0, (
int)val1, frame_idx, result)
422 return (T)(result + (result >= 0 ? 0.5f : -0.5f));
426 template <
typename T>
427 T
lookup(T *data,
int frame,
int channel) {
433 return pt_last_samples[channel];
437 template <
typename T>
441 pt_last_samples[ch] = data[(frame *
info.
channels) + ch];
442 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