/* SampleOscControl.h */

#ifndef Included_SampleOscControl_h
#define Included_SampleOscControl_h

/* SampleOscControl module depends on */
/* MiscInfo.h */
/* Audit */
/* Debug */
/* Definitions */
/* FixedPoint */
/* 64BitMath */
/* FastFixedPoint */
/* ModulationSpecifier */
/* Multisampler */
/* EnvelopeState */
/* Envelope */
/* LFOGenerator */
/* LFOListSpecifier */
/* SampleConsts */
/* Memory */
/* OscillatorSpecifier */
/* FastModulation */
/* ErrorDaemon */
/* OscEffectGenerator */
/* EffectSpecList */
/* AccentStruct */

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

struct SampleTemplateRec;
typedef struct SampleTemplateRec SampleTemplateRec;

struct SampleStateRec;
typedef struct SampleStateRec SampleStateRec;

/* forwards */
struct OscillatorRec;
struct ArrayRec;
struct ErrorDaemonRec;
struct MainWindowRec;

/* get rid of all cached memory for state or template records */
void									FlushSampleOscControl(void);

/* perform one envelope update cycle, and set a new frequency for a state */
/* object.  used for portamento and modulation of frequency (vibrato) */
void									UpdateSampleEnvelopes(SampleStateRec* State,
												float NewFrequencyHertz);

/* dispose of the sample state record */
void									DisposeSampleState(SampleStateRec* State);

/* dispose of the sample information template */
void									DisposeSampleTemplate(SampleTemplateRec* Template);

/* create a new sample template */
SampleTemplateRec*		NewSampleTemplate(struct OscillatorRec* Oscillator,
												float EnvelopeTicksPerSecond, long SamplingRate,
												MyBoolean Stereo, MyBoolean TimeInterp, MyBoolean WaveInterp,
												struct ErrorDaemonRec* ErrorDaemon,
												struct MainWindowRec* MainWindow, float InverseVolume);

/* create a new sample state object. */
SampleStateRec*				NewSampleState(SampleTemplateRec* Template,
												float FreqForMultisampling, AccentParam* Accents, float Loudness,
												float HurryUp, long* PreOriginTimeOut, float StereoPosition,
												float InitialFrequency, float PitchDisplacementDepthLimit,
												float PitchDisplacementRateLimit,
												long PitchDisplacementStartPoint);

/* fix up pre-origin time for the sample state object */
void									FixUpSampleStatePreOrigin(SampleStateRec* State,
												long ActualPreOrigin);

/* send a key-up signal to one of the oscillators */
void									SampleKeyUpSustain1(SampleStateRec* State);
void									SampleKeyUpSustain2(SampleStateRec* State);
void									SampleKeyUpSustain3(SampleStateRec* State);

/* restart a sample oscillator.  this is used for tie continuations */
void									RestartSampleState(SampleStateRec* State,
												float NewFreqMultisampling, AccentParam* NewAccents,
												float NewLoudness, float NewHurryUp, MyBoolean RetriggerEnvelopes,
												float NewStereoPosition, float NewInitialFrequency,
												float PitchDisplacementDepthLimit,
												float PitchDisplacementRateLimit,
												long PitchDisplacementStartPoint);

/* generate a sequence of samples (called for each envelope clock) */
void									SampleGenSamples(SampleStateRec* State,
												long SampleCount, largefixedsigned* RawBuffer,
												largefixedsigned* PrivateWorkspace);

/* find out if the sample oscillator has finished */
MyBoolean							SampleIsItFinished(SampleStateRec* State);

#endif
