#ifndef __DELAYLINE_H__ #define __DELAYLINE_H__ #include template 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