3#include "AudioConfig.h"
7#include "AudioTools/CoreAudio/AudioTypes.h"
8#include "AudioTools/CoreAudio/AudioOutput.h"
23 float pitch_shift = 1.4f;
24 int buffer_size = 1000;
38 setIncrement(increment);
43 void setIncrement(
float increment) { read_increment = increment; }
45 void resize(
int size) {
52 read_pos_float += read_increment;
54 if (read_pos_float > buffer_size) {
55 read_pos_float -= buffer_size;
61 if (buffer.size() == 0) {
62 LOGE(
"buffer has no memory");
65 return buffer[(
int)read_pos_float];
69 if (buffer.size() == 0) {
70 LOGE(
"buffer has no memory");
73 buffer[write_pos++] = sample;
75 if (write_pos >= buffer_size) {
85 memset(buffer.data(), 0,
sizeof(
T) * buffer_size);
88 virtual bool isFull() {
return false; }
92 size_t size() {
return buffer_size;}
97 float read_pos_float = 0.0;
98 float read_increment = 1.0;
112 setIncrement(increment);
117 void setIncrement(
float increment) { pitch_shift = increment; }
119 void resize(
int size) {
121 overlap = buffer_size / 10;
130 if (buffer.size() == 0) {
131 LOGE(
"buffer has no memory");
135 write_pointer = write_pos;
136 buffer[write_pos++] = sample;
138 if (write_pos >= buffer_size) {
149 overlap = buffer_size / 10;
150 memset(buffer.data(), 0,
sizeof(
T) * buffer_size);
157 size_t size() {
return buffer_size;}
161 float read_pos_float = 0.0;
162 float cross_fade = 1.0;
164 int write_pointer = 0;
167 float pitch_shift = 0;
172 assert(pitch_shift > 0);
173 assert(buffer_size > 0);
210 read_pos_float += pitch_shift;
211 if (
roundf(read_pos_float) >= buffer_size)
212 read_pos_float = 0.0f;
228 setIncrement(increment);
233 void setIncrement(
float increment) { read_increment = increment; }
235 void resize(
int size) {
238 read_pos_float = size / 2;
243 assert(read_increment != 0.0f);
245 read_pos_float += read_increment;
247 if (read_pos_float > buffer_size) {
248 read_pos_float -= buffer_size;
254 if (buffer.size() == 0)
260 if (buffer.size() == 0)
263 buffer[write_pos++] = sample;
265 if (write_pos >= buffer_size) {
275 memset(buffer.data(), 0,
sizeof(
T) * buffer_size);
282 size_t size() {
return buffer_size;}
288 float read_pos_float = 0.0f;
289 float read_increment = 0.0f;
322 T getValue(
int pos) {
return buffer[pos % buffer_size]; }
346 LOGD(
"handleReadWriteOverrun write_pos=%d read_pos_int=%d", write_pos,
351 for (
int j = read_increment * 2;
j < buffer_size;
j++) {
367 read_pos_float += read_increment;
369 if (read_pos_float > buffer_size) {
370 read_pos_float -= buffer_size;
372 LOGD(
"handleReadWriteOverrun -> read_pos pos=%d pos_float=%f", pos, read_pos_float);
378 LOGW(
"phase allign failed: maybe the buffer is too small")
394template <
typename T,
class BufferT>
409 buffer.resize(info.buffer_size);
411 buffer.setIncrement(info.pitch_shift);
416 size_t write(
const uint8_t *data,
size_t len)
override {
424 int sample_count = len /
sizeof(
T);
426 for (
int j = 0;
j < sample_count;
j += channels) {
428 for (
int ch = 0;
ch < channels;
ch++) {
429 value += p_in[
j +
ch];
436 LOGD(
"PitchShiftOutput %f -> %d", value, (
int)
out_value);
438 for (
int ch = 0;
ch < channels;
ch++) {
446 void end() { active =
false; }
452 Print *p_out =
nullptr;
456 T pitchShift(
T value) {