/*         ______   ___    ___ 
 *        /\  _  \ /\_ \  /\_ \ 
 *        \ \ \L\ \\//\ \ \//\ \      __     __   _ __   ___ 
 *         \ \  __ \ \ \ \  \ \ \   /'__`\ /'_ `\/\`'__\/ __`\
 *          \ \ \/\ \ \_\ \_ \_\ \_/\  __//\ \L\ \ \ \//\ \L\ \
 *           \ \_\ \_\/\____\/\____\ \____\ \____ \ \_\\ \____/
 *            \/_/\/_/\/____/\/____/\/____/\/___L\ \/_/ \/___/
 *                                           /\____/
 *                                           \_/__/
 *
 *      Low-level functions for the AWE32 driver, by George Foot.
 *
 *      Information taken primarily from "AWE32/EMU8000 Programmer's Guide"
 *      (AEPG) by Dave Rossum. The AEPG is part of the AWE32 Developers'
 *      Information Pack (ADIP) from Creative Labs.
 *
 *      I/O port verification technique taken from "The Un-official Sound
 *      Blaster AWE32 Programming Guide" by Vince Vu a.k.a. Judge Dredd
 *
 *      See readme.txt for copyright information.
 */


#ifndef EMU8K_H
#define EMU8K_H


typedef struct envparms_t 
{
   int envvol,  envval,  dcysus,  atkhldv;
   int lfo1val, atkhld,  lfo2val, ip;
   int ifatn,   pefe,    fmmod,   tremfrq;
   int fm2frq2, dcysusv, ptrx,    psst;
   int csl,     ccca,    rootkey, ipbase;
   int ipscale, minkey,  maxkey,  minvel;
   int maxvel,  key,     vel,     exc;
   int keyMEH,  keyMED,  keyVEH,  keyVED;
   int filter,  atten,   smpmode, volrel;
   int modrel,  pan,     loopst,  reverb;
   int chorus,  volsust, modsust, pitch;
   int sampend;
} envparms_t;


#define sfgen_startAddrsOffset                  0
#define sfgen_endAddrsOffset                    1
#define sfgen_startloopAddrsOffset              2
#define sfgen_endloopAddrsOffset                3
#define sfgen_startAddrsCoarseOffset            4
#define sfgen_modLfoToPitch                     5
#define sfgen_vibLfoToPitch                     6
#define sfgen_modEnvToPitch                     7
#define sfgen_initialFilterFc                   8
#define sfgen_initialFilterQ                    9
#define sfgen_modLfoToFilterFc                  10
#define sfgen_modEnvToFilterFc                  11
#define sfgen_endAddrsCoarseOffset              12
#define sfgen_modLfoToVolume                    13
#define sfgen_chorusEffectsSend                 15
#define sfgen_reverbEffectsSend                 16
#define sfgen_pan                               17
#define sfgen_delayModLFO                       21
#define sfgen_freqModLFO                        22
#define sfgen_delayVibLFO                       23
#define sfgen_freqVibLFO                        24
#define sfgen_delayModEnv                       25
#define sfgen_attackModEnv                      26
#define sfgen_holdModEnv                        27
#define sfgen_decayModEnv                       28
#define sfgen_sustainModEnv                     29
#define sfgen_releaseModEnv                     30
#define sfgen_keynumToModEnvHold                31
#define sfgen_keynumToModEnvDecay               32
#define sfgen_delayVolEnv                       33
#define sfgen_attackVolEnv                      34
#define sfgen_holdVolEnv                        35
#define sfgen_decayVolEnv                       36
#define sfgen_sustainVolEnv                     37
#define sfgen_releaseVolEnv                     38
#define sfgen_keynumToVolEnvHold                39
#define sfgen_keynumToVolEnvDecay               40
#define sfgen_instrument                        41
#define sfgen_keyRange                          43
#define sfgen_velRange                          44
#define sfgen_startloopAddrsCoarseOffset        45
#define sfgen_keynum                            46
#define sfgen_velocity                          47
#define sfgen_initialAttenuation                48
#define sfgen_endloopAddrsCoarseOffset          50
#define sfgen_coarseTune                        51
#define sfgen_fineTune                          52
#define sfgen_sampleID                          53
#define sfgen_sampleModes                       54
#define sfgen_initialPitch                      55
#define sfgen_scaleTuning                       56
#define sfgen_exclusiveClass                    57
#define sfgen_overridingRootKey                 58

#define gfgen_startAddrs                        59
#define gfgen_startloopAddrs                    60
#define gfgen_endloopAddrs                      61
#define gfgen_endAddrs                          62

#define SOUNDFONT_NUM_GENERATORS                63

typedef int generators_t[SOUNDFONT_NUM_GENERATORS];

/*extern envparms_t env_default;*/
extern int _emu8k_baseport;
extern int _emu8k_numchannels;

void emu8k_init(void);
void emu8k_startsound(int channel,struct envparms_t *envparms);
void emu8k_releasesound(int channel,struct envparms_t *envparms);
void emu8k_terminatesound(int channel);
int  emu8k_detect(void);

void emu8k_modulate_atten (int channel, int atten);
void emu8k_modulate_ip (int channel, int ip);
void emu8k_modulate_pan (int channel, int pan);

envparms_t *emu8k_createenvelope(generators_t);
void emu8k_destroyenvelope(envparms_t *);

void emu8k_lock(void);

void *_lock_malloc(size_t size);                /* malloc and lock */


#endif

