You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

74 lines
1.5 KiB

#ifndef __DELAYLINE_H__
#define __DELAYLINE_H__
#include <cstddef>
template <size_t CAPACITY>
class DelayLine {
private:
float samples[CAPACITY] = {0};
size_t cursor;
public:
size_t size;
DelayLine(size_t size = CAPACITY) : size(size) {}
inline float get() {
while(cursor >= size) {
cursor -= size;
}
return samples[cursor];
}
inline float tick() {
++cursor;
while(cursor >= size) {
cursor -= size;
}
return samples[cursor];
}
inline float tick(float in) {
while(cursor >= size) {
cursor -= size;
}
samples[cursor++] = in;
if(cursor == size) {
cursor = 0;
}
return samples[cursor];
}
inline void inject(float in, size_t pos) {
size_t index = cursor + pos;
while(index >= size) {
index -= size;
}
samples[index] = in;
}
inline void inject(float* in, size_t num, size_t pos = 0) {
size_t index = cursor + pos;
while(index >= size) {
index -= size;
}
for(size_t i = 0; i < num; ++i) {
samples[index++] = *(in++);
if(index == size) {
index = 0;
}
}
}
inline float tap(size_t n) {
size_t index = cursor + n;
if(index < size) {
return samples[index];
} else {
return samples[index - size];
}
}
};
#endif