87template <
typename T =
int16_t>
106 read_increment_fixed = (int32_t)roundf(increment * 65536.0f);
130 read_pos_fixed += read_increment_fixed;
135 if (read_pos_fixed >= bufferSizeFixed()) {
136 read_pos_fixed -= bufferSizeFixed();
155 LOGE(
"buffer has no memory");
159 result =
buffer[(int)(read_pos_fixed >> 16)];
174 LOGE(
"buffer has no memory");
218 int32_t read_pos_fixed = 0;
219 int32_t read_increment_fixed = 1 << 16;
220 int32_t bufferSizeFixed()
const {
return buffer_size << 16; }
241template <
typename T =
int16_t>
286 bool peek(T &result) {
return false; }
295 LOGE(
"buffer has no memory");
356 int read_pointer_int180 = 0;
358 read_pointer_int180 = read_pointer_int - (
buffer_size / 2);
360 read_pointer_int180 = read_pointer_int + (
buffer_size / 2);
363 float read_sample = (float)
buffer[read_pointer_int];
364 float read_sample_180 = (float)
buffer[read_pointer_int180];
411template <
typename T =
int16_t>
463 if (
buffer.size() == 0)
return false;
507 int read_pos_int = read_pos;
509 T value2 =
getValue(read_pos_int + 1);
513 if (value2 < value1) {
519 float offset_in = read_pos - read_pos_int;
520 LOGD(
"read_pos=%f read_pos_int=%d, offset_in=%f", read_pos, read_pos_int,
523 abs(value2 - value1);
524 float offset_result = offset_in * diff_result;
525 float result = offset_result + value1;
526 LOGD(
"interpolate %d %d -> %f -> %f", value1, value2, offset_result,
555 bool v_incrementing = v2 - v1 >= 0;
557 if (
incrementing && v_incrementing && value1 >= v1 && value1 <= v2) {
561 if (!
incrementing && !v_incrementing && value1 <= v1 && value1 >= v2) {
588 LOGD(
"handleReadWriteOverrun write_pos=%d read_pos_int=%d",
write_pos,
594 int pos = read_pos_int + j;
600 float diff_value = abs(v1 - v2);
603 if (diff_value > 0) {
604 fraction = diff_last_value / diff_value;
614 LOGD(
"handleReadWriteOverrun -> read_pos pos=%d pos_float=%f", pos,
621 LOGW(
"phase allign failed: maybe the buffer is too small")
651template <
typename T,
class BufferT>
706 size_t write(
const uint8_t *data,
size_t len)
override {
707 LOGD(
"PitchShiftOutput::write %d bytes", (
int)len);
713 int sample_count = len /
sizeof(T);
715 for (
int j = 0; j < sample_count; j += channels) {
717 for (
int ch = 0; ch < channels; ch++) {
718 value += p_in[j + ch];
725 LOGD(
"PitchShiftOutput %f -> %d", value, (
int)out_value);
726 T out_array[channels];
727 for (
int ch = 0; ch < channels; ch++) {
728 out_array[ch] = out_value;
730 result +=
p_out->
write((uint8_t *)out_array,
sizeof(T) * channels);
#define LOGW(...)
Definition AudioLoggerIDF.h:29
#define TRACED()
Definition AudioLoggerIDF.h:31
#define LOGD(...)
Definition AudioLoggerIDF.h:27
#define LOGE(...)
Definition AudioLoggerIDF.h:30
#define assert(T)
Definition avr.h:10
virtual size_t write(const uint8_t *data, size_t len)
Definition Arduino.h:120