/* OscDelayLine.h */

#ifndef Included_OscDelayLine_h
#define Included_OscDelayLine_h

/* OscDelayLine module depends on */
/* MiscInfo.h */
/* Audit */
/* Debug */
/* Definitions */
/* Memory */
/* FixedPoint */
/* DelayEffectSpec */
/* EnvelopeState */
/* LFOGenerator */
/* FilterFirstOrderLowpass */
/* AccentStruct */

#include "FixedPoint.h"
#include "AccentStruct.h"

struct OscDelayLineRec;
typedef struct OscDelayLineRec OscDelayLineRec;

/* forwards */
struct DelayEffectRec;

/* flush cached oscillator delay line records */
void							FlushCachedOscDelayLineStuff(void);

/* create a new oscillator delay line processor */
OscDelayLineRec*	NewOscDelayLineProcessor(struct DelayEffectRec* Template,
										float EnvelopeTicksPerSecond, long SamplingRate,
										struct MainWindowRec* MainWindow, AccentParam* Accents,
										float HurryUp, float InitialFrequency, float FreqForMultisampling,
										long* PreOriginTimeOut);

/* fix up the origin time so that envelopes start at the proper times */
void							OscDelayLineProcessorFixEnvelopeOrigins(OscDelayLineRec* Delay,
										long ActualPreOriginTime);

/* dispose of the oscillator delay line processor */
void							DisposeOscDelayLineProcessor(OscDelayLineRec* Delay);

/* generate delays from envelopes */
void							OscDelayLineProcessorUpdateEnvelopes(OscDelayLineRec* Delay,
										float OscillatorFrequency);

/* apply oscillator delay processing to some stuff to stereo data */
void							ApplyOscDelayLineStereo(largefixedsigned* Data, long NumFrames,
										OscDelayLineRec* Delay);

/* apply oscillator delay processing to some stuff to mono data */
void							ApplyOscDelayLineMono(largefixedsigned* Data, long NumFrames,
										OscDelayLineRec* Delay);

/* create key-up impulse */
void							OscDelayKeyUpSustain1(OscDelayLineRec* Delay);
void							OscDelayKeyUpSustain2(OscDelayLineRec* Delay);
void							OscDelayKeyUpSustain3(OscDelayLineRec* Delay);

/* retrigger effect envelopes from the origin point */
void							OscDelayRetriggerEnvelopes(OscDelayLineRec* Delay,
										AccentParam* NewAccents, float NewHurryUp,
										float NewInitialFrequency, MyBoolean ActuallyRetrigger);

#endif
