#include "delay.h"

#include <stdlib.h>

void delay_clear(struct delay* d) {
  int i;
  int length=d->length;
  float* buffer=d->buffer;
  for(i=0;i<length;i++) {
    buffer[i]=0.0f;
  }
}

void delay_init(struct delay* d, int length) {
  d->length = length;
  d->buffer = malloc(length*sizeof(float));
  d->pointer = 0;
  delay_clear(d);
}

float delay_read(struct delay* d) {
  float* buffer=d->buffer;
  int pointer = d->pointer;
  float out = buffer[pointer];
  return out;
}

void delay_write(struct delay* d, float in) {
  float* buffer=d->buffer;
  int pointer = d->pointer;
  int length = d->length;
  buffer[pointer]=in;
  pointer++;
  if(pointer >= length) {
    pointer = 0;
  }
  d->pointer = pointer;
}

float delay_tick(struct delay* d, float in) {
  float* buffer=d->buffer;
  int pointer = d->pointer;
  int length = d->length;
  float out = buffer[pointer];
  buffer[pointer]=in;
  pointer++;
  if(pointer >= length) {
    pointer = 0;
  }
  d->pointer = pointer;
  return out;
}

void delay_finalize(struct delay* d) {
  d->length = 0;
  free(d->buffer);
  d->buffer = NULL;
}
