/*
 * sound/oss/awe_wave.c
 *
 * The low level driver for the AWE32/SB32/AWE64 wave table synth.
 *   version 0.4.4; Jan. 4, 2000
 *
 * Copyright (C) 1996-2000 Takashi Iwai
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

/*
 * Changelog:
 * Aug 18, 2003, Adam Belay <ambx1@neo.rr.com>
 * - detection code rewrite
 */

#include <linux/awe_voice.h>
#include <linux/config.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/string.h>
#include <linux/pnp.h>

#include "sound_config.h"

#include "awe_wave.h"
#include "awe_hw.h"

#ifdef AWE_HAS_GUS_COMPATIBILITY
#include "tuning.h"
#include <linux/ultrasound.h>
#endif

/*
 * debug message
 */

#ifdef AWE_DEBUG_ON
#define DEBUG(LVL,XXX)	{if (ctrls[AWE_MD_DEBUG_MODE] > LVL) { XXX; }}
#define ERRMSG(XXX)	{if (ctrls[AWE_MD_DEBUG_MODE]) { XXX; }}
#define FATALERR(XXX)	XXX
#else
#define DEBUG(LVL,XXX) /**/
#define ERRMSG(XXX)	XXX
#define FATALERR(XXX)	XXX
#endif

/*
 * bank and voice record
 */

typedef struct _sf_list sf_list;
typedef struct _awe_voice_list awe_voice_list;
typedef struct _awe_sample_list awe_sample_list;

/* soundfont record */
struct _sf_list {
	unsigned short sf_id;	/* id number */
	unsigned short type;	/* lock & shared flags */
	int num_info;		/* current info table index */
	int num_sample;		/* current sample table index */
	int mem_ptr;		/* current word byte pointer */
	awe_voice_list *infos, *last_infos;	/* instruments */
	awe_sample_list *samples, *last_samples;	/* samples */
#ifdef AWE_ALLOW_SAMPLE_SHARING
	sf_list *shared;	/* shared list */
	unsigned char name[AWE_PATCH_NAME_LEN];	/* sharing id */
#endif
	sf_list *next, *prev;
};

/* instrument list */
struct _awe_voice_list {
	awe_voice_info v;	/* instrument information */
	sf_list *holder;	/* parent sf_list of this record */
	unsigned char bank, instr;	/* preset number information */
	char type, disabled;	/* type=normal/mapped, disabled=boolean */
	awe_voice_list *next;	/* linked list with same sf_id */
	awe_voice_list *next_instr;	/* instrument list */
	awe_voice_list *next_bank;	/* hash table list */
};

/* voice list type */
#define V_ST_NORMAL	0
#define V_ST_MAPPED	1

/* sample list */
struct _awe_sample_list {
	awe_sample_info v;	/* sample information */
	sf_list *holder;	/* parent sf_list of this record */
	awe_sample_list *next;	/* linked list with same sf_id */
};

/* sample and information table */
static int current_sf_id;	/* current number of fonts */
static int locked_sf_id;	/* locked position */
static sf_list *sfhead, *sftail;	/* linked-lists */

#define awe_free_mem_ptr() (sftail ? sftail->mem_ptr : 0)
#define awe_free_info() (sftail ? sftail->num_info : 0)
#define awe_free_sample() (sftail ? sftail->num_sample : 0)

#define AWE_MAX_PRESETS		256
#define AWE_DEFAULT_PRESET	0
#define AWE_DEFAULT_BANK	0
#define AWE_DEFAULT_DRUM	0
#define AWE_DRUM_BANK		128

#define MAX_LAYERS	AWE_MAX_VOICES

/* preset table index */
static awe_voice_list *preset_table[AWE_MAX_PRESETS];

/*
 * voice table
 */

/* effects table */
typedef	struct FX_Rec { /* channel effects */
	unsigned char flags[AWE_FX_END];
	short val[AWE_FX_END];
} FX_Rec;


/* channel parameters */
typedef struct _awe_chan_info {
	int channel;		/* channel number */
	int bank;		/* current tone bank */
	int instr;		/* current program */
	int bender;		/* midi pitchbend (-8192 - 8192) */
	int bender_range;	/* midi bender range (x100) */
	int panning;		/* panning (0-127) */
	int main_vol;		/* channel volume (0-127) */
	int expression_vol;	/* midi expression (0-127) */
	int chan_press;		/* channel pressure */
	int sustained;		/* sustain status in MIDI */
	FX_Rec fx;		/* effects */
	FX_Rec fx_layer[MAX_LAYERS]; /* layer effects */
} awe_chan_info;

/* voice parameters */
typedef struct _voice_info {
	int state;
#define AWE_ST_OFF		(1<<0)	/* no sound */
#define AWE_ST_ON		(1<<1)	/* playing */
#define AWE_ST_STANDBY		(1<<2)	/* stand by for playing */
#define AWE_ST_SUSTAINED	(1<<3)	/* sustained */
#define AWE_ST_MARK		(1<<4)	/* marked for allocation */
#define AWE_ST_DRAM		(1<<5)	/* DRAM read/write */
#define AWE_ST_FM		(1<<6)	/* reserved for FM */
#define AWE_ST_RELEASED		(1<<7)	/* released */

	int ch;			/* midi channel */
	int key;		/* internal key for search */
	int layer;		/* layer number (for channel mode only) */
	int time;		/* allocated time */
	awe_chan_info	*cinfo;	/* channel info */

	int note;		/* midi key (0-127) */
	int velocity;		/* midi velocity (0-127) */
	int sostenuto;		/* sostenuto on/off */
	awe_voice_info *sample;	/* assigned voice */

	/* EMU8000 parameters */
	int apitch;		/* pitch parameter */
	int avol;		/* volume parameter */
	int apan;		/* panning parameter */
	int acutoff;		/* cutoff parameter */
	short aaux;		/* aux word */
} voice_info;

/* voice information */
static voice_info voices[AWE_MAX_VOICES];

#define IS_NO_SOUND(v)	(voices[v].state & (AWE_ST_OFF|AWE_ST_RELEASED|AWE_ST_STANDBY|AWE_ST_SUSTAINED))
#define IS_NO_EFFECT(v)	(voices[v].state != AWE_ST_ON)
#define IS_PLAYING(v)	(voices[v].state & (AWE_ST_ON|AWE_ST_SUSTAINED|AWE_ST_RELEASED))
#define IS_EMPTY(v)	(voices[v].state & (AWE_ST_OFF|AWE_ST_MARK|AWE_ST_DRAM|AWE_ST_FM))


/* MIDI channel effects information (for hw control) */
static awe_chan_info channels[AWE_MAX_CHANNELS];


/*
 * global variables
 */

#ifndef AWE_DEFAULT_BASE_ADDR
#define AWE_DEFAULT_BASE_ADDR	0	/* autodetect */
#endif

#ifndef AWE_DEFAULT_MEM_SIZE
#define AWE_DEFAULT_MEM_SIZE	-1	/* autodetect */
#endif

static int io = AWE_DEFAULT_BASE_ADDR; /* Emu8000 base address */
static int memsize = AWE_DEFAULT_MEM_SIZE; /* memory size in Kbytes */
#ifdef CONFIG_PNP
static int isapnp = -1;
#else
static int isapnp;
#endif

MODULE_AUTHOR("Takashi Iwai <iwai@ww.uni-erlangen.de>");
MODULE_DESCRIPTION("SB AWE32/64 WaveTable driver");
MODULE_LICENSE("GPL");

module_param(io, int, 0);
MODULE_PARM_DESC(io, "base i/o port of Emu8000");
module_param(memsize, int, 0);
MODULE_PARM_DESC(memsize, "onboard DRAM size in Kbytes");
module_param(isapnp, bool, 0);
MODULE_PARM_DESC(isapnp, "use ISAPnP detection");

/* DRAM start offset */
static int awe_mem_start = AWE_DRAM_OFFSET;

/* maximum channels for playing */
static int awe_max_voices = AWE_MAX_VOICES;

static int patch_opened;		/* sample already loaded? */

static char atten_relative = FALSE;
static short atten_offset;

static int awe_present = FALSE;		/* awe device present? */
static int awe_busy = FALSE;		/* awe device opened? */

static int my_dev = -1;

#define DEFAULT_DRUM_FLAGS	((1 << 9) | (1 << 25))
#define IS_DRUM_CHANNEL(c)	(drum_flags & (1 << (c)))
#define DRUM_CHANNEL_ON(c)	(drum_flags |= (1 << (c)))
#define DRUM_CHANNEL_OFF(c)	(drum_flags &= ~(1 << (c)))
static unsigned int drum_flags = DEFAULT_DRUM_FLAGS; /* channel flags */

static int playing_mode = AWE_PLAY_INDIRECT;
#define SINGLE_LAYER_MODE()	(playing_mode == AWE_PLAY_INDIRECT || playing_mode == AWE_PLAY_DIRECT)
#define MULTI_LAYER_MODE()	(playing_mode == AWE_PLAY_MULTI || playing_mode == AWE_PLAY_MULTI2)

static int current_alloc_time;  	/* voice allocation index for channel mode */

static struct synth_info awe_info = {
	"AWE32 Synth",		/* name */
	0,			/* device */
	SYNTH_TYPE_SAMPLE,	/* synth_type */
	SAMPLE_TYPE_AWE32,	/* synth_subtype */
	0,			/* perc_mode (obsolete) */
	AWE_MAX_VOICES,		/* nr_voices */
	0,			/* nr_drums (obsolete) */
	400			/* instr_bank_size */
};


static struct voice_alloc_info *voice_alloc;	/* set at initialization */


/*
 * function prototypes
 */

static int awe_request_region(void);
static void awe_release_region(void);

static void awe_reset_samples(void);
/* emu8000 chip i/o access */
static void setup_ports(int p1, int p2, int p3);
static void awe_poke(unsigned short cmd, unsigned short port, unsigned short data);
static void awe_poke_dw(unsigned short cmd, unsigned short port, unsigned int data);
static unsigned short awe_peek(unsigned short cmd, unsigned short port);
static unsigned int awe_peek_dw(unsigned short cmd, unsigned short port);
static void awe_wait(unsigned short delay);

/* initialize emu8000 chip */
static void awe_initialize(void);

/* set voice parameters */
static void awe_init_ctrl_parms(int init_all);
static void awe_init_voice_info(awe_voice_info *vp);
static void awe_init_voice_parm(awe_voice_parm *pp);
#ifdef AWE_HAS_GUS_COMPATIBILITY
static int freq_to_note(int freq);
static int calc_rate_offset(int Hz);
/*static int calc_parm_delay(int msec);*/
static int calc_parm_hold(int msec);
static int calc_parm_attack(int msec);
static int calc_parm_decay(int msec);
static int calc_parm_search(int msec, short *table);
#endif /* gus compat */

/* turn on/off note */
static void awe_note_on(int voice);
static void awe_note_off(int voice);
static void awe_terminate(int voice);
static void awe_exclusive_off(int voice);
static void awe_note_off_all(int do_sustain);

/* calculate voice parameters */
typedef void (*fx_affect_func)(int voice, int forced);
static void awe_set_pitch(int voice, int forced);
static void awe_set_voice_pitch(int voice, int forced);
static void awe_set_volume(int voice, int forced);
static void awe_set_voice_vol(int voice, int forced);
static void awe_set_pan(int voice, int forced);
static void awe_fx_fmmod(int voice, int forced);
static void awe_fx_tremfrq(int voice, int forced);
static void awe_fx_fm2frq2(int voice, int forced);
static void awe_fx_filterQ(int voice, int forced);
static void awe_calc_pitch(int voice);
#ifdef AWE_HAS_GUS_COMPATIBILITY
static void awe_calc_pitch_from_freq(int voice, int freq);
#endif
static void awe_calc_volume(int voice);
static void awe_update_volume(void);
static void awe_change_master_volume(short val);
static void awe_voice_init(int voice, int init_all);
static void awe_channel_init(int ch, int init_all);
static void awe_fx_init(int ch);
static void awe_send_effect(int voice, int layer, int type, int val);
static void awe_modwheel_change(int voice, int value);

/* sequencer interface */
static int awe_open(int dev, int mode);
static void awe_close(int dev);
static int awe_ioctl(int dev, unsigned int cmd, void __user * arg);
static int awe_kill_note(int dev, int voice, int note, int velocity);
static int awe_start_note(int dev, int v, int note_num, int volume);
static int awe_set_instr(int dev, int voice, int instr_no);
static int awe_set_instr_2(int dev, int voice, int instr_no);
static void awe_reset(int dev);
static void awe_hw_control(int dev, unsigned char *event);
static int awe_load_patch(int dev, int format, const char __user *addr,
			  int offs, int count, int pmgr_flag);
static void awe_aftertouch(int dev, int voice, int pressure);
static void awe_controller(int dev, int voice, int ctrl_num, int value);
static void awe_panning(int dev, int voice, int value);
static void awe_volume_method(int dev, int mode);
static void awe_bender(int dev, int voice, int value);
static int awe_alloc(int dev, int chn, int note, struct voice_alloc_info *alloc);
static void awe_setup_voice(int dev, int voice, int chn);

#define awe_key_pressure(dev,voice,key,press) awe_start_note(dev,voice,(key)+128,press)

/* hardware controls */
#ifdef AWE_HAS_GUS_COMPATIBILITY
static void awe_hw_gus_control(int dev, int cmd, unsigned char *event);
#endif
static void awe_hw_awe_control(int dev, int cmd, unsigned char *event);
static void awe_voice_change(int voice, fx_affect_func func);
static void awe_sostenuto_on(int voice, int forced);
static void awe_sustain_off(int voice, int forced);
static void awe_terminate_and_init(int voice, int forced);

/* voice search */
static int awe_search_key(int bank, int preset, int note);
static awe_voice_list *awe_search_instr(int bank, int preset, int note);
static int awe_search_multi_voices(awe_voice_list *rec, int note, int velocity, awe_voice_info **vlist);
static void awe_alloc_multi_voices(int ch, int note, int velocity, int key);
static void awe_alloc_one_voice(int voice, int note, int velocity);
static int awe_clear_voice(void);

/* load / remove patches */
static int awe_open_patch(awe_patch_info *patch, const char __user *addr, int count);
static int awe_close_patch(awe_patch_info *patch, const char __user *addr, int count);
static int awe_unload_patch(awe_patch_info *patch, const char __user *addr, int count);
static int awe_load_info(awe_patch_info *patch, const char __user *addr, int count);
static int awe_remove_info(awe_patch_info *patch, const char __user *addr, int count);
static int awe_load_data(awe_patch_info *patch, const char __user *addr, int count);
static int awe_replace_data(awe_patch_info *patch, const char __user *addr, int count);
static int awe_load_map(awe_patch_info *patch, const char __user *addr, int count);
#ifdef AWE_HAS_GUS_COMPATIBILITY
static int awe_load_guspatch(const char __user *addr, int offs, int size, int pmgr_flag);
#endif
/*static int awe_probe_info(awe_patch_info *patch, const char __user *addr, int count);*/
static int awe_probe_data(awe_patch_info *patch, const char __user *addr, int count);
static sf_list *check_patch_opened(int type, char *name);
static int awe_write_wave_data(const char __user *addr, int offset, awe_sample_list *sp, int channels);
static int awe_create_sf(int type, char *name);
static void awe_free_sf(sf_list *sf);
static void add_sf_info(sf_list *sf, awe_voice_list *rec);
static void add_sf_sample(sf_list *sf, awe_sample_list *smp);
static void purge_old_list(awe_voice_list *rec, awe_voice_list *next);
static void add_info_list(awe_voice_list *rec);
static void awe_remove_samples(int sf_id);
static void rebuild_preset_list(void);
static short awe_set_sample(awe_voice_list *rec);
static awe_sample_list *search_sample_index(sf_list *sf, int sample);

static int is_identical_holder(sf_list *sf1, sf_list *sf2);
#ifdef AWE_ALLOW_SAMPLE_SHARING
static int is_identical_name(unsigned char *name, sf_list *p);
static int is_shared_sf(unsigned char *name);
static int info_duplicated(sf_list *sf, awe_voice_list *rec);
#endif /* allow sharing */

/* lowlevel functions */
static void awe_init_audio(void);
static void awe_init_dma(void);
static void awe_init_array(void);
static void awe_send_array(unsigned short *data);
static void awe_tweak_voice(int voice);
static void awe_tweak(void);
static void awe_init_fm(void);
static int awe_open_dram_for_write(int offset, int channels);
static void awe_open_dram_for_check(void);
static void awe_close_dram(void);
/*static void awe_write_dram(unsigned short c);*/
static int awe_detect_base(int addr);
static int awe_detect(void);
static void awe_check_dram(void);
static int awe_load_chorus_fx(awe_patch_info *patch, const char __user *addr, int count);
static void awe_set_chorus_mode(int mode);
static void awe_update_chorus_mode(void);
static int awe_load_reverb_fx(awe_patch_info *patch, const char __user *addr, int count);
static void awe_set_reverb_mode(int mode);
static void awe_update_reverb_mode(void);
static void awe_equalizer(int bass, int treble);
static void awe_update_equalizer(void);

#ifdef CONFIG_AWE32_MIXER
static void attach_mixer(void);
static void unload_mixer(void);
#endif

#ifdef CONFIG_AWE32_MIDIEMU
static void attach_midiemu(void);
static void unload_midiemu(void);
#endif

#define limitvalue(x, a, b) if ((x) < (a)) (x) = (a); else if ((x) > (b)) (x) = (b)

/*
 * control parameters
 */


#ifdef AWE_USE_NEW_VOLUME_CALC
#define DEF_VOLUME_CALC	TRUE
#else
#define DEF_VOLUME_CALC	FALSE
#endif /* new volume */

#define DEF_ZERO_ATTEN		32	/* 12dB below */
#define DEF_MOD_SENSE		18
#define DEF_CHORUS_MODE		2
#define DEF_REVERB_MODE		4
#define DEF_BASS_LEVEL		5
#define DEF_TREBLE_LEVEL	9

static struct CtrlParmsDef {
	int value;
	int init_each_time;
	void (*update)(void);
} ctrl_parms[AWE_MD_END] = {
	{0,0, NULL}, {0,0, NULL}, /* <-- not used */
	{AWE_VERSION_NUMBER, FALSE, NULL},
	{TRUE, FALSE, NULL}, /* exclusive */
	{TRUE, FALSE, NULL}, /* realpan */
	{AWE_DEFAULT_BANK, FALSE, NULL}, /* gusbank */
	{FALSE, TRUE, NULL}, /* keep effect */
	{DEF_ZERO_ATTEN, FALSE, awe_update_volume}, /* zero_atten */
	{FALSE, FALSE, NULL}, /* chn_prior */
	{DEF_MOD_SENSE, FALSE, NULL}, /* modwheel sense */
	{AWE_DEFAULT_PRESET, FALSE, NULL}, /* def_preset */
	{AWE_DEFAULT_BANK, FALSE, NULL}, /* def_bank */
	{AWE_DEFAULT_DRUM, FALSE, NULL}, /* def_drum */
	{FALSE, FALSE, NULL}, /* toggle_drum_bank */
	{DEF_VOLUME_CALC, FALSE, awe_update_volume}, /* new_volume_calc */
	{DEF_CHORUS_MODE, FALSE, awe_update_chorus_mode}, /* chorus mode */
	{DEF_REVERB_MODE, FALSE, awe_update_reverb_mode}, /* reverb mode */
	{DEF_BASS_LEVEL, FALSE, awe_update_equalizer}, /* bass level */
	{DEF_TREBLE_LEVEL, FALSE, awe_update_equalizer}, /* treble level */
	{0, FALSE, NULL},	/* debug mode */
	{FALSE, FALSE, NULL}, /* pan exchange */
};

static int ctrls[AWE_MD_END];


/*
 * synth operation table
 */

static struct synth_operations awe_operations =
{
	.owner		= THIS_MODULE,
	.id		= "EMU8K",
	.info		= &awe_info,
	.midi_dev	= 0,
	.synth_type	= SYNTH_TYPE_SAMPLE,
	.synth_subtype	= SAMPLE_TYPE_AWE32,
	.open		= awe_open,
	.close		= awe_close,
	.ioctl		= awe_ioctl,
	.kill_note	= awe_kill_note,
	.start_note	= awe_start_note,
	.set_instr	= awe_set_instr_2,
	.reset		= awe_reset,
	.hw_control	= awe_hw_control,
	.load_patch	= awe_load_patch,
	.aftertouch	= awe_aftertouch,
	.controller	= awe_controller,
	.panning	= awe_panning,
	.volume_method	= awe_volume_method,
	.bender		= awe_bender,
	.alloc_voice	= awe_alloc,
	.setup_voice	= awe_setup_voice
};

static void free_tables(void)
{
	if (sftail) {
		sf_list *p, *prev;
		for (p = sftail; p; p = prev) {
			prev = p->prev;
			awe_free_sf(p);
		}
	}
	sfhead = sftail = NULL;
}

/*
 * clear sample tables 
 */

static void
awe_reset_samples(void)
{
	/* free all bank tables */
	memset(preset_table, 0, sizeof(preset_table));
	free_tables();

	current_sf_id = 0;
	locked_sf_id = 0;
	patch_opened = 0;
}


/*
 * EMU register access
 */

/* select a given AWE32 pointer */
static int awe_ports[5];
static int port_setuped = FALSE;
static int awe_cur_cmd = -1;
#define awe_set_cmd(cmd) \
if (awe_cur_cmd != cmd) { outw(cmd, awe_ports[Pointer]); awe_cur_cmd = cmd; }

/* write 16bit data */
static void
awe_poke(unsigned short cmd, unsigned short port, unsigned short data)
{
	awe_set_cmd(cmd);
	outw(data, awe_ports[port]);
}

/* write 32bit data */
static void
awe_poke_dw(unsigned short cmd, unsigned short port, unsigned int data)
{
	unsigned short addr = awe_ports[port];
	awe_set_cmd(cmd);
	outw(data, addr);		/* write lower 16 bits */
	outw(data >> 16, addr + 2);	/* write higher 16 bits */
}

/* read 16bit data */
static unsigned short
awe_peek(unsigned short cmd, unsigned short port)
{
	unsigned short k;
	awe_set_cmd(cmd);
	k = inw(awe_ports[port]);
	return k;
}

/* read 32bit data */
static unsigned int
awe_peek_dw(unsigned short cmd, unsigned short port)
{
	unsigned int k1, k2;
	unsigned short addr = awe_ports[port];
	awe_set_cmd(cmd);
	k1 = inw(addr);
	k2 = inw(addr + 2);
	k1 |= k2 << 16;
	return k1;
}

/* wait delay number of AWE32 44100Hz clocks */
#ifdef WAIT_BY_LOOP /* wait by loop -- that's not good.. */
static void
awe_wait(unsigned short delay)
{
	unsigned short clock, target;
	unsigned short port = awe_ports[AWE_WC_Port];
	int counter;
  
	/* sample counter */
	awe_set_cmd(AWE_WC_Cmd);
	clock = (unsigned short)inw(port);
	target = clock + delay;
	counter = 0;
	if (target < clock) {
		for (; (unsigned short)inw(port) > target; counter++)
			if (counter > 65536)
				break;
	}
	for (; (unsigned short)inw(port) < target; counter++)
		if (counter > 65536)
			break;
}
#else

static void awe_wait(unsigned short delay)
{
	current->state = TASK_INTERRUPTIBLE;
	schedule_timeout((HZ*(unsigned long)delay + 44099)/44100);
}
/*
static void awe_wait(unsigned short delay)
{
	udelay(((unsigned long)delay * 1000000L + 44099) / 44100);
}
*/
#endif /* wait by loop */

/* write a word data */
#define awe_write_dram(c)	awe_poke(AWE_SMLD, c)

/*
 * AWE32 voice parameters
 */

/* initialize voice_info record */
static void
awe_init_voice_info(awe_voice_info *vp)
{
	vp->sample = 0;
	vp->rate_offset = 0;

	vp->start = 0;
	vp->end = 0;
	vp->loopstart = 0;
	vp->loopend = 0;
	vp->mode = 0;
	vp->root = 60;
	vp->tune = 0;
	vp->low = 0;
	vp->high = 127;
	vp->vellow = 0;
	vp->velhigh = 127;

	vp->fixkey = -1;
	vp->fixvel = -1;
	vp->fixpan = -1;
	vp->pan = -1;

	vp->exclusiveClass = 0;
	vp->amplitude = 127;
	vp->attenuation = 0;
	vp->scaleTuning = 100;

	awe_init_voice_parm(&vp->parm);
}

/* initialize voice_parm record:
 * Env1/2: delay=0, attack=0, hold=0, sustain=0, decay=0, release=0.
 * Vibrato and Tremolo effects are zero.
 * Cutoff is maximum.
 * Chorus and Reverb effects are zero.
 */
static void
awe_init_voice_parm(awe_voice_parm *pp)
{
	pp->moddelay = 0x8000;
	pp->modatkhld = 0x7f7f;
	pp->moddcysus = 0x7f7f;
	pp->modrelease = 0x807f;
	pp->modkeyhold = 0;
	pp->modkeydecay = 0;

	pp->voldelay = 0x8000;
	pp->volatkhld = 0x7f7f;
	pp->voldcysus = 0x7f7f;
	pp->volrelease = 0x807f;
	pp->volkeyhold = 0;
	pp->volkeydecay = 0;

	pp->lfo1delay = 0x8000;
	pp->lfo2delay = 0x8000;
	pp->pefe = 0;

	pp->fmmod = 0;
	pp->tremfrq = 0;
	pp->fm2frq2 = 0;

	pp->cutoff = 0xff;
	pp->filterQ = 0;

	pp->chorus = 0;
	pp->reverb = 0;
}	


#ifdef AWE_HAS_GUS_COMPATIBILITY

/* convert frequency mHz to abstract cents (= midi key * 100) */
static int
freq_to_note(int mHz)
{
	/* abscents = log(mHz/8176) / log(2) * 1200 */
	unsigned int max_val = (unsigned int)0xffffffff / 10000;
	int i, times;
	unsigned int base;
	unsigned int freq;
	int note, tune;

	if (mHz == 0)
		return 0;
	if (mHz < 0)
		return 12799; /* maximum */

	freq = mHz;
	note = 0;
	for (base = 8176 * 2; freq >= base; base *= 2) {
		note += 12;
		if (note >= 128) /* over maximum */
			return 12799;
	}
	base /= 2;

	/* to avoid overflow... */
	times = 10000;
	while (freq > max_val) {
		max_val *= 10;
		times /= 10;
		base /= 10;
	}

	freq = freq * times / base;
	for (i = 0; i < 12; i++) {
		if (freq < semitone_tuning[i+1])
			break;
		note++;
	}

	tune = 0;
	freq = freq * 10000 / semitone_tuning[i];
	for (i = 0; i < 100; i++) {
		if (freq < cent_tuning[i+1])
			break;
		tune++;
	}

	return note * 100 + tune;
}


/* convert Hz to AWE32 rate offset:
 * sample pitch offset for the specified sample rate
 * rate=44100 is no offset, each 4096 is 1 octave (twice).
 * eg, when rate is 22050, this offset becomes -4096.
 */
static int
calc_rate_offset(int Hz)
{
	/* offset = log(Hz / 44100) / log(2) * 4096 */
	int freq, base, i;

	/* maybe smaller than max (44100Hz) */
	if (Hz <= 0 || Hz >= 44100) return 0;

	base = 0;
	for (freq = Hz * 2; freq < 44100; freq *= 2)
		base++;
	base *= 1200;

	freq = 44100 * 10000 / (freq/2);
	for (i = 0; i < 12; i++) {
		if (freq < semitone_tuning[i+1])
			break;
		base += 100;
	}
	freq = freq * 10000 / semitone_tuning[i];
	for (i = 0; i < 100; i++) {
		if (freq < cent_tuning[i+1])
			break;
		base++;
	}
	return -base * 4096 / 1200;
}


/*
 * convert envelope time parameter to AWE32 raw parameter
 */

/* attack & decay/release time table (msec) */
static short attack_time_tbl[128] = {
32767, 32767, 5989, 4235, 2994, 2518, 2117, 1780, 1497, 1373, 1259, 1154, 1058, 970, 890, 816,
707, 691, 662, 634, 607, 581, 557, 533, 510, 489, 468, 448, 429, 411, 393, 377,
361, 345, 331, 317, 303, 290, 278, 266, 255, 244, 234, 224, 214, 205, 196, 188,
180, 172, 165, 158, 151, 145, 139, 133, 127, 122, 117, 112, 107, 102, 98, 94,
90, 86, 82, 79, 75, 72, 69, 66, 63, 61, 58, 56, 53, 51, 49, 47,
45, 43, 41, 39, 37, 36, 34, 33, 31, 30, 29, 28, 26, 25, 24, 23,
22, 21, 20, 19, 19, 18, 17, 16, 16, 15, 15, 14, 13, 13, 12, 12,
11, 11, 10, 10, 10, 9, 9, 8, 8, 8, 8, 7, 7, 7, 6, 0,
};

static short decay_time_tbl[128] = {
32767, 32767, 22614, 15990, 11307, 9508, 7995, 6723, 5653, 5184, 4754, 4359, 3997, 3665, 3361, 3082,
2828, 2765, 2648, 2535, 2428, 2325, 2226, 2132, 2042, 1955, 1872, 1793, 1717, 1644, 1574, 1507,
1443, 1382, 1324, 1267, 1214, 1162, 1113, 1066, 978, 936, 897, 859, 822, 787, 754, 722,
691, 662, 634, 607, 581, 557, 533, 510, 489, 468, 448, 429, 411, 393, 377, 361,
345, 331, 317, 303, 290, 278, 266, 255, 244, 234, 224, 214, 205, 196, 188, 180,
172, 165, 158, 151, 145, 139, 133, 127, 122, 117, 112, 107, 102, 98, 94, 90,
86, 82, 79, 75, 72, 69, 66, 63, 61, 58, 56, 53, 51, 49, 47, 45,
43, 41, 39, 37, 36, 34, 33, 31, 30, 29, 28, 26, 25, 24, 23, 22,
};

#define calc_parm_delay(msec) (0x8000 - (msec) * 1000 / 725);

/* delay time = 0x8000 - msec/92 */
static int
calc_parm_hold(int msec)
{
	int val = (0x7f * 92 - msec) / 92;
	if (val < 1) val = 1;
	if (val > 127) val = 127;
	return val;
}

/* attack time: search from time table */
static int
calc_parm_attack(int msec)
{
	return calc_parm_search(msec, attack_time_tbl);
}

/* decay/release time: search from time table */
static int
calc_parm_decay(int msec)
{
	return calc_parm_search(msec, decay_time_tbl);
}

/* search an index for specified time from given time table */
static int
calc_parm_search(int msec, short *table)
{
	int left = 1, right = 127, mid;
	while (left < right) {
		mid = (left + right) / 2;
		if (msec < (int)table[mid])
			left = mid + 1;
		else
			right = mid;
	}
	return left;
}
#endif /* AWE_HAS_GUS_COMPATIBILITY */


/*
 * effects table
 */

/* set an effect value */
#define FX_FLAG_OFF	0
#define FX_FLAG_SET	1
#define FX_FLAG_ADD	2

#define FX_SET(rec,type,value) \
	((rec)->flags[type] = FX_FLAG_SET, (rec)->val[type] = (value))
#define FX_ADD(rec,type,value) \
	((rec)->flags[type] = FX_FLAG_ADD, (rec)->val[type] = (value))
#define FX_UNSET(rec,type) \
	((rec)->flags[type] = FX_FLAG_OFF, (rec)->val[type] = 0)

/* check the effect value is set */
#define FX_ON(rec,type)	((rec)->flags[type])

#define PARM_BYTE	0
#define PARM_WORD	1
#define PARM_SIGN	2

static struct PARM_DEFS {
	int type;	/* byte or word */
	int low, high;	/* value range */
	fx_affect_func realtime;	/* realtime paramater change */
} parm_defs[] = {
	{PARM_WORD, 0, 0x8000, NULL},	/* env1 delay */
	{PARM_BYTE, 1, 0x7f, NULL},	/* env1 attack */
	{PARM_BYTE, 0, 0x7e, NULL},	/* env1 hold */
	{PARM_BYTE, 1, 0x7f, NULL},	/* env1 decay */
	{PARM_BYTE, 1, 0x7f, NULL},	/* env1 release */
	{PARM_BYTE, 0, 0x7f, NULL},	/* env1 sustain */
	{PARM_BYTE, 0, 0xff, NULL},	/* env1 pitch */
	{PARM_BYTE, 0, 0xff, NULL},	/* env1 cutoff */

	{PARM_WORD, 0, 0x8000, NULL},	/* env2 delay */
	{PARM_BYTE, 1, 0x7f, NULL},	/* env2 attack */
	{PARM_BYTE, 0, 0x7e, NULL},	/* env2 hold */
	{PARM_BYTE, 1, 0x7f, NULL},	/* env2 decay */
	{PARM_BYTE, 1, 0x7f, NULL},	/* env2 release */
	{PARM_BYTE, 0, 0x7f, NULL},	/* env2 sustain */

	{PARM_WORD, 0, 0x8000, NULL},	/* lfo1 delay */
	{PARM_BYTE, 0, 0xff, awe_fx_tremfrq},	/* lfo1 freq */
	{PARM_SIGN, -128, 127, awe_fx_tremfrq},	/* lfo1 volume */
	{PARM_SIGN, -128, 127, awe_fx_fmmod},	/* lfo1 pitch */
	{PARM_BYTE, 0, 0xff, awe_fx_fmmod},	/* lfo1 cutoff */

	{PARM_WORD, 0, 0x8000, NULL},	/* lfo2 delay */
	{PARM_BYTE, 0, 0xff, awe_fx_fm2frq2},	/* lfo2 freq */
	{PARM_SIGN, -128, 127, awe_fx_fm2frq2},	/* lfo2 pitch */

	{PARM_WORD, 0, 0xffff, awe_set_voice_pitch},	/* initial pitch */
	{PARM_BYTE, 0, 0xff, NULL},	/* chorus */
	{PARM_BYTE, 0, 0xff, NULL},	/* reverb */
	{PARM_BYTE, 0, 0xff, awe_set_volume},	/* initial cutoff */
	{PARM_BYTE, 0, 15, awe_fx_filterQ},	/* initial resonance */

	{PARM_WORD, 0, 0xffff, NULL},	/* sample start */
	{PARM_WORD, 0, 0xffff, NULL},	/* loop start */
	{PARM_WORD, 0, 0xffff, NULL},	/* loop end */
	{PARM_WORD, 0, 0xffff, NULL},	/* coarse sample start */
	{PARM_WORD, 0, 0xffff, NULL},	/* coarse loop start */
	{PARM_WORD, 0, 0xffff, NULL},	/* coarse loop end */
	{PARM_BYTE, 0, 0xff, awe_set_volume},	/* initial attenuation */
};


static unsigned char
FX_BYTE(FX_Rec *rec, FX_Rec *lay, int type, unsigned char value)
{
	int effect = 0;
	int on = 0;
	if (lay && (on = FX_ON(lay, type)) != 0)
		effect = lay->val[type];
	if (!on && (on = FX_ON(rec, type)) != 0)
		effect = rec->val[type];
	if (on == FX_FLAG_ADD) {
		if (parm_defs[type].type == PARM_SIGN) {
			if (value > 0x7f)
				effect += (int)value - 0x100;
			else
				effect += (int)value;
		} else {
			effect += (int)value;
		}
	}
	if (on) {
		if (effect < parm_defs[type].low)
			effect = parm_defs[type].low;
		else if (effect > parm_defs[type].high)
			effect = parm_defs[type].high;
		return (unsigned char)effect;
	}
	return value;
}

/* get word effect value */
static unsigned short
FX_WORD(FX_Rec *rec, FX_Rec *lay, int type, unsigned short value)
{
	int effect = 0;
	int on = 0;
	if (lay && (on = FX_ON(lay, type)) != 0)
		effect = lay->val[type];
	if (!on && (on = FX_ON(rec, type)) != 0)
		effect = rec->val[type];
	if (on == FX_FLAG_ADD)
		effect += (int)value;
	if (on) {
		if (effect < parm_defs[type].low)
			effect = parm_defs[type].low;
		else if (effect > parm_defs[type].high)
			effect = parm_defs[type].high;
		return (unsigned short)effect;
	}
	return value;
}

/* get word (upper=type1/lower=type2) effect value */
static unsigned short
FX_COMB(FX_Rec *rec, FX_Rec *lay, int type1, int type2, unsigned short value)
{
	unsigned short tmp;
	tmp = FX_BYTE(rec, lay, type1, (unsigned char)(value >> 8));
	tmp <<= 8;
	tmp |= FX_BYTE(rec, lay, type2, (unsigned char)(value & 0xff));
	return tmp;
}

/* address offset */
static int
FX_OFFSET(FX_Rec *rec, FX_Rec *lay, int lo, int hi, int mode)
{
	int addr = 0;
	if (lay && FX_ON(lay, hi))
		addr = (short)lay->val[hi];
	else if (FX_ON(rec, hi))
		addr = (short)rec->val[hi];
	addr = addr << 15;
	if (lay && FX_ON(lay, lo))
		addr += (short)lay->val[lo];
	else if (FX_ON(rec, lo))
		addr += (short)rec->val[lo];
	if (!(mode & AWE_SAMPLE_8BITS))
		addr /= 2;
	return addr;
}


/*
 * turn on/off sample
 */

/* table for volume target calculation */
static unsigned short voltarget[16] = { 
   0xEAC0, 0XE0C8, 0XD740, 0XCE20, 0XC560, 0XBD08, 0XB500, 0XAD58,
   0XA5F8, 0X9EF0, 0X9830, 0X91C0, 0X8B90, 0X85A8, 0X8000, 0X7A90
};

static void
awe_note_on(int voice)
{
	unsigned int temp;
	int addr;
	int vtarget, ftarget, ptarget, pitch;
	awe_voice_info *vp;
	awe_voice_parm_block *parm;
	FX_Rec *fx = &voices[voice].cinfo->fx;
	FX_Rec *fx_lay = NULL;
	if (voices[voice].layer < MAX_LAYERS)
		fx_lay = &voices[voice].cinfo->fx_layer[voices[voice].layer];

	/* A voice sample must assigned before calling */
	if ((vp = voices[voice].sample) == NULL || vp->index == 0)
		return;

	parm = (awe_voice_parm_block*)&vp->parm;

	/* channel to be silent and idle */
	awe_poke(AWE_DCYSUSV(voice), 0x0080);
	awe_poke(AWE_VTFT(voice), 0x0000FFFF);
	awe_poke(AWE_CVCF(voice), 0x0000FFFF);
	awe_poke(AWE_PTRX(voice), 0);
	awe_poke(AWE_CPF(voice), 0);

	/* set pitch offset */
	awe_set_pitch(voice, TRUE);

	/* modulation & volume envelope */
	if (parm->modatk >= 0x80 && parm->moddelay >= 0x8000) {
		awe_poke(AWE_ENVVAL(voice), 0xBFFF);
		pitch = (parm->env1pit<<4) + voices[voice].apitch;
		if (pitch > 0xffff) pitch = 0xffff;
		/* calculate filter target */
		ftarget = parm->cutoff + parm->env1fc;
		limitvalue(ftarget, 0, 255);
		ftarget <<= 8;
	} else {
		awe_poke(AWE_ENVVAL(voice),
			 FX_WORD(fx, fx_lay, AWE_FX_ENV1_DELAY, parm->moddelay));
		ftarget = parm->cutoff;
		ftarget <<= 8;
		pitch = voices[voice].apitch;
	}

	/* calcualte pitch target */
	if (pitch != 0xffff) {
		ptarget = 1 << (pitch >> 12);
		if (pitch & 0x800) ptarget += (ptarget*0x102e)/0x2710;
		if (pitch & 0x400) ptarget += (ptarget*0x764)/0x2710;
		if (pitch & 0x200) ptarget += (ptarget*0x389)/0x2710;
		ptarget += (ptarget>>1);
		if (ptarget > 0xffff) ptarget = 0xffff;

	} else ptarget = 0xffff;
	if (parm->modatk >= 0x80)
		awe_poke(AWE_ATKHLD(voice),
			 FX_BYTE(fx, fx_lay, AWE_FX_ENV1_HOLD, parm->modhld) << 8 | 0x7f);
	else
		awe_poke(AWE_ATKHLD(voice),
			 FX_COMB(fx, fx_lay, AWE_FX_ENV1_HOLD, AWE_FX_ENV1_ATTACK,
				 vp->parm.modatkhld));
	awe_poke(AWE_DCYSUS(voice),
		 FX_COMB(fx, fx_lay, AWE_FX_ENV1_SUSTAIN, AWE_FX_ENV1_DECAY,
			  vp->parm.moddcysus));

	if (parm->volatk >= 0x80 && parm->voldelay >= 0x8000) {
		awe_poke(AWE_ENVVOL(voice), 0xBFFF);
		vtarget = voltarget[voices[voice].avol%0x10]>>(voices[voice].avol>>4);
	} else {
		awe_poke(AWE_ENVVOL(voice),
			 FX_WORD(fx, fx_lay, AWE_FX_ENV2_DELAY, vp->parm.voldelay));
		vtarget = 0;
	}
	if (parm->volatk >= 0x80)
		awe_poke(AWE_ATKHLDV(voice),
			 FX_BYTE(fx, fx_lay, AWE_FX_ENV2_HOLD, parm->volhld) << 8 | 0x7f);
	else
		awe_poke(AWE_ATKHLDV(voice),
			 FX_COMB(fx, fx_lay, AWE_FX_ENV2_HOLD, AWE_FX_ENV2_ATTACK,
			 vp->parm.volatkhld));
	/* decay/sustain parameter for volume envelope must be set at last */

	/* cutoff and volume */
	awe_set_volume(voice, TRUE);

	/* modulation envelope heights */
	awe_poke(AWE_PEFE(voice),
		 FX_COMB(fx, fx_lay, AWE_FX_ENV1_PITCH, AWE_FX_ENV1_CUTOFF,
			 vp->parm.pefe));

	/* lfo1/2 delay */
	awe_poke(AWE_LFO1VAL(voice),
		 FX_WORD(fx, fx_lay, AWE_FX_LFO1_DELAY, vp->parm.lfo1delay));
	awe_poke(AWE_LFO2VAL(voice),
		 FX_WORD(fx, fx_lay, AWE_FX_LFO2_DELAY, vp->parm.lfo2delay));

	/* lfo1 pitch & cutoff shift */
	awe_fx_fmmod(voice, TRUE);
	/* lfo1 volume & freq */
	awe_fx_tremfrq(voice, TRUE);
	/* lfo2 pitch & freq */
	awe_fx_fm2frq2(voice, TRUE);
	/* pan & loop start */
	awe_set_pan(voice, TRUE);

	/* chorus & loop end (chorus 8bit, MSB) */
	addr = vp->loopend - 1;
	addr += FX_OFFSET(fx, fx_lay, AWE_FX_LOOP_END,
			  AWE_FX_COARSE_LOOP_END, vp->mode);
	temp = FX_BYTE(fx, fx_lay, AWE_FX_CHORUS, vp->parm.chorus);
	temp = (temp <<24) | (unsigned int)addr;
	awe_poke_dw(AWE_CSL(voice), temp);
	DEBUG(4,printk("AWE32: [-- loopend=%x/%x]\n", vp->loopend, addr));

	/* Q & current address (Q 4bit value, MSB) */
	addr = vp->start - 1;
	addr += FX_OFFSET(fx, fx_lay, AWE_FX_SAMPLE_START,
			  AWE_FX_COARSE_SAMPLE_START, vp->mode);
	temp = FX_BYTE(fx, fx_lay, AWE_FX_FILTERQ, vp->parm.filterQ);
	temp = (temp<<28) | (unsigned int)addr;
	awe_poke_dw(AWE_CCCA(voice), temp);
	DEBUG(4,printk("AWE32: [-- startaddr=%x/%x]\n", vp->start, addr));

	/* clear unknown registers */
	awe_poke_dw(AWE_00A0(voice), 0);
	awe_poke_dw(AWE_0080(voice), 0);

	/* reset volume */
	awe_poke_dw(AWE_VTFT(voice), (vtarget<<16)|ftarget);
	awe_poke_dw(AWE_CVCF(voice), (vtarget<<16)|ftarget);

	/* set reverb */
	temp = FX_BYTE(fx, fx_lay, AWE_FX_REVERB, vp->parm.reverb);
	temp = (temp << 8) | (ptarget << 16) | voices[voice].aaux;
	awe_poke_dw(AWE_PTRX(voice), temp);
	awe_poke_dw(AWE_CPF(voice), ptarget << 16);
	/* turn on envelope */
	awe_poke(AWE_DCYSUSV(voice),
		 FX_COMB(fx, fx_lay, AWE_FX_ENV2_SUSTAIN, AWE_FX_ENV2_DECAY,
			  vp->parm.voldcysus));

	voices[voice].state = AWE_ST_ON;

	/* clear voice position for the next note on this channel */
	if (SINGLE_LAYER_MODE()) {
		FX_UNSET(fx, AWE_FX_SAMPLE_START);
		FX_UNSET(fx, AWE_FX_COARSE_SAMPLE_START);
	}
}


/* turn off the voice */
static void
awe_note_off(int voice)
{
	awe_voice_info *vp;
	unsigned short tmp;
	FX_Rec *fx = &voices[voice].cinfo->fx;
	FX_Rec *fx_lay = NULL;
	if (voices[voice].layer < MAX_LAYERS)
		fx_lay = &voices[voice].cinfo->fx_layer[voices[voice].layer];

	if ((vp = voices[voice].sample) == NULL) {
		voices[voice].state = AWE_ST_OFF;
		return;
	}

	tmp = 0x8000 | FX_BYTE(fx, fx_lay, AWE_FX_ENV1_RELEASE,
			       (unsigned char)vp->parm.modrelease);
	awe_poke(AWE_DCYSUS(voice), tmp);
	tmp = 0x8000 | FX_BYTE(fx, fx_lay, AWE_FX_ENV2_RELEASE,
			       (unsigned char)vp->parm.volrelease);
	awe_poke(AWE_DCYSUSV(voice), tmp);
	voices[voice].state = AWE_ST_RELEASED;
}

/* force to terminate the voice (no releasing echo) */
static void
awe_terminate(int voice)
{
	awe_poke(AWE_DCYSUSV(voice), 0x807F);
	awe_tweak_voice(voice);
	voices[voice].state = AWE_ST_OFF;
}

/* turn off other voices with the same exclusive class (for drums) */
static void
awe_exclusive_off(int voice)
{
	int i, exclass;

	if (voices[voice].sample == NULL)
		return;
	if ((exclass = voices[voice].sample->exclusiveClass) == 0)
		return;	/* not exclusive */

	/* turn off voices with the same class */
	for (i = 0; i < awe_max_voices; i++) {
		if (i != voice && IS_PLAYING(i) &&
		    voices[i].sample && voices[i].ch == voices[voice].ch &&
		    voices[i].sample->exclusiveClass == exclass) {
			DEBUG(4,printk("AWE32: [exoff(%d)]\n", i));
			awe_terminate(i);
			awe_voice_init(i, TRUE);
		}
	}
}


/*
 * change the parameters of an audible voice
 */

/* change pitch */
static void
awe_set_pitch(int voice, int forced)
{
	if (IS_NO_EFFECT(voice) && !forced) return;
	awe_poke(AWE_IP(voice), voices[voice].apitch);
	DEBUG(3,printk("AWE32: [-- pitch=%x]\n", voices[voice].apitch));
}

/* calculate & change pitch */
static void
awe_set_voice_pitch(int voice, int forced)
{
	awe_calc_pitch(voice);
	awe_set_pitch(voice, forced);
}

/* change volume & cutoff */
static void
awe_set_volume(int voice, int forced)
{
	awe_voice_info *vp;
	unsigned short tmp2;
	FX_Rec *fx = &voices[voice].cinfo->fx;
	FX_Rec *fx_lay = NULL;
	if (voices[voice].layer < MAX_LAYERS)
		fx_lay = &voices[voice].cinfo->fx_layer[voices[voice].layer];

	if (!IS_PLAYING(voice) && !forced) return;
	if ((vp = voices[voice].sample) == NULL || vp->index == 0)
		return;

	tmp2 = FX_BYTE(fx, fx_lay, AWE_FX_CUTOFF,
		       (unsigned char)voices[voice].acutoff);
	tmp2 = (tmp2 << 8);
	tmp2 |= FX_BYTE(fx, fx_lay, AWE_FX_ATTEN,
			(unsigned char)voices[voice].avol);
	awe_poke(AWE_IFATN(voice), tmp2);
}

/* calculate & change volume */
static void
awe_set_voice_vol(int voice, int forced)
{
	if (IS_EMPTY(voice))
		return;
	awe_calc_volume(voice);
	awe_set_volume(voice, forced);
}


/* change pan; this could make a click noise.. */
static void
awe_set_pan(int voice, int forced)
{
	unsigned int temp;
	int addr;
	awe_voice_info *vp;
	FX_Rec *fx = &voices[voice].cinfo->fx;
	FX_Rec *fx_lay = NULL;
	if (voices[voice].layer < MAX_LAYERS)
		fx_lay = &voices[voice].cinfo->fx_layer[voices[voice].layer];

	if (IS_NO_EFFECT(voice) && !forced) return;
	if ((vp = voices[voice].sample) == NULL || vp->index == 0)
		return;

	/* pan & loop start (pan 8bit, MSB, 0:right, 0xff:left) */
	if (vp->fixpan > 0)	/* 0-127 */
		temp = 255 - (int)vp->fixpan * 2;
	else {
		int pos = 0;
		if (vp->pan >= 0) /* 0-127 */
			pos = (int)vp->pan * 2 - 128;
		pos += voices[voice].cinfo->panning; /* -128 - 127 */
		temp = 127 - pos;
	}
	limitvalue(temp, 0, 255);
	if (ctrls[AWE_MD_PAN_EXCHANGE]) {
		temp = 255 - temp;
	}
	if (forced || temp != voices[voice].apan) {
		voices[voice].apan = temp;
		if (temp == 0)
			voices[voice].aaux = 0xff;
		else
			voices[voice].aaux = (-temp) & 0xff;
		addr = vp->loopstart - 1;
		addr += FX_OFFSET(fx, fx_lay, AWE_FX_LOOP_START,
				  AWE_FX_COARSE_LOOP_START, vp->mode);
		temp = (temp<<24) | (unsigned int)addr;
		awe_poke_dw(AWE_PSST(voice), temp);
		DEBUG(4,printk("AWE32: [-- loopstart=%x/%x]\n", vp->loopstart, addr));
	}
}

/* effects change during playing */
static void
awe_fx_fmmod(int voice, int forced)
{
	awe_voice_info *vp;
	FX_Rec *fx = &voices[voice].cinfo->fx;
	FX_Rec *fx_lay = NULL;
	if (voices[voice].layer < MAX_LAYERS)
		fx_lay = &voices[voice].cinfo->fx_layer[voices[voice].layer];

	if (IS_NO_EFFECT(voice) && !forced) return;
	if ((vp = voices[voice].sample) == NULL || vp->index == 0)
		return;
	awe_poke(AWE_FMMOD(voice),
		 FX_COMB(fx, fx_lay, AWE_FX_LFO1_PITCH, AWE_FX_LFO1_CUTOFF,
			 vp->parm.fmmod));
}

/* set tremolo (lfo1) volume & frequency */
static void
awe_fx_tremfrq(int voice, int forced)
{
	awe_voice_info *vp;
	FX_Rec *fx = &voices[voice].cinfo->fx;
	FX_Rec *fx_lay = NULL;
	if (voices[voice].layer < MAX_LAYERS)
		fx_lay = &voices[voice].cinfo->fx_layer[voices[voice].layer];

	if (IS_NO_EFFECT(voice) && !forced) return;
	if ((vp = voices[voice].sample) == NULL || vp->index == 0)
		return;
	awe_poke(AWE_TREMFRQ(voice),
		 FX_COMB(fx, fx_lay, AWE_FX_LFO1_VOLUME, AWE_FX_LFO1_FREQ,
			 vp->parm.tremfrq));
}

/* set lfo2 pitch & frequency */
static void
awe_fx_fm2frq2(int voice, int forced)
{
	awe_voice_info *vp;
	FX_Rec *fx = &voices[voice].cinfo->fx;
	FX_Rec *fx_lay = NULL;
	if (voices[voice].layer < MAX_LAYERS)
		fx_lay = &voices[voice].cinfo->fx_layer[voices[voice].layer];

	if (IS_NO_EFFECT(voice) && !forced) return;
	if ((vp = voices[voice].sample) == NULL || vp->index == 0)
		return;
	awe_poke(AWE_FM2FRQ2(voice),
		 FX_COMB(fx, fx_lay, AWE_FX_LFO2_PITCH, AWE_FX_LFO2_FREQ,
			 vp->parm.fm2frq2));
}


/* Q & current address (Q 4bit value, MSB) */
static void
awe_fx_filterQ(int voice, int forced)
{
	unsigned int addr;
	awe_voice_info *vp;
	FX_Rec *fx = &voices[voice].cinfo->fx;
	FX_Rec *fx_lay = NULL;
	if (voices[voice].layer < MAX_LAYERS)
		fx_lay = &voices[voice].cinfo->fx_layer[voices[voice].layer];

	if (IS_NO_EFFECT(voice) && !forced) return;
	if ((vp = voices[voice].sample) == NULL || vp->index == 0)
		return;

	addr = awe_peek_dw(AWE_CCCA(voice)) & 0xffffff;
	addr |= (FX_BYTE(fx, fx_lay, AWE_FX_FILTERQ, vp->parm.filterQ) << 28);
	awe_poke_dw(AWE_CCCA(voice), addr);
}

/*
 * calculate pitch offset
 *
 * 0xE000 is no pitch offset at 44100Hz sample.
 * Every 4096 is one octave.
 */

static void
awe_calc_pitch(int voice)
{
	voice_info *vp = &voices[voice];
	awe_voice_info *ap;
	awe_chan_info *cp = voices[voice].cinfo;
	int offset;

	/* search voice information */
	if ((ap = vp->sample) == NULL)
			return;
	if (ap->index == 0) {
		DEBUG(3,printk("AWE32: set sample (%d)\n", ap->sample));
		if (awe_set_sample((awe_voice_list*)ap) == 0)
			return;
	}

	/* calculate offset */
	if (ap->fixkey >= 0) {
		DEBUG(3,printk("AWE32: p-> fixkey(%d) tune(%d)\n", ap->fixkey, ap->tune));
		offset = (ap->fixkey - ap->root) * 4096 / 12;
	} else {
		DEBUG(3,printk("AWE32: p(%d)-> root(%d) tune(%d)\n", vp->note, ap->root, ap->tune));
		offset = (vp->note - ap->root) * 4096 / 12;
		DEBUG(4,printk("AWE32: p-> ofs=%d\n", offset));
	}
	offset = (offset * ap->scaleTuning) / 100;
	DEBUG(4,printk("AWE32: p-> scale* ofs=%d\n", offset));
	offset += ap->tune * 4096 / 1200;
	DEBUG(4,printk("AWE32: p-> tune+ ofs=%d\n", offset));
	if (cp->bender != 0) {
		DEBUG(3,printk("AWE32: p-> bend(%d) %d\n", voice, cp->bender));
		/* (819200: 1 semitone) ==> (4096: 12 semitones) */
		offset += cp->bender * cp->bender_range / 2400;
	}

	/* add initial pitch correction */
	if (FX_ON(&cp->fx_layer[vp->layer], AWE_FX_INIT_PITCH))
		offset += cp->fx_layer[vp->layer].val[AWE_FX_INIT_PITCH];
	else if (FX_ON(&cp->fx, AWE_FX_INIT_PITCH))
		offset += cp->fx.val[AWE_FX_INIT_PITCH];

	/* 0xe000: root pitch */
	vp->apitch = 0xe000 + ap->rate_offset + offset;
	DEBUG(4,printk("AWE32: p-> sum aofs=%x, rate_ofs=%d\n", vp->apitch, ap->rate_offset));
	if (vp->apitch > 0xffff)
		vp->apitch = 0xffff;
	if (vp->apitch < 0)
		vp->apitch = 0;
}


#ifdef AWE_HAS_GUS_COMPATIBILITY
/* calculate MIDI key and semitone from the specified frequency */
static void
awe_calc_pitch_from_freq(int voice, int freq)
{
	voice_info *vp = &voices[voice];
	awe_voice_info *ap;
	FX_Rec *fx = &voices[voice].cinfo->fx;
	FX_Rec *fx_lay = NULL;
	int offset;
	int note;

	if (voices[voice].layer < MAX_LAYERS)
		fx_lay = &voices[voice].cinfo->fx_layer[voices[voice].layer];

	/* search voice information */
	if ((ap = vp->sample) == NULL)
		return;
	if (ap->index == 0) {
		DEBUG(3,printk("AWE32: set sample (%d)\n", ap->sample));
		if (awe_set_sample((awe_voice_list*)ap) == 0)
			return;
	}
	note = freq_to_note(freq);
	offset = (note - ap->root * 100 + ap->tune) * 4096 / 1200;
	offset = (offset * ap->scaleTuning) / 100;
	if (fx_lay && FX_ON(fx_lay, AWE_FX_INIT_PITCH))
		offset += fx_lay->val[AWE_FX_INIT_PITCH];
	else if (FX_ON(fx, AWE_FX_INIT_PITCH))
		offset += fx->val[AWE_FX_INIT_PITCH];
	vp->apitch = 0xe000 + ap->rate_offset + offset;
	if (vp->apitch > 0xffff)
		vp->apitch = 0xffff;
	if (vp->apitch < 0)
		vp->apitch = 0;
}
#endif /* AWE_HAS_GUS_COMPATIBILITY */


/*
 * calculate volume attenuation
 *
 * Voice volume is controlled by volume attenuation parameter.
 * So volume becomes maximum when avol is 0 (no attenuation), and
 * minimum when 255 (-96dB or silence).
 */

static int vol_table[128] = {
	255,111,95,86,79,74,70,66,63,61,58,56,54,52,50,49,
	47,46,45,43,42,41,40,39,38,37,36,35,34,34,33,32,
	31,31,30,29,29,28,27,27,26,26,25,24,24,23,23,22,
	22,21,21,21,20,20,19,19,18,18,18,17,17,16,16,16,
	15,15,15,14,14,14,13,13,13,12,12,12,11,11,11,10,
	10,10,10,9,9,9,8,8,8,8,7,7,7,7,6,6,
	6,6,5,5,5,5,5,4,4,4,4,3,3,3,3,3,
	2,2,2,2,2,1,1,1,1,1,0,0,0,0,0,0,
};

/* tables for volume->attenuation calculation */
static unsigned char voltab1[128] = {
   0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
   0x63, 0x2b, 0x29, 0x28, 0x27, 0x26, 0x25, 0x24, 0x23, 0x22,
   0x21, 0x20, 0x1f, 0x1e, 0x1e, 0x1d, 0x1c, 0x1b, 0x1b, 0x1a,
   0x19, 0x19, 0x18, 0x17, 0x17, 0x16, 0x16, 0x15, 0x15, 0x14,
   0x14, 0x13, 0x13, 0x13, 0x12, 0x12, 0x11, 0x11, 0x11, 0x10,
   0x10, 0x10, 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x0e, 0x0d,
   0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b,
   0x0b, 0x0a, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09,
   0x08, 0x08, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x06,
   0x06, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04,
   0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02,
   0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01,
   0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

static unsigned char voltab2[128] = {
   0x32, 0x31, 0x30, 0x2f, 0x2e, 0x2d, 0x2c, 0x2b, 0x2a, 0x2a,
   0x29, 0x28, 0x27, 0x26, 0x25, 0x24, 0x24, 0x23, 0x22, 0x21,
   0x21, 0x20, 0x1f, 0x1e, 0x1e, 0x1d, 0x1c, 0x1c, 0x1b, 0x1a,
   0x1a, 0x19, 0x19, 0x18, 0x18, 0x17, 0x16, 0x16, 0x15, 0x15,
   0x14, 0x14, 0x13, 0x13, 0x13, 0x12, 0x12, 0x11, 0x11, 0x10,
   0x10, 0x10, 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x0d, 0x0d,
   0x0d, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a,
   0x0a, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,
   0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06,
   0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
   0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03,
   0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01,
   0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00
};

static unsigned char expressiontab[128] = {
   0x7f, 0x6c, 0x62, 0x5a, 0x54, 0x50, 0x4b, 0x48, 0x45, 0x42,
   0x40, 0x3d, 0x3b, 0x39, 0x38, 0x36, 0x34, 0x33, 0x31, 0x30,
   0x2f, 0x2d, 0x2c, 0x2b, 0x2a, 0x29, 0x28, 0x27, 0x26, 0x25,
   0x24, 0x24, 0x23, 0x22, 0x21, 0x21, 0x20, 0x1f, 0x1e, 0x1e,
   0x1d, 0x1d, 0x1c, 0x1b, 0x1b, 0x1a, 0x1a, 0x19, 0x18, 0x18,
   0x17, 0x17, 0x16, 0x16, 0x15, 0x15, 0x15, 0x14, 0x14, 0x13,
   0x13, 0x12, 0x12, 0x11, 0x11, 0x11, 0x10, 0x10, 0x0f, 0x0f,
   0x0f, 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c,
   0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x09,
   0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06,
   0x06, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03,
   0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01,
   0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

static void
awe_calc_volume(int voice)
{
	voice_info *vp = &voices[voice];
	awe_voice_info *ap;
	awe_chan_info *cp = voices[voice].cinfo;
	int vol;

	/* search voice information */
	if ((ap = vp->sample) == NULL)
		return;

	ap = vp->sample;
	if (ap->index == 0) {
		DEBUG(3,printk("AWE32: set sample (%d)\n", ap->sample));
		if (awe_set_sample((awe_voice_list*)ap) == 0)
			return;
	}
	
	if (ctrls[AWE_MD_NEW_VOLUME_CALC]) {
		int main_vol = cp->main_vol * ap->amplitude / 127;
		limitvalue(vp->velocity, 0, 127);
		limitvalue(main_vol, 0, 127);
		limitvalue(cp->expression_vol, 0, 127);

		vol = voltab1[main_vol] + voltab2[vp->velocity];
		vol = (vol * 8) / 3;
		vol += ap->attenuation;
		if (cp->expression_vol < 127)
			vol += ((0x100 - vol) * expressiontab[cp->expression_vol])/128;
		vol += atten_offset;
		if (atten_relative)
			vol += ctrls[AWE_MD_ZERO_ATTEN];
		limitvalue(vol, 0, 255);
		vp->avol = vol;
		
	} else {
		/* 0 - 127 */
		vol = (vp->velocity * cp->main_vol * cp->expression_vol) / (127*127);
		vol = vol * ap->amplitude / 127;

		if (vol < 0) vol = 0;
		if (vol > 127) vol = 127;

		/* calc to attenuation */
		vol = vol_table[vol];
		vol += (int)ap->attenuation;
		vol += atten_offset;
		if (atten_relative)
			vol += ctrls[AWE_MD_ZERO_ATTEN];
		if (vol > 255) vol = 255;

		vp->avol = vol;
	}
	if (cp->bank !=  AWE_DRUM_BANK && ((awe_voice_parm_block*)(&ap->parm))->volatk < 0x7d) {
		int atten;
		if (vp->velocity < 70) atten = 70;
		else atten = vp->velocity;
		vp->acutoff = (atten * ap->parm.cutoff + 0xa0) >> 7;
	} else {
		vp->acutoff = ap->parm.cutoff;
	}
	DEBUG(3,printk("AWE32: [-- voice(%d) vol=%x]\n", voice, vol));
}

/* change master volume */
static void
awe_change_master_volume(short val)
{
	limitvalue(val, 0, 127);
	atten_offset = vol_table[val];
	atten_relative = TRUE;
	awe_update_volume();
}

/* update volumes of all available channels */
static void awe_update_volume(void)
{
	int i;
	for (i = 0; i < awe_max_voices; i++)
		awe_set_voice_vol(i, TRUE);
}

/* set sostenuto on */
static void awe_sostenuto_on(int voice, int forced)
{
	if (IS_NO_EFFECT(voice) && !forced) return;
	voices[voice].sostenuto = 127;
}


/* drop sustain */
static void awe_sustain_off(int voice, int forced)
{
	if (voices[voice].state == AWE_ST_SUSTAINED) {
		awe_note_off(voice);
		awe_fx_init(voices[voice].ch);
		awe_voice_init(voice, FALSE);
	}
}


/* terminate and initialize voice */
static void awe_terminate_and_init(int voice, int forced)
{
	awe_terminate(voice);
	awe_fx_init(voices[voice].ch);
	awe_voice_init(voice, TRUE);
}


/*
 * synth operation routines
 */

#define AWE_VOICE_KEY(v)	(0x8000 | (v))
#define AWE_CHAN_KEY(c,n)	(((c) << 8) | ((n) + 1))
#define KEY_CHAN_MATCH(key,c)	(((key) >> 8) == (c))

/* initialize the voice */
static void
awe_voice_init(int voice, int init_all)
{
	voice_info *vp = &voices[voice];

	/* reset voice search key */
	if (playing_mode == AWE_PLAY_DIRECT)
		vp->key = AWE_VOICE_KEY(voice);
	else
		vp->key = 0;

	/* clear voice mapping */
	voice_alloc->map[voice] = 0;

	/* touch the timing flag */
	vp->time = current_alloc_time;

	/* initialize other parameters if necessary */
	if (init_all) {
		vp->note = -1;
		vp->velocity = 0;
		vp->sostenuto = 0;

		vp->sample = NULL;
		vp->cinfo = &channels[voice];
		vp->ch = voice;
		vp->state = AWE_ST_OFF;

		/* emu8000 parameters */
		vp->apitch = 0;
		vp->avol = 255;
		vp->apan = -1;
	}
}

/* clear effects */
static void awe_fx_init(int ch)
{
	if (SINGLE_LAYER_MODE() && !ctrls[AWE_MD_KEEP_EFFECT]) {
		memset(&channels[ch].fx, 0, sizeof(channels[ch].fx));
		memset(&channels[ch].fx_layer, 0, sizeof(&channels[ch].fx_layer));
	}
}

/* initialize channel info */
static void awe_channel_init(int ch, int init_all)
{
	awe_chan_info *cp = &channels[ch];
	cp->channel = ch;
	if (init_all) {
		cp->panning = 0; /* zero center */
		cp->bender_range = 200; /* sense * 100 */
		cp->main_vol = 127;
		if (MULTI_LAYER_MODE() && IS_DRUM_CHANNEL(ch)) {
			cp->instr = ctrls[AWE_MD_DEF_DRUM];
			cp->bank = AWE_DRUM_BANK;
		} else {
			cp->instr = ctrls[AWE_MD_DEF_PRESET];
			cp->bank = ctrls[AWE_MD_DEF_BANK];
		}
	}

	cp->bender = 0; /* zero tune skew */
	cp->expression_vol = 127;
	cp->chan_press = 0;
	cp->sustained = 0;

	if (! ctrls[AWE_MD_KEEP_EFFECT]) {
		memset(&cp->fx, 0, sizeof(cp->fx));
		memset(&cp->fx_layer, 0, sizeof(cp->fx_layer));
	}
}


/* change the voice parameters; voice = channel */
static void awe_voice_change(int voice, fx_affect_func func)
{
	int i; 
	switch (playing_mode) {
	case AWE_PLAY_DIRECT:
		func(voice, FALSE);
		break;
	case AWE_PLAY_INDIRECT:
		for (i = 0; i < awe_max_voices; i++)
			if (voices[i].key == AWE_VOICE_KEY(voice))
				func(i, FALSE);
		break;
	default:
		for (i = 0; i < awe_max_voices; i++)
			if (KEY_CHAN_MATCH(voices[i].key, voice))
				func(i, FALSE);
		break;
	}
}


/*
 * device open / close
 */

/* open device:
 *   reset status of all voices, and clear sample position flag
 */
static int
awe_open(int dev, int mode)
{
	if (awe_busy)
		return -EBUSY;

	awe_busy = TRUE;

	/* set default mode */
	awe_init_ctrl_parms(FALSE);
	atten_relative = TRUE;
	atten_offset = 0;
	drum_flags = DEFAULT_DRUM_FLAGS;
	playing_mode = AWE_PLAY_INDIRECT;

	/* reset voices & channels */
	awe_reset(dev);

	patch_opened = 0;

	return 0;
}


/* close device:
 *   reset all voices again (terminate sounds)
 */
static void
awe_close(int dev)
{
	awe_reset(dev);
	awe_busy = FALSE;
}


/* set miscellaneous mode parameters
 */
static void
awe_init_ctrl_parms(int init_all)
{
	int i;
	for (i = 0; i < AWE_MD_END; i++) {
		if (init_all || ctrl_parms[i].init_each_time)
			ctrls[i] = ctrl_parms[i].value;
	}
}


/* sequencer I/O control:
 */
static int
awe_ioctl(int dev, unsigned int cmd, void __user *arg)
{
	switch (cmd) {
	case SNDCTL_SYNTH_INFO:
		if (playing_mode == AWE_PLAY_DIRECT)
			awe_info.nr_voices = awe_max_voices;
		else
			awe_info.nr_voices = AWE_MAX_CHANNELS;
		if (copy_to_user(arg, &awe_info, sizeof(awe_info)))
			return -EFAULT;
		return 0;
		break;

	case SNDCTL_SEQ_RESETSAMPLES:
		awe_reset(dev);
		awe_reset_samples();
		return 0;
		break;

	case SNDCTL_SEQ_PERCMODE:
		/* what's this? */
		return 0;
		break;

	case SNDCTL_SYNTH_MEMAVL:
		return memsize - awe_free_mem_ptr() * 2;
		break;

	default:
		printk(KERN_WARNING "AWE32: unsupported ioctl %d\n", cmd);
		return -EINVAL;
		break;
	}
}


static int voice_in_range(int voice)
{
	if (playing_mode == AWE_PLAY_DIRECT) {
		if (voice < 0 || voice >= awe_max_voices)
			return FALSE;
	} else {
		if (voice < 0 || voice >= AWE_MAX_CHANNELS)
			return FALSE;
	}
	return TRUE;
}

static void release_voice(int voice, int do_sustain)
{
	if (IS_NO_SOUND(voice))
		return;
	if (do_sustain && (voices[voice].cinfo->sustained == 127 ||
			    voices[voice].sostenuto == 127))
		voices[voice].state = AWE_ST_SUSTAINED;
	else {
		awe_note_off(voice);
		awe_fx_init(voices[voice].ch);
		awe_voice_init(voice, FALSE);
	}
}

/* release all notes */
static void awe_note_off_all(int do_sustain)
{
	int i;
	for (i = 0; i < awe_max_voices; i++)
		release_voice(i, do_sustain);
}

/* kill a voice:
 *   not terminate, just release the voice.
 */
static int
awe_kill_note(int dev, int voice, int note, int velocity)
{
	int i, v2, key;

	DEBUG(2,printk("AWE32: [off(%d) nt=%d vl=%d]\n", voice, note, velocity));
	if (! voice_in_range(voice))
		return -EINVAL;

	switch (playing_mode) {
	case AWE_PLAY_DIRECT:
	case AWE_PLAY_INDIRECT:
		key = AWE_VOICE_KEY(voice);
		break;

	case AWE_PLAY_MULTI2:
		v2 = voice_alloc->map[voice] >> 8;
		voice_alloc->map[voice] = 0;
		voice = v2;
		if (voice < 0 || voice >= AWE_MAX_CHANNELS)
			return -EINVAL;
		/* continue to below */
	default:
		key = AWE_CHAN_KEY(voice, note);
		break;
	}

	for (i = 0; i < awe_max_voices; i++) {
		if (voices[i].key == key)
			release_voice(i, TRUE);
	}
	return 0;
}


static void start_or_volume_change(int voice, int velocity)
{
	voices[voice].velocity = velocity;
	awe_calc_volume(voice);
	if (voices[voice].state == AWE_ST_STANDBY)
		awe_note_on(voice);
	else if (voices[voice].state == AWE_ST_ON)
		awe_set_volume(voice, FALSE);
}

static void set_and_start_voice(int voice, int state)
{
	/* calculate pitch & volume parameters */
	voices[voice].state = state;
	awe_calc_pitch(voice);
	awe_calc_volume(voice);
	if (state == AWE_ST_ON)
		awe_note_on(voice);
}

/* start a voice:
 *   if note is 255, identical with aftertouch function.
 *   Otherwise, start a voice with specified not and volume.
 */
static int
awe_start_note(int dev, int voice, int note, int velocity)
{
	int i, key, state, volonly;

	DEBUG(2,printk("AWE32: [on(%d) nt=%d vl=%d]\n", voice, note, velocity));
	if (! voice_in_range(voice))
		return -EINVAL;
	    
	if (velocity == 0)
		state = AWE_ST_STANDBY; /* stand by for playing */
	else
		state = AWE_ST_ON;	/* really play */
	volonly = FALSE;

	switch (playing_mode) {
	case AWE_PLAY_DIRECT:
	case AWE_PLAY_INDIRECT:
		key = AWE_VOICE_KEY(voice);
		if (note == 255)
			volonly = TRUE;
		break;

	case AWE_PLAY_MULTI2:
		voice = voice_alloc->map[voice] >> 8;
		if (voice < 0 || voice >= AWE_MAX_CHANNELS)
			return -EINVAL;
		/* continue to below */
	default:
		if (note >= 128) { /* key volume mode */
			note -= 128;
			volonly = TRUE;
		}
		key = AWE_CHAN_KEY(voice, note);
		break;
	}

	/* dynamic volume change */
	if (volonly) {
		for (i = 0; i < awe_max_voices; i++) {
			if (voices[i].key == key)
				start_or_volume_change(i, velocity);
		}
		return 0;
	}

	/* if the same note still playing, stop it */
	if (playing_mode != AWE_PLAY_DIRECT || ctrls[AWE_MD_EXCLUSIVE_SOUND]) {
		for (i = 0; i < awe_max_voices; i++)
			if (voices[i].key == key) {
				if (voices[i].state == AWE_ST_ON) {
					awe_note_off(i);
					awe_voice_init(i, FALSE);
				} else if (voices[i].state == AWE_ST_STANDBY)
					awe_voice_init(i, TRUE);
			}
	}

	/* allocate voices */
	if (playing_mode == AWE_PLAY_DIRECT)
		awe_alloc_one_voice(voice, note, velocity);
	else
		awe_alloc_multi_voices(voice, note, velocity, key);

	/* turn off other voices exlusively (for drums) */
	for (i = 0; i < awe_max_voices; i++)
		if (voices[i].key == key)
			awe_exclusive_off(i);

	/* set up pitch and volume parameters */
	for (i = 0; i < awe_max_voices; i++) {
		if (voices[i].key == key && voices[i].state == AWE_ST_OFF)
			set_and_start_voice(i, state);
	}

	return 0;
}


/* calculate hash key */
static int
awe_search_key(int bank, int preset, int note)
{
	unsigned int key;

#if 1 /* new hash table */
	if (bank == AWE_DRUM_BANK)
		key = preset + note + 128;
	else
		key = bank + preset;
#else
	key = preset;
#endif
	key %= AWE_MAX_PRESETS;

	return (int)key;
}


/* search instrument from hash table */
static awe_voice_list *
awe_search_instr(int bank, int preset, int note)
{
	awe_voice_list *p;
	int key, key2;

	key = awe_search_key(bank, preset, note);
	for (p = preset_table[key]; p; p = p->next_bank) {
		if (p->instr == preset && p->bank == bank)
			return p;
	}
	key2 = awe_search_key(bank, preset, 0); /* search default */
	if (key == key2)
		return NULL;
	for (p = preset_table[key2]; p; p = p->next_bank) {
		if (p->instr == preset && p->bank == bank)
			return p;
	}
	return NULL;
}


/* assign the instrument to a voice */
static int
awe_set_instr_2(int dev, int voice, int instr_no)
{
	if (playing_mode == AWE_PLAY_MULTI2) {
		voice = voice_alloc->map[voice] >> 8;
		if (voice < 0 || voice >= AWE_MAX_CHANNELS)
			return -EINVAL;
	}
	return awe_set_instr(dev, voice, instr_no);
}

/* assign the instrument to a channel; voice is the channel number */
static int
awe_set_instr(int dev, int voice, int instr_no)
{
	awe_chan_info *cinfo;

	if (! voice_in_range(voice))
		return -EINVAL;

	if (instr_no < 0 || instr_no >= AWE_MAX_PRESETS)
		return -EINVAL;

	cinfo = &channels[voice];
	cinfo->instr = instr_no;
	DEBUG(2,printk("AWE32: [program(%d) %d]\n", voice, instr_no));

	return 0;
}


/* reset all voices; terminate sounds and initialize parameters */
static void
awe_reset(int dev)
{
	int i;
	current_alloc_time = 0;
	/* don't turn off voice 31 and 32.  they are used also for FM voices */
	for (i = 0; i < awe_max_voices; i++) {
		awe_terminate(i);
		awe_voice_init(i, TRUE);
	}
	for (i = 0; i < AWE_MAX_CHANNELS; i++)
		awe_channel_init(i, TRUE);
	for (i = 0; i < 16; i++) {
		awe_operations.chn_info[i].controllers[CTL_MAIN_VOLUME] = 127;
		awe_operations.chn_info[i].controllers[CTL_EXPRESSION] = 127;
	}
	awe_init_fm();
	awe_tweak();
}


/* hardware specific control:
 *   GUS specific and AWE32 specific controls are available.
 */
static void
awe_hw_control(int dev, unsigned char *event)
{
	int cmd = event[2];
	if (cmd & _AWE_MODE_FLAG)
		awe_hw_awe_control(dev, cmd & _AWE_MODE_VALUE_MASK, event);
#ifdef AWE_HAS_GUS_COMPATIBILITY
	else
		awe_hw_gus_control(dev, cmd & _AWE_MODE_VALUE_MASK, event);
#endif
}


#ifdef AWE_HAS_GUS_COMPATIBILITY

/* GUS compatible controls */
static void
awe_hw_gus_control(int dev, int cmd, unsigned char *event)
{
	int voice, i, key;
	unsigned short p1;
	short p2;
	int plong;

	if (MULTI_LAYER_MODE())
		return;
	if (cmd == _GUS_NUMVOICES)
		return;

	voice = event[3];
	if (! voice_in_range(voice))
		return;

	p1 = *(unsigned short *) &event[4];
	p2 = *(short *) &event[6];
	plong = *(int*) &event[4];

	switch (cmd) {
	case _GUS_VOICESAMPLE:
		awe_set_instr(dev, voice, p1);
		return;

	case _GUS_VOICEBALA:
		/* 0 to 15 --> -128 to 127 */
		awe_panning(dev, voice, ((int)p1 << 4) - 128);
		return;

	case _GUS_VOICEVOL:
	case _GUS_VOICEVOL2:
		/* not supported yet */
		return;

	case _GUS_RAMPRANGE:
	case _GUS_RAMPRATE:
	case _GUS_RAMPMODE:
	case _GUS_RAMPON:
	case _GUS_RAMPOFF:
		/* volume ramping not supported */
		return;

	case _GUS_VOLUME_SCALE:
		return;

	case _GUS_VOICE_POS:
		FX_SET(&channels[voice].fx, AWE_FX_SAMPLE_START,
		       (short)(plong & 0x7fff));
		FX_SET(&channels[voice].fx, AWE_FX_COARSE_SAMPLE_START,
		       (plong >> 15) & 0xffff);
		return;
	}

	key = AWE_VOICE_KEY(voice);
	for (i = 0; i < awe_max_voices; i++) {
		if (voices[i].key == key) {
			switch (cmd) {
			case _GUS_VOICEON:
				awe_note_on(i);
				break;

			case _GUS_VOICEOFF:
				awe_terminate(i);
				awe_fx_init(voices[i].ch);
				awe_voice_init(i, TRUE);
				break;

			case _GUS_VOICEFADE:
				awe_note_off(i);
				awe_fx_init(voices[i].ch);
				awe_voice_init(i, FALSE);
				break;

			case _GUS_VOICEFREQ:
				awe_calc_pitch_from_freq(i, plong);
				break;
			}
		}
	}
}

#endif /* gus_compat */


/* AWE32 specific controls */
static void
awe_hw_awe_control(int dev, int cmd, unsigned char *event)
{
	int voice;
	unsigned short p1;
	short p2;
	int i;

	voice = event[3];
	if (! voice_in_range(voice))
		return;

	if (playing_mode == AWE_PLAY_MULTI2) {
		voice = voice_alloc->map[voice] >> 8;
		if (voice < 0 || voice >= AWE_MAX_CHANNELS)
			return;
	}

	p1 = *(unsigned short *) &event[4];
	p2 = *(short *) &event[6];

	switch (cmd) {
	case _AWE_DEBUG_MODE:
		ctrls[AWE_MD_DEBUG_MODE] = p1;
		printk(KERN_DEBUG "AWE32: debug mode = %d\n", ctrls[AWE_MD_DEBUG_MODE]);
		break;
	case _AWE_REVERB_MODE:
		ctrls[AWE_MD_REVERB_MODE] = p1;
		awe_update_reverb_mode();
		break;

	case _AWE_CHORUS_MODE:
		ctrls[AWE_MD_CHORUS_MODE] = p1;
		awe_update_chorus_mode();
		break;
		      
	case _AWE_REMOVE_LAST_SAMPLES:
		DEBUG(0,printk("AWE32: remove last samples\n"));
		awe_reset(0);
		if (locked_sf_id > 0)
			awe_remove_samples(locked_sf_id);
		break;

	case _AWE_INITIALIZE_CHIP:
		awe_initialize();
		break;

	case _AWE_SEND_EFFECT:
		i = -1;
		if (p1 >= 0x100) {
			i = (p1 >> 8);
			if (i < 0 || i >= MAX_LAYERS)
				break;
		}
		awe_send_effect(voice, i, p1, p2);
		break;

	case _AWE_RESET_CHANNEL:
		awe_channel_init(voice, !p1);
		break;
		
	case _AWE_TERMINATE_ALL:
		awe_reset(0);
		break;

	case _AWE_TERMINATE_CHANNEL:
		awe_voice_change(voice, awe_terminate_and_init);
		break;

	case _AWE_RELEASE_ALL:
		awe_note_off_all(FALSE);
		break;
	case _AWE_NOTEOFF_ALL:
		awe_note_off_all(TRUE);
		break;

	case _AWE_INITIAL_VOLUME:
		DEBUG(0,printk("AWE32: init attenuation %d\n", p1));
		atten_relative = (char)p2;
		atten_offset = (short)p1;
		awe_update_volume();
		break;

	case _AWE_CHN_PRESSURE:
		channels[voice].chan_press = p1;
		awe_modwheel_change(voice, p1);
		break;

	case _AWE_CHANNEL_MODE:
		DEBUG(0,printk("AWE32: channel mode = %d\n", p1));
		playing_mode = p1;
		awe_reset(0);
		break;

	case _AWE_DRUM_CHANNELS:
		DEBUG(0,printk("AWE32: drum flags = %x\n", p1));
		drum_flags = *(unsigned int*)&event[4];
		break;

	case _AWE_MISC_MODE:
		DEBUG(0,printk("AWE32: ctrl parms = %d %d\n", p1, p2));
		if (p1 > AWE_MD_VERSION && p1 < AWE_MD_END) {
			ctrls[p1] = p2;
			if (ctrl_parms[p1].update)
				ctrl_parms[p1].update();
		}
		break;

	case _AWE_EQUALIZER:
		ctrls[AWE_MD_BASS_LEVEL] = p1;
		ctrls[AWE_MD_TREBLE_LEVEL] = p2;
		awe_update_equalizer();
		break;

	default:
		DEBUG(0,printk("AWE32: hw control cmd=%d voice=%d\n", cmd, voice));
		break;
	}
}


/* change effects */
static void
awe_send_effect(int voice, int layer, int type, int val)
{
	awe_chan_info *cinfo;
	FX_Rec *fx;
	int mode;

	cinfo = &channels[voice];
	if (layer >= 0 && layer < MAX_LAYERS)
		fx = &cinfo->fx_layer[layer];
	else
		fx = &cinfo->fx;

	if (type & 0x40)
		mode = FX_FLAG_OFF;
	else if (type & 0x80)
		mode = FX_FLAG_ADD;
	else
		mode = FX_FLAG_SET;
	type &= 0x3f;

	if (type >= 0 && type < AWE_FX_END) {
		DEBUG(2,printk("AWE32: effects (%d) %d %d\n", voice, type, val));
		if (mode == FX_FLAG_SET)
			FX_SET(fx, type, val);
		else if (mode == FX_FLAG_ADD)
			FX_ADD(fx, type, val);
		else
			FX_UNSET(fx, type);
		if (mode != FX_FLAG_OFF && parm_defs[type].realtime) {
			DEBUG(2,printk("AWE32: fx_realtime (%d)\n", voice));
			awe_voice_change(voice, parm_defs[type].realtime);
		}
	}
}


/* change modulation wheel; voice is already mapped on multi2 mode */
static void
awe_modwheel_change(int voice, int value)
{
	int i;
	awe_chan_info *cinfo;

	cinfo = &channels[voice];
	i = value * ctrls[AWE_MD_MOD_SENSE] / 1200;
	FX_ADD(&cinfo->fx, AWE_FX_LFO1_PITCH, i);
	awe_voice_change(voice, awe_fx_fmmod);
	FX_ADD(&cinfo->fx, AWE_FX_LFO2_PITCH, i);
	awe_voice_change(voice, awe_fx_fm2frq2);
}


/* voice pressure change */
static void
awe_aftertouch(int dev, int voice, int pressure)
{
	int note;

	DEBUG(2,printk("AWE32: [after(%d) %d]\n", voice, pressure));
	if (! voice_in_range(voice))
		return;

	switch (playing_mode) {
	case AWE_PLAY_DIRECT:
	case AWE_PLAY_INDIRECT:
		awe_start_note(dev, voice, 255, pressure);
		break;
	case AWE_PLAY_MULTI2:
		note = (voice_alloc->map[voice] & 0xff) - 1;
		awe_key_pressure(dev, voice, note + 0x80, pressure);
		break;
	}
}


/* voice control change */
static void
awe_controller(int dev, int voice, int ctrl_num, int value)
{
	awe_chan_info *cinfo;

	if (! voice_in_range(voice))
		return;

	if (playing_mode == AWE_PLAY_MULTI2) {
		voice = voice_alloc->map[voice] >> 8;
		if (voice < 0 || voice >= AWE_MAX_CHANNELS)
			return;
	}

	cinfo = &channels[voice];

	switch (ctrl_num) {
	case CTL_BANK_SELECT: /* MIDI control #0 */
		DEBUG(2,printk("AWE32: [bank(%d) %d]\n", voice, value));
		if (MULTI_LAYER_MODE() && IS_DRUM_CHANNEL(voice) &&
		    !ctrls[AWE_MD_TOGGLE_DRUM_BANK])
			break;
		if (value < 0 || value > 255)
			break;
		cinfo->bank = value;
		if (cinfo->bank == AWE_DRUM_BANK)
			DRUM_CHANNEL_ON(cinfo->channel);
		else
			DRUM_CHANNEL_OFF(cinfo->channel);
		awe_set_instr(dev, voice, cinfo->instr);
		break;

	case CTL_MODWHEEL: /* MIDI control #1 */
		DEBUG(2,printk("AWE32: [modwheel(%d) %d]\n", voice, value));
		awe_modwheel_change(voice, value);
		break;

	case CTRL_PITCH_BENDER: /* SEQ1 V2 contorl */
		DEBUG(2,printk("AWE32: [bend(%d) %d]\n", voice, value));
		/* zero centered */
		cinfo->bender = value;
		awe_voice_change(voice, awe_set_voice_pitch);
		break;

	case CTRL_PITCH_BENDER_RANGE: /* SEQ1 V2 control */
		DEBUG(2,printk("AWE32: [range(%d) %d]\n", voice, value));
		/* value = sense x 100 */
		cinfo->bender_range = value;
		/* no audible pitch change yet.. */
		break;

	case CTL_EXPRESSION: /* MIDI control #11 */
		if (SINGLE_LAYER_MODE())
			value /= 128;
	case CTRL_EXPRESSION: /* SEQ1 V2 control */
		DEBUG(2,printk("AWE32: [expr(%d) %d]\n", voice, value));
		/* 0 - 127 */
		cinfo->expression_vol = value;
		awe_voice_change(voice, awe_set_voice_vol);
		break;

	case CTL_PAN:	/* MIDI control #10 */
		DEBUG(2,printk("AWE32: [pan(%d) %d]\n", voice, value));
		/* (0-127) -> signed 8bit */
		cinfo->panning = value * 2 - 128;
		if (ctrls[AWE_MD_REALTIME_PAN])
			awe_voice_change(voice, awe_set_pan);
		break;

	case CTL_MAIN_VOLUME:	/* MIDI control #7 */
		if (SINGLE_LAYER_MODE())
			value = (value * 100) / 16383;
	case CTRL_MAIN_VOLUME:	/* SEQ1 V2 control */
		DEBUG(2,printk("AWE32: [mainvol(%d) %d]\n", voice, value));
		/* 0 - 127 */
		cinfo->main_vol = value;
		awe_voice_change(voice, awe_set_voice_vol);
		break;

	case CTL_EXT_EFF_DEPTH: /* reverb effects: 0-127 */
		DEBUG(2,printk("AWE32: [reverb(%d) %d]\n", voice, value));
		FX_SET(&cinfo->fx, AWE_FX_REVERB, value * 2);
		break;

	case CTL_CHORUS_DEPTH: /* chorus effects: 0-127 */
		DEBUG(2,printk("AWE32: [chorus(%d) %d]\n", voice, value));
		FX_SET(&cinfo->fx, AWE_FX_CHORUS, value * 2);
		break;

	case 120:  /* all sounds off */
		awe_note_off_all(FALSE);
		break;
	case 123:  /* all notes off */
		awe_note_off_all(TRUE);
		break;

	case CTL_SUSTAIN: /* MIDI control #64 */
		cinfo->sustained = value;
		if (value != 127)
			awe_voice_change(voice, awe_sustain_off);
		break;

	case CTL_SOSTENUTO: /* MIDI control #66 */
		if (value == 127)
			awe_voice_change(voice, awe_sostenuto_on);
		else
			awe_voice_change(voice, awe_sustain_off);
		break;

	default:
		DEBUG(0,printk("AWE32: [control(%d) ctrl=%d val=%d]\n",
			   voice, ctrl_num, value));
		break;
	}
}


/* voice pan change (value = -128 - 127) */
static void
awe_panning(int dev, int voice, int value)
{
	awe_chan_info *cinfo;

	if (! voice_in_range(voice))
		return;

	if (playing_mode == AWE_PLAY_MULTI2) {
		voice = voice_alloc->map[voice] >> 8;
		if (voice < 0 || voice >= AWE_MAX_CHANNELS)
			return;
	}

	cinfo = &channels[voice];
	cinfo->panning = value;
	DEBUG(2,printk("AWE32: [pan(%d) %d]\n", voice, cinfo->panning));
	if (ctrls[AWE_MD_REALTIME_PAN])
		awe_voice_change(voice, awe_set_pan);
}


/* volume mode change */
static void
awe_volume_method(int dev, int mode)
{
	/* not impremented */
	DEBUG(0,printk("AWE32: [volmethod mode=%d]\n", mode));
}


/* pitch wheel change: 0-16384 */
static void
awe_bender(int dev, int voice, int value)
{
	awe_chan_info *cinfo;

	if (! voice_in_range(voice))
		return;

	if (playing_mode == AWE_PLAY_MULTI2) {
		voice = voice_alloc->map[voice] >> 8;
		if (voice < 0 || voice >= AWE_MAX_CHANNELS)
			return;
	}

	/* convert to zero centered value */
	cinfo = &channels[voice];
	cinfo->bender = value - 8192;
	DEBUG(2,printk("AWE32: [bend(%d) %d]\n", voice, cinfo->bender));
	awe_voice_change(voice, awe_set_voice_pitch);
}


/*
 * load a sound patch:
 *   three types of patches are accepted: AWE, GUS, and SYSEX.
 */

static int
awe_load_patch(int dev, int format, const char __user *addr,
	       int offs, int count, int pmgr_flag)
{
	awe_patch_info patch;
	int rc = 0;

#ifdef AWE_HAS_GUS_COMPATIBILITY
	if (format == GUS_PATCH) {
		return awe_load_guspatch(addr, offs, count, pmgr_flag);
	} else
#endif
	if (format == SYSEX_PATCH) {
		/* no system exclusive message supported yet */
		return 0;
	} else if (format != AWE_PATCH) {
		printk(KERN_WARNING "AWE32 Error: Invalid patch format (key) 0x%x\n", format);
		return -EINVAL;
	}
	
	if (count < AWE_PATCH_INFO_SIZE) {
		printk(KERN_WARNING "AWE32 Error: Patch header too short\n");
		return -EINVAL;
	}
	if (copy_from_user(((char*)&patch) + offs, addr + offs, 
			   AWE_PATCH_INFO_SIZE - offs))
		return -EFAULT;

	count -= AWE_PATCH_INFO_SIZE;
	if (count < patch.len) {
		printk(KERN_WARNING "AWE32: sample: Patch record too short (%d<%d)\n",
		       count, patch.len);
		return -EINVAL;
	}
	
	switch (patch.type) {
	case AWE_LOAD_INFO:
		rc = awe_load_info(&patch, addr, count);
		break;
	case AWE_LOAD_DATA:
		rc = awe_load_data(&patch, addr, count);
		break;
	case AWE_OPEN_PATCH:
		rc = awe_open_patch(&patch, addr, count);
		break;
	case AWE_CLOSE_PATCH:
		rc = awe_close_patch(&patch, addr, count);
		break;
	case AWE_UNLOAD_PATCH:
		rc = awe_unload_patch(&patch, addr, count);
		break;
	case AWE_REPLACE_DATA:
		rc = awe_replace_data(&patch, addr, count);
		break;
	case AWE_MAP_PRESET:
		rc = awe_load_map(&patch, addr, count);
		break;
	/* case AWE_PROBE_INFO:
		rc = awe_probe_info(&patch, addr, count);
		break;*/
	case AWE_PROBE_DATA:
		rc = awe_probe_data(&patch, addr, count);
		break;
	case AWE_REMOVE_INFO:
		rc = awe_remove_info(&patch, addr, count);
		break;
	case AWE_LOAD_CHORUS_FX:
		rc = awe_load_chorus_fx(&patch, addr, count);
		break;
	case AWE_LOAD_REVERB_FX:
		rc = awe_load_reverb_fx(&patch, addr, count);
		break;

	default:
		printk(KERN_WARNING "AWE32 Error: unknown patch format type %d\n",
		       patch.type);
		rc = -EINVAL;
	}

	return rc;
}


/* create an sf list record */
static int
awe_create_sf(int type, char *name)
{
	sf_list *rec;

	/* terminate sounds */
	awe_reset(0);
	rec = (sf_list *)kmalloc(sizeof(*rec), GFP_KERNEL);
	if (rec == NULL)
		return 1; /* no memory */
	rec->sf_id = current_sf_id + 1;
	rec->type = type;
	if (/*current_sf_id == 0 ||*/ (type & AWE_PAT_LOCKED) != 0)
		locked_sf_id = current_sf_id + 1;
	rec->num_info = awe_free_info();
	rec->num_sample = awe_free_sample();
	rec->mem_ptr = awe_free_mem_ptr();
	rec->infos = rec->last_infos = NULL;
	rec->samples = rec->last_samples = NULL;

	/* add to linked-list */
	rec->next = NULL;
	rec->prev = sftail;
	if (sftail)
		sftail->next = rec;
	else
		sfhead = rec;
	sftail = rec;
	current_sf_id++;

#ifdef AWE_ALLOW_SAMPLE_SHARING
	rec->shared = NULL;
	if (name)
		memcpy(rec->name, name, AWE_PATCH_NAME_LEN);
	else
		strcpy(rec->name, "*TEMPORARY*");
	if (current_sf_id > 1 && name && (type & AWE_PAT_SHARED) != 0) {
		/* is the current font really a shared font? */
		if (is_shared_sf(rec->name)) {
			/* check if the shared font is already installed */
			sf_list *p;
			for (p = rec->prev; p; p = p->prev) {
				if (is_identical_name(rec->name, p)) {
					rec->shared = p;
					break;
				}
			}
		}
	}
#endif /* allow sharing */

	return 0;
}


#ifdef AWE_ALLOW_SAMPLE_SHARING

/* check if the given name is a valid shared name */
#define ASC_TO_KEY(c) ((c) - 'A' + 1)
static int is_shared_sf(unsigned char *name)
{
	static unsigned char id_head[4] = {
		ASC_TO_KEY('A'), ASC_TO_KEY('W'), ASC_TO_KEY('E'),
		AWE_MAJOR_VERSION,
	};
	if (memcmp(name, id_head, 4) == 0)
		return TRUE;
	return FALSE;
}

/* check if the given name matches to the existing list */
static int is_identical_name(unsigned char *name, sf_list *p) 
{
	char *id = p->name;
	if (is_shared_sf(id) && memcmp(id, name, AWE_PATCH_NAME_LEN) == 0)
		return TRUE;
	return FALSE;
}

/* check if the given voice info exists */
static int info_duplicated(sf_list *sf, awe_voice_list *rec)
{
	/* search for all sharing lists */
	for (; sf; sf = sf->shared) {
		awe_voice_list *p;
		for (p = sf->infos; p; p = p->next) {
			if (p->type == V_ST_NORMAL &&
			    p->bank == rec->bank &&
			    p->instr == rec->instr &&
			    p->v.low == rec->v.low &&
			    p->v.high == rec->v.high &&
			    p->v.sample == rec->v.sample)
				return TRUE;
		}
	}
	return FALSE;
}

#endif /* AWE_ALLOW_SAMPLE_SHARING */


/* free sf_list record */
/* linked-list in this function is not cared */
static void
awe_free_sf(sf_list *sf)
{
	if (sf->infos) {
		awe_voice_list *p, *next;
		for (p = sf->infos; p; p = next) {
			next = p->next;
			kfree(p);
		}
	}
	if (sf->samples) {
		awe_sample_list *p, *next;
		for (p = sf->samples; p; p = next) {
			next = p->next;
			kfree(p);
		}
	}
	kfree(sf);
}


/* open patch; create sf list and set opened flag */
static int
awe_open_patch(awe_patch_info *patch, const char __user *addr, int count)
{
	awe_open_parm parm;
	int shared;

	if (copy_from_user(&parm, addr + AWE_PATCH_INFO_SIZE, sizeof(parm)))
		return -EFAULT;
	shared = FALSE;

#ifdef AWE_ALLOW_SAMPLE_SHARING
	if (sftail && (parm.type & AWE_PAT_SHARED) != 0) {
		/* is the previous font the same font? */
		if (is_identical_name(parm.name, sftail)) {
			/* then append to the previous */
			shared = TRUE;
			awe_reset(0);
			if (parm.type & AWE_PAT_LOCKED)
				locked_sf_id = current_sf_id;
		}
	}
#endif /* allow sharing */
	if (! shared) {
		if (awe_create_sf(parm.type, parm.name)) {
			printk(KERN_ERR "AWE32: can't open: failed to alloc new list\n");
			return -ENOMEM;
		}
	}
	patch_opened = TRUE;
	return current_sf_id;
}

/* check if the patch is already opened */
static sf_list *
check_patch_opened(int type, char *name)
{
	if (! patch_opened) {
		if (awe_create_sf(type, name)) {
			printk(KERN_ERR "AWE32: failed to alloc new list\n");
			return NULL;
		}
		patch_opened = TRUE;
		return sftail;
	}
	return sftail;
}

/* close the patch; if no voice is loaded, remove the patch */
static int
awe_close_patch(awe_patch_info *patch, const char __user *addr, int count)
{
	if (patch_opened && sftail) {
		/* if no voice is loaded, release the current patch */
		if (sftail->infos == NULL) {
			awe_reset(0);
			awe_remove_samples(current_sf_id - 1);
		}
	}
	patch_opened = 0;
	return 0;
}


/* remove the latest patch */
static int
awe_unload_patch(awe_patch_info *patch, const char __user *addr, int count)
{
	if (current_sf_id > 0 && current_sf_id > locked_sf_id) {
		awe_reset(0);
		awe_remove_samples(current_sf_id - 1);
	}
	return 0;
}

/* allocate voice info list records */
static awe_voice_list *
alloc_new_info(void)
{
	awe_voice_list *newlist;
	
	newlist = kmalloc(sizeof(*newlist), GFP_KERNEL);
	if (newlist == NULL) {
		printk(KERN_ERR "AWE32: can't alloc info table\n");
		return NULL;
	}
	return newlist;
}

/* allocate sample info list records */
static awe_sample_list *
alloc_new_sample(void)
{
	awe_sample_list *newlist;
	
	newlist = (awe_sample_list *)kmalloc(sizeof(*newlist), GFP_KERNEL);
	if (newlist == NULL) {
		printk(KERN_ERR "AWE32: can't alloc sample table\n");
		return NULL;
	}
	return newlist;
}

/* load voice map */
static int
awe_load_map(awe_patch_info *patch, const char __user *addr, int count)
{
	awe_voice_map map;
	awe_voice_list *rec, *p;
	sf_list *sf;

	/* get the link info */
	if (count < sizeof(map)) {
		printk(KERN_WARNING "AWE32 Error: invalid patch info length\n");
		return -EINVAL;
	}
	if (copy_from_user(&map, addr + AWE_PATCH_INFO_SIZE, sizeof(map)))
		return -EFAULT;
	
	/* check if the identical mapping already exists */
	p = awe_search_instr(map.map_bank, map.map_instr, map.map_key);
	for (; p; p = p->next_instr) {
		if (p->type == V_ST_MAPPED &&
		    p->v.start == map.src_instr &&
		    p->v.end == map.src_bank &&
		    p->v.fixkey == map.src_key)
			return 0; /* already present! */
	}

	if ((sf = check_patch_opened(AWE_PAT_TYPE_MAP, NULL)) == NULL)
		return -ENOMEM;

	if ((rec = alloc_new_info()) == NULL)
		return -ENOMEM;

	rec->bank = map.map_bank;
	rec->instr = map.map_instr;
	rec->type = V_ST_MAPPED;
	rec->disabled = FALSE;
	awe_init_voice_info(&rec->v);
	if (map.map_key >= 0) {
		rec->v.low = map.map_key;
		rec->v.high = map.map_key;
	}
	rec->v.start = map.src_instr;
	rec->v.end = map.src_bank;
	rec->v.fixkey = map.src_key;
	add_sf_info(sf, rec);
	add_info_list(rec);

	return 0;
}

#if 0
/* probe preset in the current list -- nothing to be loaded */
static int
awe_probe_info(awe_patch_info *patch, const char __user *addr, int count)
{
#ifdef AWE_ALLOW_SAMPLE_SHARING
	awe_voice_map map;
	awe_voice_list *p;

	if (! patch_opened)
		return -EINVAL;

	/* get the link info */
	if (count < sizeof(map)) {
		printk(KERN_WARNING "AWE32 Error: invalid patch info length\n");
		return -EINVAL;
	}
	if (copy_from_user(&map, addr + AWE_PATCH_INFO_SIZE, sizeof(map)))
		return -EFAULT;
	
	/* check if the identical mapping already exists */
	if (sftail == NULL)
		return -EINVAL;
	p = awe_search_instr(map.src_bank, map.src_instr, map.src_key);
	for (; p; p = p->next_instr) {
		if (p->type == V_ST_NORMAL &&
		    is_identical_holder(p->holder, sftail) &&
		    p->v.low <= map.src_key &&
		    p->v.high >= map.src_key)
			return 0; /* already present! */
	}
#endif /* allow sharing */
	return -EINVAL;
}
#endif

/* probe sample in the current list -- nothing to be loaded */
static int
awe_probe_data(awe_patch_info *patch, const char __user *addr, int count)
{
#ifdef AWE_ALLOW_SAMPLE_SHARING
	if (! patch_opened)
		return -EINVAL;

	/* search the specified sample by optarg */
	if (search_sample_index(sftail, patch->optarg) != NULL)
		return 0;
#endif /* allow sharing */
	return -EINVAL;
}

		
/* remove the present instrument layers */
static int
remove_info(sf_list *sf, int bank, int instr)
{
	awe_voice_list *prev, *next, *p;
	int removed = 0;

	prev = NULL;
	for (p = sf->infos; p; p = next) {
		next = p->next;
		if (p->type == V_ST_NORMAL &&
		    p->bank == bank && p->instr == instr) {
			/* remove this layer */
			if (prev)
				prev->next = next;
			else
				sf->infos = next;
			if (p == sf->last_infos)
				sf->last_infos = prev;
			sf->num_info--;
			removed++;
			kfree(p);
		} else
			prev = p;
	}
	if (removed)
		rebuild_preset_list();
	return removed;
}

/* load voice information data */
static int
awe_load_info(awe_patch_info *patch, const char __user *addr, int count)
{
	int offset;
	awe_voice_rec_hdr hdr;
	int i;
	int total_size;
	sf_list *sf;
	awe_voice_list *rec;

	if (count < AWE_VOICE_REC_SIZE) {
		printk(KERN_WARNING "AWE32 Error: invalid patch info length\n");
		return -EINVAL;
	}

	offset = AWE_PATCH_INFO_SIZE;
	if (copy_from_user((char*)&hdr, addr + offset, AWE_VOICE_REC_SIZE))
		return -EFAULT;
	offset += AWE_VOICE_REC_SIZE;

	if (hdr.nvoices <= 0 || hdr.nvoices >= 100) {
		printk(KERN_WARNING "AWE32 Error: Invalid voice number %d\n", hdr.nvoices);
		return -EINVAL;
	}
	total_size = AWE_VOICE_REC_SIZE + AWE_VOICE_INFO_SIZE * hdr.nvoices;
	if (count < total_size) {
		printk(KERN_WARNING "AWE32 Error: patch length(%d) is smaller than nvoices(%d)\n",
		       count, hdr.nvoices);
		return -EINVAL;
	}

	if ((sf = check_patch_opened(AWE_PAT_TYPE_MISC, NULL)) == NULL)
		return -ENOMEM;

	switch (hdr.write_mode) {
	case AWE_WR_EXCLUSIVE:
		/* exclusive mode - if the instrument already exists,
		   return error */
		for (rec = sf->infos; rec; rec = rec->next) {
			if (rec->type == V_ST_NORMAL &&
			    rec->bank == hdr.bank &&
			    rec->instr == hdr.instr)
				return -EINVAL;
		}
		break;
	case AWE_WR_REPLACE:
		/* replace mode - remove the instrument if it already exists */
		remove_info(sf, hdr.bank, hdr.instr);
		break;
	}

	/* append new layers */
	for (i = 0; i < hdr.nvoices; i++) {
		rec = alloc_new_info();
		if (rec == NULL)
			return -ENOMEM;

		rec->bank = hdr.bank;
		rec->instr = hdr.instr;
		rec->type = V_ST_NORMAL;
		rec->disabled = FALSE;

		/* copy awe_voice_info parameters */
		if (copy_from_user(&rec->v, addr + offset, AWE_VOICE_INFO_SIZE)) {
			kfree(rec);
			return -EFAULT;
		}
		offset += AWE_VOICE_INFO_SIZE;
#ifdef AWE_ALLOW_SAMPLE_SHARING
		if (sf && sf->shared) {
			if (info_duplicated(sf, rec)) {
				kfree(rec);
				continue;
			}
		}
#endif /* allow sharing */
		if (rec->v.mode & AWE_MODE_INIT_PARM)
			awe_init_voice_parm(&rec->v.parm);
		add_sf_info(sf, rec);
		awe_set_sample(rec);
		add_info_list(rec);
	}

	return 0;
}


/* remove instrument layers */
static int
awe_remove_info(awe_patch_info *patch, const char __user *addr, int count)
{
	unsigned char bank, instr;
	sf_list *sf;

	if (! patch_opened || (sf = sftail) == NULL) {
		printk(KERN_WARNING "AWE32: remove_info: patch not opened\n");
		return -EINVAL;
	}

	bank = ((unsigned short)patch->optarg >> 8) & 0xff;
	instr = (unsigned short)patch->optarg & 0xff;
	if (! remove_info(sf, bank, instr))
		return -EINVAL;
	return 0;
}


/* load wave sample data */
static int
awe_load_data(awe_patch_info *patch, const char __user *addr, int count)
{
	int offset, size;
	int rc;
	awe_sample_info tmprec;
	awe_sample_list *rec;
	sf_list *sf;

	if ((sf = check_patch_opened(AWE_PAT_TYPE_MISC, NULL)) == NULL)
		return -ENOMEM;

	size = (count - AWE_SAMPLE_INFO_SIZE) / 2;
	offset = AWE_PATCH_INFO_SIZE;
	if (copy_from_user(&tmprec, addr + offset, AWE_SAMPLE_INFO_SIZE))
		return -EFAULT;
	offset += AWE_SAMPLE_INFO_SIZE;
	if (size != tmprec.size) {
		printk(KERN_WARNING "AWE32: load: sample size differed (%d != %d)\n",
		       tmprec.size, size);
		return -EINVAL;
	}

	if (search_sample_index(sf, tmprec.sample) != NULL) {
#ifdef AWE_ALLOW_SAMPLE_SHARING
		/* if shared sample, skip this data */
		if (sf->type & AWE_PAT_SHARED)
			return 0;
#endif /* allow sharing */
		DEBUG(1,printk("AWE32: sample data %d already present\n", tmprec.sample));
		return -EINVAL;
	}

	if ((rec = alloc_new_sample()) == NULL)
		return -ENOMEM;

	memcpy(&rec->v, &tmprec, sizeof(tmprec));

	if (rec->v.size > 0) {
		if ((rc = awe_write_wave_data(addr, offset, rec, -1)) < 0) {
			kfree(rec);
			return rc;
		}
		sf->mem_ptr += rc;
	}

	add_sf_sample(sf, rec);
	return 0;
}


/* replace wave sample data */
static int
awe_replace_data(awe_patch_info *patch, const char __user *addr, int count)
{
	int offset;
	int size;
	int rc;
	int channels;
	awe_sample_info cursmp;
	int save_mem_ptr;
	sf_list *sf;
	awe_sample_list *rec;

	if (! patch_opened || (sf = sftail) == NULL) {
		printk(KERN_WARNING "AWE32: replace: patch not opened\n");
		return -EINVAL;
	}

	size = (count - AWE_SAMPLE_INFO_SIZE) / 2;
	offset = AWE_PATCH_INFO_SIZE;
	if (copy_from_user(&cursmp, addr + offset, AWE_SAMPLE_INFO_SIZE))
		return -EFAULT;
	offset += AWE_SAMPLE_INFO_SIZE;
	if (cursmp.size == 0 || size != cursmp.size) {
		printk(KERN_WARNING "AWE32: replace: invalid sample size (%d!=%d)\n",
		       cursmp.size, size);
		return -EINVAL;
	}
	channels = patch->optarg;
	if (channels <= 0 || channels > AWE_NORMAL_VOICES) {
		printk(KERN_WARNING "AWE32: replace: invalid channels %d\n", channels);
		return -EINVAL;
	}

	for (rec = sf->samples; rec; rec = rec->next) {
		if (rec->v.sample == cursmp.sample)
			break;
	}
	if (rec == NULL) {
		printk(KERN_WARNING "AWE32: replace: cannot find existing sample data %d\n",
		       cursmp.sample);
		return -EINVAL;
	}
		
	if (rec->v.size != cursmp.size) {
		printk(KERN_WARNING "AWE32: replace: exiting size differed (%d!=%d)\n",
		       rec->v.size, cursmp.size);
		return -EINVAL;
	}

	save_mem_ptr = awe_free_mem_ptr();
	sftail->mem_ptr = rec->v.start - awe_mem_start;
	memcpy(&rec->v, &cursmp, sizeof(cursmp));
	rec->v.sf_id = current_sf_id;
	if ((rc = awe_write_wave_data(addr, offset, rec, channels)) < 0)
		return rc;
	sftail->mem_ptr = save_mem_ptr;

	return 0;
}


/*----------------------------------------------------------------*/

static const char __user *readbuf_addr;
static int readbuf_offs;
static int readbuf_flags;

/* initialize read buffer */
static int
readbuf_init(const char __user *addr, int offset, awe_sample_info *sp)
{
	readbuf_addr = addr;
	readbuf_offs = offset;
	readbuf_flags = sp->mode_flags;
	return 0;
}

/* read directly from user buffer */
static unsigned short
readbuf_word(int pos)
{
	unsigned short c;
	/* read from user buffer */
	if (readbuf_flags & AWE_SAMPLE_8BITS) {
		unsigned char cc;
		get_user(cc, (unsigned char __user *)(readbuf_addr + readbuf_offs + pos));
		c = (unsigned short)cc << 8; /* convert 8bit -> 16bit */
	} else {
		get_user(c, (unsigned short __user *)(readbuf_addr + readbuf_offs + pos * 2));
	}
	if (readbuf_flags & AWE_SAMPLE_UNSIGNED)
		c ^= 0x8000; /* unsigned -> signed */
	return c;
}

#define readbuf_word_cache	readbuf_word
#define readbuf_end()		/**/

/*----------------------------------------------------------------*/

#define BLANK_LOOP_START	8
#define BLANK_LOOP_END		40
#define BLANK_LOOP_SIZE		48

/* loading onto memory - return the actual written size */
static int 
awe_write_wave_data(const char __user *addr, int offset, awe_sample_list *list, int channels)
{
	int i, truesize, dram_offset;
	awe_sample_info *sp = &list->v;
	int rc;

	/* be sure loop points start < end */
	if (sp->loopstart > sp->loopend) {
		int tmp = sp->loopstart;
		sp->loopstart = sp->loopend;
		sp->loopend = tmp;
	}

	/* compute true data size to be loaded */
	truesize = sp->size;
	if (sp->mode_flags & (AWE_SAMPLE_BIDIR_LOOP|AWE_SAMPLE_REVERSE_LOOP))
		truesize += sp->loopend - sp->loopstart;
	if (sp->mode_flags & AWE_SAMPLE_NO_BLANK)
		truesize += BLANK_LOOP_SIZE;
	if (awe_free_mem_ptr() + truesize >= memsize/2) {
		DEBUG(-1,printk("AWE32 Error: Sample memory full\n"));
		return -ENOSPC;
	}

	/* recalculate address offset */
	sp->end -= sp->start;
	sp->loopstart -= sp->start;
	sp->loopend -= sp->start;

	dram_offset = awe_free_mem_ptr() + awe_mem_start;
	sp->start = dram_offset;
	sp->end += dram_offset;
	sp->loopstart += dram_offset;
	sp->loopend += dram_offset;

	/* set the total size (store onto obsolete checksum value) */
	if (sp->size == 0)
		sp->checksum = 0;
	else
		sp->checksum = truesize;

	if ((rc = awe_open_dram_for_write(dram_offset, channels)) != 0)
		return rc;

	if (readbuf_init(addr, offset, sp) < 0)
		return -ENOSPC;

	for (i = 0; i < sp->size; i++) {
		unsigned short c;
		c = readbuf_word(i);
		awe_write_dram(c);
		if (i == sp->loopend &&
		    (sp->mode_flags & (AWE_SAMPLE_BIDIR_LOOP|AWE_SAMPLE_REVERSE_LOOP))) {
			int looplen = sp->loopend - sp->loopstart;
			/* copy reverse loop */
			int k;
			for (k = 1; k <= looplen; k++) {
				c = readbuf_word_cache(i - k);
				awe_write_dram(c);
			}
			if (sp->mode_flags & AWE_SAMPLE_BIDIR_LOOP) {
				sp->end += looplen;
			} else {
				sp->start += looplen;
				sp->end += looplen;
			}
		}
	}
	readbuf_end();

	/* if no blank loop is attached in the sample, add it */
	if (sp->mode_flags & AWE_SAMPLE_NO_BLANK) {
		for (i = 0; i < BLANK_LOOP_SIZE; i++)
			awe_write_dram(0);
		if (sp->mode_flags & AWE_SAMPLE_SINGLESHOT) {
			sp->loopstart = sp->end + BLANK_LOOP_START;
			sp->loopend = sp->end + BLANK_LOOP_END;
		}
	}

	awe_close_dram();

	/* initialize FM */
	awe_init_fm();

	return truesize;
}


/*----------------------------------------------------------------*/

#ifdef AWE_HAS_GUS_COMPATIBILITY

/* calculate GUS envelope time:
 * is this correct?  i have no idea..
 */
static int
calc_gus_envelope_time(int rate, int start, int end)
{
	int r, p, t;
	r = (3 - ((rate >> 6) & 3)) * 3;
	p = rate & 0x3f;
	t = end - start;
	if (t < 0) t = -t;
	if (13 > r)
		t = t << (13 - r);
	else
		t = t >> (r - 13);
	return (t * 10) / (p * 441);
}

#define calc_gus_sustain(val)  (0x7f - vol_table[(val)/2])
#define calc_gus_attenuation(val)	vol_table[(val)/2]

/* load GUS patch */
static int
awe_load_guspatch(const char __user *addr, int offs, int size, int pmgr_flag)
{
	struct patch_info patch;
	awe_voice_info *rec;
	awe_sample_info *smp;
	awe_voice_list *vrec;
	awe_sample_list *smprec;
	int sizeof_patch;
	int note, rc;
	sf_list *sf;

	sizeof_patch = (int)((long)&patch.data[0] - (long)&patch); /* header size */
	if (size < sizeof_patch) {
		printk(KERN_WARNING "AWE32 Error: Patch header too short\n");
		return -EINVAL;
	}
	if (copy_from_user(((char*)&patch) + offs, addr + offs, sizeof_patch - offs))
		return -EFAULT;
	size -= sizeof_patch;
	if (size < patch.len) {
		printk(KERN_WARNING "AWE32 Error: Patch record too short (%d<%d)\n",
		       size, patch.len);
		return -EINVAL;
	}
	if ((sf = check_patch_opened(AWE_PAT_TYPE_GUS, NULL)) == NULL)
		return -ENOMEM;
	if ((smprec = alloc_new_sample()) == NULL)
		return -ENOMEM;
	if ((vrec = alloc_new_info()) == NULL) {
		kfree(smprec);
		return -ENOMEM;
	}

	smp = &smprec->v;
	smp->sample = sf->num_sample;
	smp->start = 0;
	smp->end = patch.len;
	smp->loopstart = patch.loop_start;
	smp->loopend = patch.loop_end;
	smp->size = patch.len;

	/* set up mode flags */
	smp->mode_flags = 0;
	if (!(patch.mode & WAVE_16_BITS))
		smp->mode_flags |= AWE_SAMPLE_8BITS;
	if (patch.mode & WAVE_UNSIGNED)
		smp->mode_flags |= AWE_SAMPLE_UNSIGNED;
	smp->mode_flags |= AWE_SAMPLE_NO_BLANK;
	if (!(patch.mode & (WAVE_LOOPING|WAVE_BIDIR_LOOP|WAVE_LOOP_BACK)))
		smp->mode_flags |= AWE_SAMPLE_SINGLESHOT;
	if (patch.mode & WAVE_BIDIR_LOOP)
		smp->mode_flags |= AWE_SAMPLE_BIDIR_LOOP;
	if (patch.mode & WAVE_LOOP_BACK)
		smp->mode_flags |= AWE_SAMPLE_REVERSE_LOOP;

	DEBUG(0,printk("AWE32: [sample %d mode %x]\n", patch.instr_no, smp->mode_flags));
	if (patch.mode & WAVE_16_BITS) {
		/* convert to word offsets */
		smp->size /= 2;
		smp->end /= 2;
		smp->loopstart /= 2;
		smp->loopend /= 2;
	}
	smp->checksum_flag = 0;
	smp->checksum = 0;

	if ((rc = awe_write_wave_data(addr, sizeof_patch, smprec, -1)) < 0) {
		kfree(vrec);
		return rc;
	}
	sf->mem_ptr += rc;
	add_sf_sample(sf, smprec);

	/* set up voice info */
	rec = &vrec->v;
	awe_init_voice_info(rec);
	rec->sample = sf->num_info; /* the last sample */
	rec->rate_offset = calc_rate_offset(patch.base_freq);
	note = freq_to_note(patch.base_note);
	rec->root = note / 100;
	rec->tune = -(note % 100);
	rec->low = freq_to_note(patch.low_note) / 100;
	rec->high = freq_to_note(patch.high_note) / 100;
	DEBUG(1,printk("AWE32: [gus base offset=%d, note=%d, range=%d-%d(%d-%d)]\n",
		       rec->rate_offset, note,
		       rec->low, rec->high,
	      patch.low_note, patch.high_note));
	/* panning position; -128 - 127 => 0-127 */
	rec->pan = (patch.panning + 128) / 2;

	/* detuning is ignored */
	/* 6points volume envelope */
	if (patch.mode & WAVE_ENVELOPES) {
		int attack, hold, decay, release;
		attack = calc_gus_envelope_time
			(patch.env_rate[0], 0, patch.env_offset[0]);
		hold = calc_gus_envelope_time
			(patch.env_rate[1], patch.env_offset[0],
			 patch.env_offset[1]);
		decay = calc_gus_envelope_time
			(patch.env_rate[2], patch.env_offset[1],
			 patch.env_offset[2]);
		release = calc_gus_envelope_time
			(patch.env_rate[3], patch.env_offset[1],
			 patch.env_offset[4]);
		release += calc_gus_envelope_time
			(patch.env_rate[4], patch.env_offset[3],
			 patch.env_offset[4]);
		release += calc_gus_envelope_time
			(patch.env_rate[5], patch.env_offset[4],
			 patch.env_offset[5]);
		rec->parm.volatkhld = (calc_parm_hold(hold) << 8) |
			calc_parm_attack(attack);
		rec->parm.voldcysus = (calc_gus_sustain(patch.env_offset[2]) << 8) |
			calc_parm_decay(decay);
		rec->parm.volrelease = 0x8000 | calc_parm_decay(release);
		DEBUG(2,printk("AWE32: [gusenv atk=%d, hld=%d, dcy=%d, rel=%d]\n", attack, hold, decay, release));
		rec->attenuation = calc_gus_attenuation(patch.env_offset[0]);
	}

	/* tremolo effect */
	if (patch.mode & WAVE_TREMOLO) {
		int rate = (patch.tremolo_rate * 1000 / 38) / 42;
		rec->parm.tremfrq = ((patch.tremolo_depth / 2) << 8) | rate;
		DEBUG(2,printk("AWE32: [gusenv tremolo rate=%d, dep=%d, tremfrq=%x]\n",
			       patch.tremolo_rate, patch.tremolo_depth,
			       rec->parm.tremfrq));
	}
	/* vibrato effect */
	if (patch.mode & WAVE_VIBRATO) {
		int rate = (patch.vibrato_rate * 1000 / 38) / 42;
		rec->parm.fm2frq2 = ((patch.vibrato_depth / 6) << 8) | rate;
		DEBUG(2,printk("AWE32: [gusenv vibrato rate=%d, dep=%d, tremfrq=%x]\n",
			       patch.tremolo_rate, patch.tremolo_depth,
			       rec->parm.tremfrq));
	}
	
	/* scale_freq, scale_factor, volume, and fractions not implemented */

	/* append to the tail of the list */
	vrec->bank = ctrls[AWE_MD_GUS_BANK];
	vrec->instr = patch.instr_no;
	vrec->disabled = FALSE;
	vrec->type = V_ST_NORMAL;

	add_sf_info(sf, vrec);
	add_info_list(vrec);

	/* set the voice index */
	awe_set_sample(vrec);

	return 0;
}

#endif  /* AWE_HAS_GUS_COMPATIBILITY */

/*
 * sample and voice list handlers
 */

/* append this to the current sf list */
static void add_sf_info(sf_list *sf, awe_voice_list *rec)
{
	if (sf == NULL)
		return;
	rec->holder = sf;
	rec->v.sf_id = sf->sf_id;
	if (sf->last_infos)
		sf->last_infos->next = rec;
	else
		sf->infos = rec;
	sf->last_infos = rec;
	rec->next = NULL;
	sf->num_info++;
}

/* prepend this sample to sf list */
static void add_sf_sample(sf_list *sf, awe_sample_list *rec)
{
	if (sf == NULL)
		return;
	rec->holder = sf;
	rec->v.sf_id = sf->sf_id;
	if (sf->last_samples)
		sf->last_samples->next = rec;
	else
		sf->samples = rec;
	sf->last_samples = rec;
	rec->next = NULL;
	sf->num_sample++;
}

/* purge the old records which don't belong with the same file id */
static void purge_old_list(awe_voice_list *rec, awe_voice_list *next)
{
	rec->next_instr = next;
	if (rec->bank == AWE_DRUM_BANK) {
		/* remove samples with the same note range */
		awe_voice_list *cur, *prev = rec;
		int low = rec->v.low;
		int high = rec->v.high;
		for (cur = next; cur; cur = cur->next_instr) {
			if (cur->v.low == low &&
			    cur->v.high == high &&
			    ! is_identical_holder(cur->holder, rec->holder))
				prev->next_instr = cur->next_instr;
			else
				prev = cur;
		}
	} else {
		if (! is_identical_holder(next->holder, rec->holder))
			/* remove all samples */
			rec->next_instr = NULL;
	}
}

/* prepend to top of the preset table */
static void add_info_list(awe_voice_list *rec)
{
	awe_voice_list *prev, *cur;
	int key;

	if (rec->disabled)
		return;

	key = awe_search_key(rec->bank, rec->instr, rec->v.low);
	prev = NULL;
	for (cur = preset_table[key]; cur; cur = cur->next_bank) {
		/* search the first record with the same bank number */
		if (cur->instr == rec->instr && cur->bank == rec->bank) {
			/* replace the list with the new record */
			rec->next_bank = cur->next_bank;
			if (prev)
				prev->next_bank = rec;
			else
				preset_table[key] = rec;
			purge_old_list(rec, cur);
			return;
		}
		prev = cur;
	}

	/* this is the first bank record.. just add this */
	rec->next_instr = NULL;
	rec->next_bank = preset_table[key];
	preset_table[key] = rec;
}

/* remove samples later than the specified sf_id */
static void
awe_remove_samples(int sf_id)
{
	sf_list *p, *prev;

	if (sf_id <= 0) {
		awe_reset_samples();
		return;
	}
	/* already removed? */
	if (current_sf_id <= sf_id)
		return;

	for (p = sftail; p; p = prev) {
		if (p->sf_id <= sf_id)
			break;
		prev = p->prev;
		awe_free_sf(p);
	}
	sftail = p;
	if (sftail) {
		sf_id = sftail->sf_id;
		sftail->next = NULL;
	} else {
		sf_id = 0;
		sfhead = NULL;
	}
	current_sf_id = sf_id;
	if (locked_sf_id > sf_id)
		locked_sf_id = sf_id;

	rebuild_preset_list();
}

/* rebuild preset search list */
static void rebuild_preset_list(void)
{
	sf_list *p;
	awe_voice_list *rec;

	memset(preset_table, 0, sizeof(preset_table));

	for (p = sfhead; p; p = p->next) {
		for (rec = p->infos; rec; rec = rec->next)
			add_info_list(rec);
	}
}

/* compare the given sf_id pair */
static int is_identical_holder(sf_list *sf1, sf_list *sf2)
{
	if (sf1 == NULL || sf2 == NULL)
		return FALSE;
	if (sf1 == sf2)
		return TRUE;
#ifdef AWE_ALLOW_SAMPLE_SHARING
	{
		/* compare with the sharing id */
		sf_list *p;
		int counter = 0;
		if (sf1->sf_id < sf2->sf_id) { /* make sure id1 > id2 */
			sf_list *tmp; tmp = sf1; sf1 = sf2; sf2 = tmp;
		}
		for (p = sf1->shared; p; p = p->shared) {
			if (counter++ > current_sf_id)
				break; /* strange sharing loop.. quit */
			if (p == sf2)
				return TRUE;
		}
	}
#endif /* allow sharing */
	return FALSE;
}

/* search the sample index matching with the given sample id */
static awe_sample_list *
search_sample_index(sf_list *sf, int sample)
{
	awe_sample_list *p;
#ifdef AWE_ALLOW_SAMPLE_SHARING
	int counter = 0;
	while (sf) {
		for (p = sf->samples; p; p = p->next) {
			if (p->v.sample == sample)
				return p;
		}
		sf = sf->shared;
		if (counter++ > current_sf_id)
			break; /* strange sharing loop.. quit */
	}
#else
	if (sf) {
		for (p = sf->samples; p; p = p->next) {
			if (p->v.sample == sample)
				return p;
		}
	}
#endif
	return NULL;
}

/* search the specified sample */
/* non-zero = found */
static short
awe_set_sample(awe_voice_list *rec)
{
	awe_sample_list *smp;
	awe_voice_info *vp = &rec->v;

	vp->index = 0;
	if ((smp = search_sample_index(rec->holder, vp->sample)) == NULL)
		return 0;

	/* set the actual sample offsets */
	vp->start += smp->v.start;
	vp->end += smp->v.end;
	vp->loopstart += smp->v.loopstart;
	vp->loopend += smp->v.loopend;
	/* copy mode flags */
	vp->mode = smp->v.mode_flags;
	/* set flag */
	vp->index = 1;

	return 1;
}


/*
 * voice allocation
 */

/* look for all voices associated with the specified note & velocity */
static int
awe_search_multi_voices(awe_voice_list *rec, int note, int velocity,
			awe_voice_info **vlist)
{
	int nvoices;

	nvoices = 0;
	for (; rec; rec = rec->next_instr) {
		if (note >= rec->v.low &&
		    note <= rec->v.high &&
		    velocity >= rec->v.vellow &&
		    velocity <= rec->v.velhigh) {
			if (rec->type == V_ST_MAPPED) {
				/* mapper */
				vlist[0] = &rec->v;
				return -1;
			}
			vlist[nvoices++] = &rec->v;
			if (nvoices >= AWE_MAX_VOICES)
				break;
		}
	}
	return nvoices;	
}

/* store the voice list from the specified note and velocity.
   if the preset is mapped, seek for the destination preset, and rewrite
   the note number if necessary.
   */
static int
really_alloc_voices(int bank, int instr, int *note, int velocity, awe_voice_info **vlist)
{
	int nvoices;
	awe_voice_list *vrec;
	int level = 0;

	for (;;) {
		vrec = awe_search_instr(bank, instr, *note);
		nvoices = awe_search_multi_voices(vrec, *note, velocity, vlist);
		if (nvoices == 0) {
			if (bank == AWE_DRUM_BANK)
				/* search default drumset */
				vrec = awe_search_instr(bank, ctrls[AWE_MD_DEF_DRUM], *note);
			else
				/* search default preset */
				vrec = awe_search_instr(ctrls[AWE_MD_DEF_BANK], instr, *note);
			nvoices = awe_search_multi_voices(vrec, *note, velocity, vlist);
		}
		if (nvoices == 0) {
			if (bank == AWE_DRUM_BANK && ctrls[AWE_MD_DEF_DRUM] != 0)
				/* search default drumset */
				vrec = awe_search_instr(bank, 0, *note);
			else if (bank != AWE_DRUM_BANK && ctrls[AWE_MD_DEF_BANK] != 0)
				/* search default preset */
				vrec = awe_search_instr(0, instr, *note);
			nvoices = awe_search_multi_voices(vrec, *note, velocity, vlist);
		}
		if (nvoices < 0) { /* mapping */
			int key = vlist[0]->fixkey;
			instr = vlist[0]->start;
			bank = vlist[0]->end;
			if (level++ > 5) {
				printk(KERN_ERR "AWE32: too deep mapping level\n");
				return 0;
			}
			if (key >= 0)
				*note = key;
		} else
			break;
	}

	return nvoices;
}

/* allocate voices corresponding note and velocity; supports multiple insts. */
static void
awe_alloc_multi_voices(int ch, int note, int velocity, int key)
{
	int i, v, nvoices, bank;
	awe_voice_info *vlist[AWE_MAX_VOICES];

	if (MULTI_LAYER_MODE() && IS_DRUM_CHANNEL(ch))
		bank = AWE_DRUM_BANK; /* always search drumset */
	else
		bank = channels[ch].bank;

	/* check the possible voices; note may be changeable if mapped */
	nvoices = really_alloc_voices(bank, channels[ch].instr,
				      &note, velocity, vlist);

	/* set the voices */
	current_alloc_time++;
	for (i = 0; i < nvoices; i++) {
		v = awe_clear_voice();
		voices[v].key = key;
		voices[v].ch = ch;
		voices[v].note = note;
		voices[v].velocity = velocity;
		voices[v].time = current_alloc_time;
		voices[v].cinfo = &channels[ch];
		voices[v].sample = vlist[i];
		voices[v].state = AWE_ST_MARK;
		voices[v].layer = nvoices - i - 1;  /* in reverse order */
	}

	/* clear the mark in allocated voices */
	for (i = 0; i < awe_max_voices; i++) {
		if (voices[i].state == AWE_ST_MARK)
			voices[i].state = AWE_ST_OFF;
			
	}
}


/* search an empty voice.
   if no empty voice is found, at least terminate a voice
   */
static int
awe_clear_voice(void)
{
	enum {
		OFF=0, RELEASED, SUSTAINED, PLAYING, END
	};
	struct voice_candidate_t {
		int best;
		int time;
		int vtarget;
	} candidate[END];
	int i, type, vtarget;

	vtarget = 0xffff;
	for (type = OFF; type < END; type++) {
		candidate[type].best = -1;
		candidate[type].time = current_alloc_time + 1;
		candidate[type].vtarget = vtarget;
	}

	for (i = 0; i < awe_max_voices; i++) {
		if (voices[i].state & AWE_ST_OFF)
			type = OFF;
		else if (voices[i].state & AWE_ST_RELEASED)
			type = RELEASED;
		else if (voices[i].state & AWE_ST_SUSTAINED)
			type = SUSTAINED;
		else if (voices[i].state & ~AWE_ST_MARK)
			type = PLAYING;
		else
			continue;
#ifdef AWE_CHECK_VTARGET
		/* get current volume */
		vtarget = (awe_peek_dw(AWE_VTFT(i)) >> 16) & 0xffff;
#endif
		if (candidate[type].best < 0 ||
		    vtarget < candidate[type].vtarget ||
		    (vtarget == candidate[type].vtarget &&
		     voices[i].time < candidate[type].time)) {
			candidate[type].best = i;
			candidate[type].time = voices[i].time;
			candidate[type].vtarget = vtarget;
		}
	}

	for (type = OFF; type < END; type++) {
		if ((i = candidate[type].best) >= 0) {
			if (voices[i].state != AWE_ST_OFF)
				awe_terminate(i);
			awe_voice_init(i, TRUE);
			return i;
		}
	}
	return 0;
}


/* search sample for the specified note & velocity and set it on the voice;
 * note that voice is the voice index (not channel index)
 */
static void
awe_alloc_one_voice(int voice, int note, int velocity)
{
	int ch, nvoices, bank;
	awe_voice_info *vlist[AWE_MAX_VOICES];

	ch = voices[voice].ch;
	if (MULTI_LAYER_MODE() && IS_DRUM_CHANNEL(voice))
		bank = AWE_DRUM_BANK; /* always search drumset */
	else
		bank = voices[voice].cinfo->bank;

	nvoices = really_alloc_voices(bank, voices[voice].cinfo->instr,
				      &note, velocity, vlist);
	if (nvoices > 0) {
		voices[voice].time = ++current_alloc_time;
		voices[voice].sample = vlist[0]; /* use the first one */
		voices[voice].layer = 0;
		voices[voice].note = note;
		voices[voice].velocity = velocity;
	}
}


/*
 * sequencer2 functions
 */

/* search an empty voice; used by sequencer2 */
static int
awe_alloc(int dev, int chn, int note, struct voice_alloc_info *alloc)
{
	playing_mode = AWE_PLAY_MULTI2;
	awe_info.nr_voices = AWE_MAX_CHANNELS;
	return awe_clear_voice();
}


/* set up voice; used by sequencer2 */
static void
awe_setup_voice(int dev, int voice, int chn)
{
	struct channel_info *info;
	if (synth_devs[dev] == NULL ||
	    (info = &synth_devs[dev]->chn_info[chn]) == NULL)
		return;

	if (voice < 0 || voice >= awe_max_voices)
		return;

	DEBUG(2,printk("AWE32: [setup(%d) ch=%d]\n", voice, chn));
	channels[chn].expression_vol = info->controllers[CTL_EXPRESSION];
	channels[chn].main_vol = info->controllers[CTL_MAIN_VOLUME];
	channels[chn].panning =
		info->controllers[CTL_PAN] * 2 - 128; /* signed 8bit */
	channels[chn].bender = info->bender_value; /* zero center */
	channels[chn].bank = info->controllers[CTL_BANK_SELECT];
	channels[chn].sustained = info->controllers[CTL_SUSTAIN];
	if (info->controllers[CTL_EXT_EFF_DEPTH]) {
		FX_SET(&channels[chn].fx, AWE_FX_REVERB,
		       info->controllers[CTL_EXT_EFF_DEPTH] * 2);
	}
	if (info->controllers[CTL_CHORUS_DEPTH]) {
		FX_SET(&channels[chn].fx, AWE_FX_CHORUS,
		       info->controllers[CTL_CHORUS_DEPTH] * 2);
	}
	awe_set_instr(dev, chn, info->pgm_num);
}


#ifdef CONFIG_AWE32_MIXER
/*
 * AWE32 mixer device control
 */

static int awe_mixer_ioctl(int dev, unsigned int cmd, void __user *arg);

static int my_mixerdev = -1;

static struct mixer_operations awe_mixer_operations = {
	.owner	= THIS_MODULE,
	.id	= "AWE",
	.name	= "AWE32 Equalizer",
	.ioctl	= awe_mixer_ioctl,
};

static void __init attach_mixer(void)
{
	if ((my_mixerdev = sound_alloc_mixerdev()) >= 0) {
		mixer_devs[my_mixerdev] = &awe_mixer_operations;
	}
}

static void unload_mixer(void)
{
	if (my_mixerdev >= 0)
		sound_unload_mixerdev(my_mixerdev);
}

static int
awe_mixer_ioctl(int dev, unsigned int cmd, void __user * arg)
{
	int i, level, value;

	if (((cmd >> 8) & 0xff) != 'M')
		return -EINVAL;

	if (get_user(level, (int __user *)arg))
		return -EFAULT;
	level = ((level & 0xff) + (level >> 8)) / 2;
	DEBUG(0,printk("AWEMix: cmd=%x val=%d\n", cmd & 0xff, level));

	if (_SIOC_DIR(cmd) & _SIOC_WRITE) {
		switch (cmd & 0xff) {
		case SOUND_MIXER_BASS:
			value = level * 12 / 100;
			if (value >= 12)
				value = 11;
			ctrls[AWE_MD_BASS_LEVEL] = value;
			awe_update_equalizer();
			break;
		case SOUND_MIXER_TREBLE:
			value = level * 12 / 100;
			if (value >= 12)
				value = 11;
			ctrls[AWE_MD_TREBLE_LEVEL] = value;
			awe_update_equalizer();
			break;
		case SOUND_MIXER_VOLUME:
			level = level * 127 / 100;
			if (level >= 128) level = 127;
			atten_relative = FALSE;
			atten_offset = vol_table[level];
			awe_update_volume();
			break;
		}
	}
	switch (cmd & 0xff) {
	case SOUND_MIXER_BASS:
		level = ctrls[AWE_MD_BASS_LEVEL] * 100 / 24;
		level = (level << 8) | level;
		break;
	case SOUND_MIXER_TREBLE:
		level = ctrls[AWE_MD_TREBLE_LEVEL] * 100 / 24;
		level = (level << 8) | level;
		break;
	case SOUND_MIXER_VOLUME:
		value = atten_offset;
		if (atten_relative)
			value += ctrls[AWE_MD_ZERO_ATTEN];
		for (i = 127; i > 0; i--) {
			if (value <= vol_table[i])
				break;
		}
		level = i * 100 / 127;
		level = (level << 8) | level;
		break;
	case SOUND_MIXER_DEVMASK:
		level = SOUND_MASK_BASS|SOUND_MASK_TREBLE|SOUND_MASK_VOLUME;
		break;
	default:
		level = 0;
		break;
	}
	if (put_user(level, (int __user *)arg))
		return -EFAULT;
	return level;
}
#endif /* CONFIG_AWE32_MIXER */


/*
 * initialization of Emu8000
 */

/* intiailize audio channels */
static void
awe_init_audio(void)
{
	int ch;

	/* turn off envelope engines */
	for (ch = 0; ch < AWE_MAX_VOICES; ch++) {
		awe_poke(AWE_DCYSUSV(ch), 0x80);
	}
  
	/* reset all other parameters to zero */
	for (ch = 0; ch < AWE_MAX_VOICES; ch++) {
		awe_poke(AWE_ENVVOL(ch), 0);
		awe_poke(AWE_ENVVAL(ch), 0);
		awe_poke(AWE_DCYSUS(ch), 0);
		awe_poke(AWE_ATKHLDV(ch), 0);
		awe_poke(AWE_LFO1VAL(ch), 0);
		awe_poke(AWE_ATKHLD(ch), 0);
		awe_poke(AWE_LFO2VAL(ch), 0);
		awe_poke(AWE_IP(ch), 0);
		awe_poke(AWE_IFATN(ch), 0);
		awe_poke(AWE_PEFE(ch), 0);
		awe_poke(AWE_FMMOD(ch), 0);
		awe_poke(AWE_TREMFRQ(ch), 0);
		awe_poke(AWE_FM2FRQ2(ch), 0);
		awe_poke_dw(AWE_PTRX(ch), 0);
		awe_poke_dw(AWE_VTFT(ch), 0);
		awe_poke_dw(AWE_PSST(ch), 0);
		awe_poke_dw(AWE_CSL(ch), 0);
		awe_poke_dw(AWE_CCCA(ch), 0);
	}

	for (ch = 0; ch < AWE_MAX_VOICES; ch++) {
		awe_poke_dw(AWE_CPF(ch), 0);
		awe_poke_dw(AWE_CVCF(ch), 0);
	}
}


/* initialize DMA address */
static void
awe_init_dma(void)
{
	awe_poke_dw(AWE_SMALR, 0);
	awe_poke_dw(AWE_SMARR, 0);
	awe_poke_dw(AWE_SMALW, 0);
	awe_poke_dw(AWE_SMARW, 0);
}


/* initialization arrays; from ADIP */

static unsigned short init1[128] = {
	0x03ff, 0x0030,  0x07ff, 0x0130, 0x0bff, 0x0230,  0x0fff, 0x0330,
	0x13ff, 0x0430,  0x17ff, 0x0530, 0x1bff, 0x0630,  0x1fff, 0x0730,
	0x23ff, 0x0830,  0x27ff, 0x0930, 0x2bff, 0x0a30,  0x2fff, 0x0b30,
	0x33ff, 0x0c30,  0x37ff, 0x0d30, 0x3bff, 0x0e30,  0x3fff, 0x0f30,

	0x43ff, 0x0030,  0x47ff, 0x0130, 0x4bff, 0x0230,  0x4fff, 0x0330,
	0x53ff, 0x0430,  0x57ff, 0x0530, 0x5bff, 0x0630,  0x5fff, 0x0730,
	0x63ff, 0x0830,  0x67ff, 0x0930, 0x6bff, 0x0a30,  0x6fff, 0x0b30,
	0x73ff, 0x0c30,  0x77ff, 0x0d30, 0x7bff, 0x0e30,  0x7fff, 0x0f30,

	0x83ff, 0x0030,  0x87ff, 0x0130, 0x8bff, 0x0230,  0x8fff, 0x0330,
	0x93ff, 0x0430,  0x97ff, 0x0530, 0x9bff, 0x0630,  0x9fff, 0x0730,
	0xa3ff, 0x0830,  0xa7ff, 0x0930, 0xabff, 0x0a30,  0xafff, 0x0b30,
	0xb3ff, 0x0c30,  0xb7ff, 0x0d30, 0xbbff, 0x0e30,  0xbfff, 0x0f30,

	0xc3ff, 0x0030,  0xc7ff, 0x0130, 0xcbff, 0x0230,  0xcfff, 0x0330,
	0xd3ff, 0x0430,  0xd7ff, 0x0530, 0xdbff, 0x0630,  0xdfff, 0x0730,
	0xe3ff, 0x0830,  0xe7ff, 0x0930, 0xebff, 0x0a30,  0xefff, 0x0b30,
	0xf3ff, 0x0c30,  0xf7ff, 0x0d30, 0xfbff, 0x0e30,  0xffff, 0x0f30,
};

static unsigned short init2[128] = {
	0x03ff, 0x8030, 0x07ff, 0x8130, 0x0bff, 0x8230, 0x0fff, 0x8330,
	0x13ff, 0x8430, 0x17ff, 0x8530, 0x1bff, 0x8630, 0x1fff, 0x8730,
	0x23ff, 0x8830, 0x27ff, 0x8930, 0x2bff, 0x8a30, 0x2fff, 0x8b30,
	0x33ff, 0x8c30, 0x37ff, 0x8d30, 0x3bff, 0x8e30, 0x3fff, 0x8f30,

	0x43ff, 0x8030, 0x47ff, 0x8130, 0x4bff, 0x8230, 0x4fff, 0x8330,
	0x53ff, 0x8430, 0x57ff, 0x8530, 0x5bff, 0x8630, 0x5fff, 0x8730,
	0x63ff, 0x8830, 0x67ff, 0x8930, 0x6bff, 0x8a30, 0x6fff, 0x8b30,
	0x73ff, 0x8c30, 0x77ff, 0x8d30, 0x7bff, 0x8e30, 0x7fff, 0x8f30,

	0x83ff, 0x8030, 0x87ff, 0x8130, 0x8bff, 0x8230, 0x8fff, 0x8330,
	0x93ff, 0x8430, 0x97ff, 0x8530, 0x9bff, 0x8630, 0x9fff, 0x8730,
	0xa3ff, 0x8830, 0xa7ff, 0x8930, 0xabff, 0x8a30, 0xafff, 0x8b30,
	0xb3ff, 0x8c30, 0xb7ff, 0x8d30, 0xbbff, 0x8e30, 0xbfff, 0x8f30,

	0xc3ff, 0x8030, 0xc7ff, 0x8130, 0xcbff, 0x8230, 0xcfff, 0x8330,
	0xd3ff, 0x8430, 0xd7ff, 0x8530, 0xdbff, 0x8630, 0xdfff, 0x8730,
	0xe3ff, 0x8830, 0xe7ff, 0x8930, 0xebff, 0x8a30, 0xefff, 0x8b30,
	0xf3ff, 0x8c30, 0xf7ff, 0x8d30, 0xfbff, 0x8e30, 0xffff, 0x8f30,
};

static unsigned short init3[128] = {
	0x0C10, 0x8470, 0x14FE, 0xB488, 0x167F, 0xA470, 0x18E7, 0x84B5,
	0x1B6E, 0x842A, 0x1F1D, 0x852A, 0x0DA3, 0x8F7C, 0x167E, 0xF254,
	0x0000, 0x842A, 0x0001, 0x852A, 0x18E6, 0x8BAA, 0x1B6D, 0xF234,
	0x229F, 0x8429, 0x2746, 0x8529, 0x1F1C, 0x86E7, 0x229E, 0xF224,

	0x0DA4, 0x8429, 0x2C29, 0x8529, 0x2745, 0x87F6, 0x2C28, 0xF254,
	0x383B, 0x8428, 0x320F, 0x8528, 0x320E, 0x8F02, 0x1341, 0xF264,
	0x3EB6, 0x8428, 0x3EB9, 0x8528, 0x383A, 0x8FA9, 0x3EB5, 0xF294,
	0x3EB7, 0x8474, 0x3EBA, 0x8575, 0x3EB8, 0xC4C3, 0x3EBB, 0xC5C3,

	0x0000, 0xA404, 0x0001, 0xA504, 0x141F, 0x8671, 0x14FD, 0x8287,
	0x3EBC, 0xE610, 0x3EC8, 0x8C7B, 0x031A, 0x87E6, 0x3EC8, 0x86F7,
	0x3EC0, 0x821E, 0x3EBE, 0xD208, 0x3EBD, 0x821F, 0x3ECA, 0x8386,
	0x3EC1, 0x8C03, 0x3EC9, 0x831E, 0x3ECA, 0x8C4C, 0x3EBF, 0x8C55,

	0x3EC9, 0xC208, 0x3EC4, 0xBC84, 0x3EC8, 0x8EAD, 0x3EC8, 0xD308,
	0x3EC2, 0x8F7E, 0x3ECB, 0x8219, 0x3ECB, 0xD26E, 0x3EC5, 0x831F,
	0x3EC6, 0xC308, 0x3EC3, 0xB2FF, 0x3EC9, 0x8265, 0x3EC9, 0x8319,
	0x1342, 0xD36E, 0x3EC7, 0xB3FF, 0x0000, 0x8365, 0x1420, 0x9570,
};

static unsigned short init4[128] = {
	0x0C10, 0x8470, 0x14FE, 0xB488, 0x167F, 0xA470, 0x18E7, 0x84B5,
	0x1B6E, 0x842A, 0x1F1D, 0x852A, 0x0DA3, 0x0F7C, 0x167E, 0x7254,
	0x0000, 0x842A, 0x0001, 0x852A, 0x18E6, 0x0BAA, 0x1B6D, 0x7234,
	0x229F, 0x8429, 0x2746, 0x8529, 0x1F1C, 0x06E7, 0x229E, 0x7224,

	0x0DA4, 0x8429, 0x2C29, 0x8529, 0x2745, 0x07F6, 0x2C28, 0x7254,
	0x383B, 0x8428, 0x320F, 0x8528, 0x320E, 0x0F02, 0x1341, 0x7264,
	0x3EB6, 0x8428, 0x3EB9, 0x8528, 0x383A, 0x0FA9, 0x3EB5, 0x7294,
	0x3EB7, 0x8474, 0x3EBA, 0x8575, 0x3EB8, 0x44C3, 0x3EBB, 0x45C3,

	0x0000, 0xA404, 0x0001, 0xA504, 0x141F, 0x0671, 0x14FD, 0x0287,
	0x3EBC, 0xE610, 0x3EC8, 0x0C7B, 0x031A, 0x07E6, 0x3EC8, 0x86F7,
	0x3EC0, 0x821E, 0x3EBE, 0xD208, 0x3EBD, 0x021F, 0x3ECA, 0x0386,
	0x3EC1, 0x0C03, 0x3EC9, 0x031E, 0x3ECA, 0x8C4C, 0x3EBF, 0x0C55,

	0x3EC9, 0xC208, 0x3EC4, 0xBC84, 0x3EC8, 0x0EAD, 0x3EC8, 0xD308,
	0x3EC2, 0x8F7E, 0x3ECB, 0x0219, 0x3ECB, 0xD26E, 0x3EC5, 0x031F,
	0x3EC6, 0xC308, 0x3EC3, 0x32FF, 0x3EC9, 0x0265, 0x3EC9, 0x8319,
	0x1342, 0xD36E, 0x3EC7, 0x33FF, 0x0000, 0x8365, 0x1420, 0x9570,
};


/* send initialization arrays to start up */
static void
awe_init_array(void)
{
	awe_send_array(init1);
	awe_wait(1024);
	awe_send_array(init2);
	awe_send_array(init3);
	awe_poke_dw(AWE_HWCF4, 0);
	awe_poke_dw(AWE_HWCF5, 0x83);
	awe_poke_dw(AWE_HWCF6, 0x8000);
	awe_send_array(init4);
}

/* send an initialization array */
static void
awe_send_array(unsigned short *data)
{
	int i;
	unsigned short *p;

	p = data;
	for (i = 0; i < AWE_MAX_VOICES; i++, p++)
		awe_poke(AWE_INIT1(i), *p);
	for (i = 0; i < AWE_MAX_VOICES; i++, p++)
		awe_poke(AWE_INIT2(i), *p);
	for (i = 0; i < AWE_MAX_VOICES; i++, p++)
		awe_poke(AWE_INIT3(i), *p);
	for (i = 0; i < AWE_MAX_VOICES; i++, p++)
		awe_poke(AWE_INIT4(i), *p);
}


/*
 * set up awe32 channels to some known state.
 */

/* set the envelope & LFO parameters to the default values; see ADIP */
static void
awe_tweak_voice(int i)
{
	/* set all mod/vol envelope shape to minimum */
	awe_poke(AWE_ENVVOL(i), 0x8000);
	awe_poke(AWE_ENVVAL(i), 0x8000);
	awe_poke(AWE_DCYSUS(i), 0x7F7F);
	awe_poke(AWE_ATKHLDV(i), 0x7F7F);
	awe_poke(AWE_ATKHLD(i), 0x7F7F);
	awe_poke(AWE_PEFE(i), 0);  /* mod envelope height to zero */
	awe_poke(AWE_LFO1VAL(i), 0x8000); /* no delay for LFO1 */
	awe_poke(AWE_LFO2VAL(i), 0x8000);
	awe_poke(AWE_IP(i), 0xE000);	/* no pitch shift */
	awe_poke(AWE_IFATN(i), 0xFF00);	/* volume to minimum */
	awe_poke(AWE_FMMOD(i), 0);
	awe_poke(AWE_TREMFRQ(i), 0);
	awe_poke(AWE_FM2FRQ2(i), 0);
}

static void
awe_tweak(void)
{
	int i;
	/* reset all channels */
	for (i = 0; i < awe_max_voices; i++)
		awe_tweak_voice(i);
}


/*
 *  initializes the FM section of AWE32;
 *   see Vince Vu's unofficial AWE32 programming guide
 */

static void
awe_init_fm(void)
{
#ifndef AWE_ALWAYS_INIT_FM
	/* if no extended memory is on board.. */
	if (memsize <= 0)
		return;
#endif
	DEBUG(3,printk("AWE32: initializing FM\n"));

	/* Initialize the last two channels for DRAM refresh and producing
	   the reverb and chorus effects for Yamaha OPL-3 synthesizer */

	/* 31: FM left channel, 0xffffe0-0xffffe8 */
	awe_poke(AWE_DCYSUSV(30), 0x80);
	awe_poke_dw(AWE_PSST(30), 0xFFFFFFE0); /* full left */
	awe_poke_dw(AWE_CSL(30), 0x00FFFFE8 |
		    (DEF_FM_CHORUS_DEPTH << 24));
	awe_poke_dw(AWE_PTRX(30), (DEF_FM_REVERB_DEPTH << 8));
	awe_poke_dw(AWE_CPF(30), 0);
	awe_poke_dw(AWE_CCCA(30), 0x00FFFFE3);

	/* 32: FM right channel, 0xfffff0-0xfffff8 */
	awe_poke(AWE_DCYSUSV(31), 0x80);
	awe_poke_dw(AWE_PSST(31), 0x00FFFFF0); /* full right */
	awe_poke_dw(AWE_CSL(31), 0x00FFFFF8 |
		    (DEF_FM_CHORUS_DEPTH << 24));
	awe_poke_dw(AWE_PTRX(31), (DEF_FM_REVERB_DEPTH << 8));
	awe_poke_dw(AWE_CPF(31), 0x8000);
	awe_poke_dw(AWE_CCCA(31), 0x00FFFFF3);

	/* skew volume & cutoff */
	awe_poke_dw(AWE_VTFT(30), 0x8000FFFF);
	awe_poke_dw(AWE_VTFT(31), 0x8000FFFF);

	voices[30].state = AWE_ST_FM;
	voices[31].state = AWE_ST_FM;

	/* change maximum channels to 30 */
	awe_max_voices = AWE_NORMAL_VOICES;
	if (playing_mode == AWE_PLAY_DIRECT)
		awe_info.nr_voices = awe_max_voices;
	else
		awe_info.nr_voices = AWE_MAX_CHANNELS;
	voice_alloc->max_voice = awe_max_voices;
}

/*
 *  AWE32 DRAM access routines
 */

/* open DRAM write accessing mode */
static int
awe_open_dram_for_write(int offset, int channels)
{
	int vidx[AWE_NORMAL_VOICES];
	int i;

	if (channels < 0 || channels >= AWE_NORMAL_VOICES) {
		channels = AWE_NORMAL_VOICES;
		for (i = 0; i < AWE_NORMAL_VOICES; i++)
			vidx[i] = i;
	} else {
		for (i = 0; i < channels; i++) {
			vidx[i] = awe_clear_voice();
			voices[vidx[i]].state = AWE_ST_MARK;
		}
	}

	/* use all channels for DMA transfer */
	for (i = 0; i < channels; i++) {
		if (vidx[i] < 0) continue;
		awe_poke(AWE_DCYSUSV(vidx[i]), 0x80);
		awe_poke_dw(AWE_VTFT(vidx[i]), 0);
		awe_poke_dw(AWE_CVCF(vidx[i]), 0);
		awe_poke_dw(AWE_PTRX(vidx[i]), 0x40000000);
		awe_poke_dw(AWE_CPF(vidx[i]), 0x40000000);
		awe_poke_dw(AWE_PSST(vidx[i]), 0);
		awe_poke_dw(AWE_CSL(vidx[i]), 0);
		awe_poke_dw(AWE_CCCA(vidx[i]), 0x06000000);
		voices[vidx[i]].state = AWE_ST_DRAM;
	}
	/* point channels 31 & 32 to ROM samples for DRAM refresh */
	awe_poke_dw(AWE_VTFT(30), 0);
	awe_poke_dw(AWE_PSST(30), 0x1d8);
	awe_poke_dw(AWE_CSL(30), 0x1e0);
	awe_poke_dw(AWE_CCCA(30), 0x1d8);
	awe_poke_dw(AWE_VTFT(31), 0);
	awe_poke_dw(AWE_PSST(31), 0x1d8);
	awe_poke_dw(AWE_CSL(31), 0x1e0);
	awe_poke_dw(AWE_CCCA(31), 0x1d8);
	voices[30].state = AWE_ST_FM;
	voices[31].state = AWE_ST_FM;

	/* if full bit is on, not ready to write on */
	if (awe_peek_dw(AWE_SMALW) & 0x80000000) {
		for (i = 0; i < channels; i++) {
			awe_poke_dw(AWE_CCCA(vidx[i]), 0);
			voices[vidx[i]].state = AWE_ST_OFF;
		}
		printk("awe: not ready to write..\n");
		return -EPERM;
	}

	/* set address to write */
	awe_poke_dw(AWE_SMALW, offset);

	return 0;
}

/* open DRAM for RAM size detection */
static void
awe_open_dram_for_check(void)
{
	int i;
	for (i = 0; i < AWE_NORMAL_VOICES; i++) {
		awe_poke(AWE_DCYSUSV(i), 0x80);
		awe_poke_dw(AWE_VTFT(i), 0);
		awe_poke_dw(AWE_CVCF(i), 0);
		awe_poke_dw(AWE_PTRX(i), 0x40000000);
		awe_poke_dw(AWE_CPF(i), 0x40000000);
		awe_poke_dw(AWE_PSST(i), 0);
		awe_poke_dw(AWE_CSL(i), 0);
		if (i & 1) /* DMA write */
			awe_poke_dw(AWE_CCCA(i), 0x06000000);
		else	   /* DMA read */
			awe_poke_dw(AWE_CCCA(i), 0x04000000);
		voices[i].state = AWE_ST_DRAM;
	}
}


/* close dram access */
static void
awe_close_dram(void)
{
	int i;
	/* wait until FULL bit in SMAxW register be false */
	for (i = 0; i < 10000; i++) {
		if (!(awe_peek_dw(AWE_SMALW) & 0x80000000))
			break;
		awe_wait(10);
	}

	for (i = 0; i < AWE_NORMAL_VOICES; i++) {
		if (voices[i].state == AWE_ST_DRAM) {
			awe_poke_dw(AWE_CCCA(i), 0);
			awe_poke(AWE_DCYSUSV(i), 0x807F);
			voices[i].state = AWE_ST_OFF;
		}
	}
}


/*
 * check dram size on AWE board
 */

/* any three numbers you like */
#define UNIQUE_ID1	0x1234
#define UNIQUE_ID2	0x4321
#define UNIQUE_ID3	0xABCD

static void __init
awe_check_dram(void)
{
	if (awe_present) /* already initialized */
		return;

	if (memsize >= 0) { /* given by config file or module option */
		memsize *= 1024; /* convert to Kbytes */
		return;
	}

	awe_open_dram_for_check();

	memsize = 0;

	/* set up unique two id numbers */
	awe_poke_dw(AWE_SMALW, AWE_DRAM_OFFSET);
	awe_poke(AWE_SMLD, UNIQUE_ID1);
	awe_poke(AWE_SMLD, UNIQUE_ID2);

	while (memsize < AWE_MAX_DRAM_SIZE) {
		awe_wait(5);
		/* read a data on the DRAM start address */
		awe_poke_dw(AWE_SMALR, AWE_DRAM_OFFSET);
		awe_peek(AWE_SMLD); /* discard stale data  */
		if (awe_peek(AWE_SMLD) != UNIQUE_ID1)
			break;
		if (awe_peek(AWE_SMLD) != UNIQUE_ID2)
			break;
		memsize += 512;  /* increment 512kbytes */
		/* Write a unique data on the test address;
		 * if the address is out of range, the data is written on
		 * 0x200000(=AWE_DRAM_OFFSET).  Then the two id words are
		 * broken by this data.
		 */
		awe_poke_dw(AWE_SMALW, AWE_DRAM_OFFSET + memsize*512L);
		awe_poke(AWE_SMLD, UNIQUE_ID3);
		awe_wait(5);
		/* read a data on the just written DRAM address */
		awe_poke_dw(AWE_SMALR, AWE_DRAM_OFFSET + memsize*512L);
		awe_peek(AWE_SMLD); /* discard stale data  */
		if (awe_peek(AWE_SMLD) != UNIQUE_ID3)
			break;
	}
	awe_close_dram();

	DEBUG(0,printk("AWE32: %d Kbytes memory detected\n", memsize));

	/* convert to Kbytes */
	memsize *= 1024;
}


/*----------------------------------------------------------------*/

/*
 * chorus and reverb controls; from VV's guide
 */

/* 5 parameters for each chorus mode; 3 x 16bit, 2 x 32bit */
static char chorus_defined[AWE_CHORUS_NUMBERS];
static awe_chorus_fx_rec chorus_parm[AWE_CHORUS_NUMBERS] = {
	{0xE600, 0x03F6, 0xBC2C ,0x00000000, 0x0000006D}, /* chorus 1 */
	{0xE608, 0x031A, 0xBC6E, 0x00000000, 0x0000017C}, /* chorus 2 */
	{0xE610, 0x031A, 0xBC84, 0x00000000, 0x00000083}, /* chorus 3 */
	{0xE620, 0x0269, 0xBC6E, 0x00000000, 0x0000017C}, /* chorus 4 */
	{0xE680, 0x04D3, 0xBCA6, 0x00000000, 0x0000005B}, /* feedback */
	{0xE6E0, 0x044E, 0xBC37, 0x00000000, 0x00000026}, /* flanger */
	{0xE600, 0x0B06, 0xBC00, 0x0000E000, 0x00000083}, /* short delay */
	{0xE6C0, 0x0B06, 0xBC00, 0x0000E000, 0x00000083}, /* short delay + feedback */
};

static int
awe_load_chorus_fx(awe_patch_info *patch, const char __user *addr, int count)
{
	if (patch->optarg < AWE_CHORUS_PREDEFINED || patch->optarg >= AWE_CHORUS_NUMBERS) {
		printk(KERN_WARNING "AWE32 Error: invalid chorus mode %d for uploading\n", patch->optarg);
		return -EINVAL;
	}
	if (count < sizeof(awe_chorus_fx_rec)) {
		printk(KERN_WARNING "AWE32 Error: too short chorus fx parameters\n");
		return -EINVAL;
	}
	if (copy_from_user(&chorus_parm[patch->optarg], addr + AWE_PATCH_INFO_SIZE,
			   sizeof(awe_chorus_fx_rec)))
		return -EFAULT;
	chorus_defined[patch->optarg] = TRUE;
	return 0;
}

static void
awe_set_chorus_mode(int effect)
{
	if (effect < 0 || effect >= AWE_CHORUS_NUMBERS ||
	    (effect >= AWE_CHORUS_PREDEFINED && !chorus_defined[effect]))
		return;
	awe_poke(AWE_INIT3(9), chorus_parm[effect].feedback);
	awe_poke(AWE_INIT3(12), chorus_parm[effect].delay_offset);
	awe_poke(AWE_INIT4(3), chorus_parm[effect].lfo_depth);
	awe_poke_dw(AWE_HWCF4, chorus_parm[effect].delay);
	awe_poke_dw(AWE_HWCF5, chorus_parm[effect].lfo_freq);
	awe_poke_dw(AWE_HWCF6, 0x8000);
	awe_poke_dw(AWE_HWCF7, 0x0000);
}

static void
awe_update_chorus_mode(void)
{
	awe_set_chorus_mode(ctrls[AWE_MD_CHORUS_MODE]);
}

/*----------------------------------------------------------------*/

/* reverb mode settings; write the following 28 data of 16 bit length
 *   on the corresponding ports in the reverb_cmds array
 */
static char reverb_defined[AWE_CHORUS_NUMBERS];
static awe_reverb_fx_rec reverb_parm[AWE_REVERB_NUMBERS] = {
{{  /* room 1 */
	0xB488, 0xA450, 0x9550, 0x84B5, 0x383A, 0x3EB5, 0x72F4,
	0x72A4, 0x7254, 0x7204, 0x7204, 0x7204, 0x4416, 0x4516,
	0xA490, 0xA590, 0x842A, 0x852A, 0x842A, 0x852A, 0x8429,
	0x8529, 0x8429, 0x8529, 0x8428, 0x8528, 0x8428, 0x8528,
}},
{{  /* room 2 */
	0xB488, 0xA458, 0x9558, 0x84B5, 0x383A, 0x3EB5, 0x7284,
	0x7254, 0x7224, 0x7224, 0x7254, 0x7284, 0x4448, 0x4548,
	0xA440, 0xA540, 0x842A, 0x852A, 0x842A, 0x852A, 0x8429,
	0x8529, 0x8429, 0x8529, 0x8428, 0x8528, 0x8428, 0x8528,
}},
{{  /* room 3 */
	0xB488, 0xA460, 0x9560, 0x84B5, 0x383A, 0x3EB5, 0x7284,
	0x7254, 0x7224, 0x7224, 0x7254, 0x7284, 0x4416, 0x4516,
	0xA490, 0xA590, 0x842C, 0x852C, 0x842C, 0x852C, 0x842B,
	0x852B, 0x842B, 0x852B, 0x842A, 0x852A, 0x842A, 0x852A,
}},
{{  /* hall 1 */
	0xB488, 0xA470, 0x9570, 0x84B5, 0x383A, 0x3EB5, 0x7284,
	0x7254, 0x7224, 0x7224, 0x7254, 0x7284, 0x4448, 0x4548,
	0xA440, 0xA540, 0x842B, 0x852B, 0x842B, 0x852B, 0x842A,
	0x852A, 0x842A, 0x852A, 0x8429, 0x8529, 0x8429, 0x8529,
}},
{{  /* hall 2 */
	0xB488, 0xA470, 0x9570, 0x84B5, 0x383A, 0x3EB5, 0x7254,
	0x7234, 0x7224, 0x7254, 0x7264, 0x7294, 0x44C3, 0x45C3,
	0xA404, 0xA504, 0x842A, 0x852A, 0x842A, 0x852A, 0x8429,
	0x8529, 0x8429, 0x8529, 0x8428, 0x8528, 0x8428, 0x8528,
}},
{{  /* plate */
	0xB4FF, 0xA470, 0x9570, 0x84B5, 0x383A, 0x3EB5, 0x7234,
	0x7234, 0x7234, 0x7234, 0x7234, 0x7234, 0x4448, 0x4548,
	0xA440, 0xA540, 0x842A, 0x852A, 0x842A, 0x852A, 0x8429,
	0x8529, 0x8429, 0x8529, 0x8428, 0x8528, 0x8428, 0x8528,
}},
{{  /* delay */
	0xB4FF, 0xA470, 0x9500, 0x84B5, 0x333A, 0x39B5, 0x7204,
	0x7204, 0x7204, 0x7204, 0x7204, 0x72F4, 0x4400, 0x4500,
	0xA4FF, 0xA5FF, 0x8420, 0x8520, 0x8420, 0x8520, 0x8420,
	0x8520, 0x8420, 0x8520, 0x8420, 0x8520, 0x8420, 0x8520,
}},
{{  /* panning delay */
	0xB4FF, 0xA490, 0x9590, 0x8474, 0x333A, 0x39B5, 0x7204,
	0x7204, 0x7204, 0x7204, 0x7204, 0x72F4, 0x4400, 0x4500,
	0xA4FF, 0xA5FF, 0x8420, 0x8520, 0x8420, 0x8520, 0x8420,
	0x8520, 0x8420, 0x8520, 0x8420, 0x8520, 0x8420, 0x8520,
}},
};

static struct ReverbCmdPair {
	unsigned short cmd, port;
} reverb_cmds[28] = {
  {AWE_INIT1(0x03)}, {AWE_INIT1(0x05)}, {AWE_INIT4(0x1F)}, {AWE_INIT1(0x07)},
  {AWE_INIT2(0x14)}, {AWE_INIT2(0x16)}, {AWE_INIT1(0x0F)}, {AWE_INIT1(0x17)},
  {AWE_INIT1(0x1F)}, {AWE_INIT2(0x07)}, {AWE_INIT2(0x0F)}, {AWE_INIT2(0x17)},
  {AWE_INIT2(0x1D)}, {AWE_INIT2(0x1F)}, {AWE_INIT3(0x01)}, {AWE_INIT3(0x03)},
  {AWE_INIT1(0x09)}, {AWE_INIT1(0x0B)}, {AWE_INIT1(0x11)}, {AWE_INIT1(0x13)},
  {AWE_INIT1(0x19)}, {AWE_INIT1(0x1B)}, {AWE_INIT2(0x01)}, {AWE_INIT2(0x03)},
  {AWE_INIT2(0x09)}, {AWE_INIT2(0x0B)}, {AWE_INIT2(0x11)}, {AWE_INIT2(0x13)},
};

static int
awe_load_reverb_fx(awe_patch_info *patch, const char __user *addr, int count)
{
	if (patch->optarg < AWE_REVERB_PREDEFINED || patch->optarg >= AWE_REVERB_NUMBERS) {
		printk(KERN_WARNING "AWE32 Error: invalid reverb mode %d for uploading\n", patch->optarg);
		return -EINVAL;
	}
	if (count < sizeof(awe_reverb_fx_rec)) {
		printk(KERN_WARNING "AWE32 Error: too short reverb fx parameters\n");
		return -EINVAL;
	}
	if (copy_from_user(&reverb_parm[patch->optarg], addr + AWE_PATCH_INFO_SIZE,
			   sizeof(awe_reverb_fx_rec)))
		return -EFAULT;
	reverb_defined[patch->optarg] = TRUE;
	return 0;
}

static void
awe_set_reverb_mode(int effect)
{
	int i;
	if (effect < 0 || effect >= AWE_REVERB_NUMBERS ||
	    (effect >= AWE_REVERB_PREDEFINED && !reverb_defined[effect]))
		return;
	for (i = 0; i < 28; i++)
		awe_poke(reverb_cmds[i].cmd, reverb_cmds[i].port,
			 reverb_parm[effect].parms[i]);
}

static void
awe_update_reverb_mode(void)
{
	awe_set_reverb_mode(ctrls[AWE_MD_REVERB_MODE]);
}

/*
 * treble/bass equalizer control
 */

static unsigned short bass_parm[12][3] = {
	{0xD26A, 0xD36A, 0x0000}, /* -12 dB */
	{0xD25B, 0xD35B, 0x0000}, /*  -8 */
	{0xD24C, 0xD34C, 0x0000}, /*  -6 */
	{0xD23D, 0xD33D, 0x0000}, /*  -4 */
	{0xD21F, 0xD31F, 0x0000}, /*  -2 */
	{0xC208, 0xC308, 0x0001}, /*   0 (HW default) */
	{0xC219, 0xC319, 0x0001}, /*  +2 */
	{0xC22A, 0xC32A, 0x0001}, /*  +4 */
	{0xC24C, 0xC34C, 0x0001}, /*  +6 */
	{0xC26E, 0xC36E, 0x0001}, /*  +8 */
	{0xC248, 0xC348, 0x0002}, /* +10 */
	{0xC26A, 0xC36A, 0x0002}, /* +12 dB */
};

static unsigned short treble_parm[12][9] = {
	{0x821E, 0xC26A, 0x031E, 0xC36A, 0x021E, 0xD208, 0x831E, 0xD308, 0x0001}, /* -12 dB */
	{0x821E, 0xC25B, 0x031E, 0xC35B, 0x021E, 0xD208, 0x831E, 0xD308, 0x0001},
	{0x821E, 0xC24C, 0x031E, 0xC34C, 0x021E, 0xD208, 0x831E, 0xD308, 0x0001},
	{0x821E, 0xC23D, 0x031E, 0xC33D, 0x021E, 0xD208, 0x831E, 0xD308, 0x0001},
	{0x821E, 0xC21F, 0x031E, 0xC31F, 0x021E, 0xD208, 0x831E, 0xD308, 0x0001},
	{0x821E, 0xD208, 0x031E, 0xD308, 0x021E, 0xD208, 0x831E, 0xD308, 0x0002},
	{0x821E, 0xD208, 0x031E, 0xD308, 0x021D, 0xD219, 0x831D, 0xD319, 0x0002},
	{0x821E, 0xD208, 0x031E, 0xD308, 0x021C, 0xD22A, 0x831C, 0xD32A, 0x0002},
	{0x821E, 0xD208, 0x031E, 0xD308, 0x021A, 0xD24C, 0x831A, 0xD34C, 0x0002},
	{0x821E, 0xD208, 0x031E, 0xD308, 0x0219, 0xD26E, 0x8319, 0xD36E, 0x0002}, /* +8 (HW default) */
	{0x821D, 0xD219, 0x031D, 0xD319, 0x0219, 0xD26E, 0x8319, 0xD36E, 0x0002},
	{0x821C, 0xD22A, 0x031C, 0xD32A, 0x0219, 0xD26E, 0x8319, 0xD36E, 0x0002}, /* +12 dB */
};


/*
 * set Emu8000 digital equalizer; from 0 to 11 [-12dB - 12dB]
 */
static void
awe_equalizer(int bass, int treble)
{
	unsigned short w;

	if (bass < 0 || bass > 11 || treble < 0 || treble > 11)
		return;
	awe_poke(AWE_INIT4(0x01), bass_parm[bass][0]);
	awe_poke(AWE_INIT4(0x11), bass_parm[bass][1]);
	awe_poke(AWE_INIT3(0x11), treble_parm[treble][0]);
	awe_poke(AWE_INIT3(0x13), treble_parm[treble][1]);
	awe_poke(AWE_INIT3(0x1B), treble_parm[treble][2]);
	awe_poke(AWE_INIT4(0x07), treble_parm[treble][3]);
	awe_poke(AWE_INIT4(0x0B), treble_parm[treble][4]);
	awe_poke(AWE_INIT4(0x0D), treble_parm[treble][5]);
	awe_poke(AWE_INIT4(0x17), treble_parm[treble][6]);
	awe_poke(AWE_INIT4(0x19), treble_parm[treble][7]);
	w = bass_parm[bass][2] + treble_parm[treble][8];
	awe_poke(AWE_INIT4(0x15), (unsigned short)(w + 0x0262));
	awe_poke(AWE_INIT4(0x1D), (unsigned short)(w + 0x8362));
}

static void awe_update_equalizer(void)
{
	awe_equalizer(ctrls[AWE_MD_BASS_LEVEL], ctrls[AWE_MD_TREBLE_LEVEL]);
}


/*----------------------------------------------------------------*/

#ifdef CONFIG_AWE32_MIDIEMU

/*
 * Emu8000 MIDI Emulation
 */

/*
 * midi queue record
 */

/* queue type */
enum { Q_NONE, Q_VARLEN, Q_READ, Q_SYSEX, };

#define MAX_MIDIBUF	64

/* midi status */
typedef struct MidiStatus {
	int queue;	/* queue type */
	int qlen;	/* queue length */
	int read;	/* chars read */
	int status;	/* current status */
	int chan;	/* current channel */
	unsigned char buf[MAX_MIDIBUF];
} MidiStatus;

/* MIDI mode type */
enum { MODE_GM, MODE_GS, MODE_XG, };

/* NRPN / CC -> Emu8000 parameter converter */
typedef struct {
	int control;
	int awe_effect;
	unsigned short (*convert)(int val);
} ConvTable;


/*
 * prototypes
 */

static int awe_midi_open(int dev, int mode, void (*input)(int,unsigned char), void (*output)(int));
static void awe_midi_close(int dev);
static int awe_midi_ioctl(int dev, unsigned cmd, void __user * arg);
static int awe_midi_outputc(int dev, unsigned char midi_byte);

static void init_midi_status(MidiStatus *st);
static void clear_rpn(void);
static void get_midi_char(MidiStatus *st, int c);
/*static void queue_varlen(MidiStatus *st, int c);*/
static void special_event(MidiStatus *st, int c);
static void queue_read(MidiStatus *st, int c);
static void midi_note_on(MidiStatus *st);
static void midi_note_off(MidiStatus *st);
static void midi_key_pressure(MidiStatus *st);
static void midi_channel_pressure(MidiStatus *st);
static void midi_pitch_wheel(MidiStatus *st);
static void midi_program_change(MidiStatus *st);
static void midi_control_change(MidiStatus *st);
static void midi_select_bank(MidiStatus *st, int val);
static void midi_nrpn_event(MidiStatus *st);
static void midi_rpn_event(MidiStatus *st);
static void midi_detune(int chan, int coarse, int fine);
static void midi_system_exclusive(MidiStatus *st);
static int send_converted_effect(ConvTable *table, int num_tables, MidiStatus *st, int type, int val);
static int add_converted_effect(ConvTable *table, int num_tables, MidiStatus *st, int type, int val);
static int xg_control_change(MidiStatus *st, int cmd, int val);

#define numberof(ary)	(sizeof(ary)/sizeof(ary[0]))


/*
 * OSS Midi device record
 */

static struct midi_operations awe_midi_operations =
{
	.owner		= THIS_MODULE,
	.info		= {"AWE Midi Emu", 0, 0, SNDCARD_SB},
	.in_info	= {0},
	.open		= awe_midi_open, /*open*/
	.close		= awe_midi_close, /*close*/
	.ioctl		= awe_midi_ioctl, /*ioctl*/
	.outputc	= awe_midi_outputc, /*outputc*/
};

static int my_mididev = -1;

static void __init attach_midiemu(void)
{
	if ((my_mididev = sound_alloc_mididev()) < 0)
		printk ("Sound: Too many midi devices detected\n");
	else
		midi_devs[my_mididev] = &awe_midi_operations;
}

static void unload_midiemu(void)
{
	if (my_mididev >= 0)
		sound_unload_mididev(my_mididev);
}


/*
 * open/close midi device
 */

static int midi_opened = FALSE;

static int midi_mode;
static int coarsetune, finetune;

static int xg_mapping = TRUE;
static int xg_bankmode;

/* effect sensitivity */

#define FX_CUTOFF	0
#define FX_RESONANCE	1
#define FX_ATTACK	2
#define FX_RELEASE	3
#define FX_VIBRATE	4
#define FX_VIBDEPTH	5
#define FX_VIBDELAY	6
#define FX_NUMS		7

#define DEF_FX_CUTOFF		170
#define DEF_FX_RESONANCE	6
#define DEF_FX_ATTACK		50
#define DEF_FX_RELEASE		50
#define DEF_FX_VIBRATE		30
#define DEF_FX_VIBDEPTH		4
#define DEF_FX_VIBDELAY		1500

/* effect sense: */
static int gs_sense[] = 
{
	DEF_FX_CUTOFF, DEF_FX_RESONANCE, DEF_FX_ATTACK, DEF_FX_RELEASE,
	DEF_FX_VIBRATE, DEF_FX_VIBDEPTH, DEF_FX_VIBDELAY
};
static int xg_sense[] = 
{
	DEF_FX_CUTOFF, DEF_FX_RESONANCE, DEF_FX_ATTACK, DEF_FX_RELEASE,
	DEF_FX_VIBRATE, DEF_FX_VIBDEPTH, DEF_FX_VIBDELAY
};


/* current status */
static MidiStatus curst;


static int
awe_midi_open (int dev, int mode,
	       void (*input)(int,unsigned char),
	       void (*output)(int))
{
	if (midi_opened)
		return -EBUSY;

	midi_opened = TRUE;

	midi_mode = MODE_GM;

	curst.queue = Q_NONE;
	curst.qlen = 0;
	curst.read = 0;
	curst.status = 0;
	curst.chan = 0;
	memset(curst.buf, 0, sizeof(curst.buf));

	init_midi_status(&curst);

	return 0;
}

static void
awe_midi_close (int dev)
{
	midi_opened = FALSE;
}


static int
awe_midi_ioctl (int dev, unsigned cmd, void __user *arg)
{
	return -EPERM;
}

static int
awe_midi_outputc (int dev, unsigned char midi_byte)
{
	if (! midi_opened)
		return 1;

	/* force to change playing mode */
	playing_mode = AWE_PLAY_MULTI;

	get_midi_char(&curst, midi_byte);
	return 1;
}


/*
 * initialize
 */

static void init_midi_status(MidiStatus *st)
{
	clear_rpn();
	coarsetune = 0;
	finetune = 0;
}


/*
 * RPN & NRPN
 */

#define MAX_MIDI_CHANNELS	16

/* RPN & NRPN */
static unsigned char nrpn[MAX_MIDI_CHANNELS];  /* current event is NRPN? */
static int msb_bit;  /* current event is msb for RPN/NRPN */
/* RPN & NRPN indeces */
static unsigned char rpn_msb[MAX_MIDI_CHANNELS], rpn_lsb[MAX_MIDI_CHANNELS];
/* RPN & NRPN values */
static int rpn_val[MAX_MIDI_CHANNELS];

static void clear_rpn(void)
{
	int i;
	for (i = 0; i < MAX_MIDI_CHANNELS; i++) {
		nrpn[i] = 0;
		rpn_msb[i] = 127;
		rpn_lsb[i] = 127;
		rpn_val[i] = 0;
	}
	msb_bit = 0;
}


/*
 * process midi queue
 */

/* status event types */
typedef void (*StatusEvent)(MidiStatus *st);
static struct StatusEventList {
	StatusEvent process;
	int qlen;
} status_event[8] = {
	{midi_note_off, 2},
	{midi_note_on, 2},
	{midi_key_pressure, 2},
	{midi_control_change, 2},
	{midi_program_change, 1},
	{midi_channel_pressure, 1},
	{midi_pitch_wheel, 2},
	{NULL, 0},
};


/* read a char from fifo and process it */
static void get_midi_char(MidiStatus *st, int c)
{
	if (c == 0xfe) {
		/* ignore active sense */
		st->queue = Q_NONE;
		return;
	}

	switch (st->queue) {
	/* case Q_VARLEN: queue_varlen(st, c); break;*/
	case Q_READ:
	case Q_SYSEX:
		queue_read(st, c);
		break;
	case Q_NONE:
		st->read = 0;
		if ((c & 0xf0) == 0xf0) {
			special_event(st, c);
		} else if (c & 0x80) { /* status change */
			st->status = (c >> 4) & 0x07;
			st->chan = c & 0x0f;
			st->queue = Q_READ;
			st->qlen = status_event[st->status].qlen;
			if (st->qlen == 0)
				st->queue = Q_NONE;
		}
		break;
	}
}

/* 0xfx events */
static void special_event(MidiStatus *st, int c)
{
	switch (c) {
	case 0xf0: /* system exclusive */
		st->queue = Q_SYSEX;
		st->qlen = 0;
		break;
	case 0xf1: /* MTC quarter frame */
	case 0xf3: /* song select */
		st->queue = Q_READ;
		st->qlen = 1;
		break;
	case 0xf2: /* song position */
		st->queue = Q_READ;
		st->qlen = 2;
		break;
	}
}

#if 0
/* read variable length value */
static void queue_varlen(MidiStatus *st, int c)
{
	st->qlen += (c & 0x7f);
	if (c & 0x80) {
		st->qlen <<= 7;
		return;
	}
	if (st->qlen <= 0) {
		st->qlen = 0;
		st->queue = Q_NONE;
	}
	st->queue = Q_READ;
	st->read = 0;
}
#endif


/* read a char */
static void queue_read(MidiStatus *st, int c)
{
	if (st->read < MAX_MIDIBUF) {
		if (st->queue != Q_SYSEX)
			c &= 0x7f;
		st->buf[st->read] = (unsigned char)c;
	}
	st->read++;
	if (st->queue == Q_SYSEX && c == 0xf7) {
		midi_system_exclusive(st);
		st->queue = Q_NONE;
	} else if (st->queue == Q_READ && st->read >= st->qlen) {
		if (status_event[st->status].process)
			status_event[st->status].process(st);
		st->queue = Q_NONE;
	}
}


/*
 * status events
 */

/* note on */
static void midi_note_on(MidiStatus *st)
{
	DEBUG(2,printk("midi: note_on (%d) %d %d\n", st->chan, st->buf[0], st->buf[1]));
	if (st->buf[1] == 0)
		midi_note_off(st);
	else
		awe_start_note(0, st->chan, st->buf[0], st->buf[1]);
}

/* note off */
static void midi_note_off(MidiStatus *st)
{
	DEBUG(2,printk("midi: note_off (%d) %d %d\n", st->chan, st->buf[0], st->buf[1]));
	awe_kill_note(0, st->chan, st->buf[0], st->buf[1]);
}

/* key pressure change */
static void midi_key_pressure(MidiStatus *st)
{
	awe_key_pressure(0, st->chan, st->buf[0], st->buf[1]);
}

/* channel pressure change */
static void midi_channel_pressure(MidiStatus *st)
{
	channels[st->chan].chan_press = st->buf[0];
	awe_modwheel_change(st->chan, st->buf[0]);
}

/* pitch wheel change */
static void midi_pitch_wheel(MidiStatus *st)
{
	int val = (int)st->buf[1] * 128 + st->buf[0];
	awe_bender(0, st->chan, val);
}

/* program change */
static void midi_program_change(MidiStatus *st)
{
	int preset;
	preset = st->buf[0];
	if (midi_mode == MODE_GS && IS_DRUM_CHANNEL(st->chan) && preset == 127)
		preset = 0;
	else if (midi_mode == MODE_XG && xg_mapping && IS_DRUM_CHANNEL(st->chan))
		preset += 64;

	awe_set_instr(0, st->chan, preset);
}

#define send_effect(chan,type,val) awe_send_effect(chan,-1,type,val)
#define add_effect(chan,type,val) awe_send_effect(chan,-1,(type)|0x80,val)
#define unset_effect(chan,type) awe_send_effect(chan,-1,(type)|0x40,0)

/* midi control change */
static void midi_control_change(MidiStatus *st)
{
	int cmd = st->buf[0];
	int val = st->buf[1];

	DEBUG(2,printk("midi: control (%d) %d %d\n", st->chan, cmd, val));
	if (midi_mode == MODE_XG) {
		if (xg_control_change(st, cmd, val))
			return;
	}

	/* controls #31 - #64 are LSB of #0 - #31 */
	msb_bit = 1;
	if (cmd >= 0x20 && cmd < 0x40) {
		msb_bit = 0;
		cmd -= 0x20;
	}

	switch (cmd) {
	case CTL_SOFT_PEDAL:
		if (val == 127)
			add_effect(st->chan, AWE_FX_CUTOFF, -160);
		else
			unset_effect(st->chan, AWE_FX_CUTOFF);
		break;

	case CTL_BANK_SELECT:
		midi_select_bank(st, val);
		break;
		
	/* set RPN/NRPN parameter */
	case CTL_REGIST_PARM_NUM_MSB:
		nrpn[st->chan]=0; rpn_msb[st->chan]=val;
		break;
	case CTL_REGIST_PARM_NUM_LSB:
		nrpn[st->chan]=0; rpn_lsb[st->chan]=val;
		break;
	case CTL_NONREG_PARM_NUM_MSB:
		nrpn[st->chan]=1; rpn_msb[st->chan]=val;
		break;
	case CTL_NONREG_PARM_NUM_LSB:
		nrpn[st->chan]=1; rpn_lsb[st->chan]=val;
		break;

	/* send RPN/NRPN entry */
	case CTL_DATA_ENTRY:
		if (msb_bit)
			rpn_val[st->chan] = val * 128;
		else
			rpn_val[st->chan] |= val;
		if (nrpn[st->chan])
			midi_nrpn_event(st);
		else
			midi_rpn_event(st);
		break;

	/* increase/decrease data entry */
	case CTL_DATA_INCREMENT:
		rpn_val[st->chan]++;
		midi_rpn_event(st);
		break;
	case CTL_DATA_DECREMENT:
		rpn_val[st->chan]--;
		midi_rpn_event(st);
		break;

	/* default */
	default:
		awe_controller(0, st->chan, cmd, val);
		break;
	}
}

/* tone bank change */
static void midi_select_bank(MidiStatus *st, int val)
{
	if (midi_mode == MODE_XG && msb_bit) {
		xg_bankmode = val;
		/* XG MSB value; not normal bank selection */
		switch (val) {
		case 127: /* remap to drum channel */
			awe_controller(0, st->chan, CTL_BANK_SELECT, 128);
			break;
		default: /* remap to normal channel */
			awe_controller(0, st->chan, CTL_BANK_SELECT, val);
			break;
		}
		return;
	} else if (midi_mode == MODE_GS && !msb_bit)
		/* ignore LSB bank in GS mode (used for mapping) */
		return;

	/* normal bank controls; accept both MSB and LSB */
	if (! IS_DRUM_CHANNEL(st->chan)) {
		if (midi_mode == MODE_XG) {
			if (xg_bankmode) return;
			if (val == 64 || val == 126)
				val = 0;
		} else if (midi_mode == MODE_GS && val == 127)
			val = 0;
		awe_controller(0, st->chan, CTL_BANK_SELECT, val);
	}
}


/*
 * RPN events
 */

static void midi_rpn_event(MidiStatus *st)
{
	int type;
	type = (rpn_msb[st->chan]<<8) | rpn_lsb[st->chan];
	switch (type) {
	case 0x0000: /* Pitch bend sensitivity */
		/* MSB only / 1 semitone per 128 */
		if (msb_bit) {
			channels[st->chan].bender_range = 
				rpn_val[st->chan] * 100 / 128;
		}
		break;
					
	case 0x0001: /* fine tuning: */
		/* MSB/LSB, 8192=center, 100/8192 cent step */
		finetune = rpn_val[st->chan] - 8192;
		midi_detune(st->chan, coarsetune, finetune);
		break;

	case 0x0002: /* coarse tuning */
		/* MSB only / 8192=center, 1 semitone per 128 */
		if (msb_bit) {
			coarsetune = rpn_val[st->chan] - 8192;
			midi_detune(st->chan, coarsetune, finetune);
		}
		break;

	case 0x7F7F: /* "lock-in" RPN */
		break;
	}
}


/* tuning:
 *   coarse = -8192 to 8192 (100 cent per 128)
 *   fine = -8192 to 8192 (max=100cent)
 */
static void midi_detune(int chan, int coarse, int fine)
{
	/* 4096 = 1200 cents in AWE parameter */
	int val;
	val = coarse * 4096 / (12 * 128);
	val += fine / 24;
	if (val)
		send_effect(chan, AWE_FX_INIT_PITCH, val);
	else
		unset_effect(chan, AWE_FX_INIT_PITCH);
}


/*
 * system exclusive message
 * GM/GS/XG macros are accepted
 */

static void midi_system_exclusive(MidiStatus *st)
{
	/* GM on */
	static unsigned char gm_on_macro[] = {
		0x7e,0x7f,0x09,0x01,
	};
	/* XG on */
	static unsigned char xg_on_macro[] = {
		0x43,0x10,0x4c,0x00,0x00,0x7e,0x00,
	};
	/* GS prefix
	 * drum channel: XX=0x1?(channel), YY=0x15, ZZ=on/off
	 * reverb mode: XX=0x01, YY=0x30, ZZ=0-7
	 * chorus mode: XX=0x01, YY=0x38, ZZ=0-7
	 */
	static unsigned char gs_pfx_macro[] = {
		0x41,0x10,0x42,0x12,0x40,/*XX,YY,ZZ*/
	};

#if 0
	/* SC88 system mode set
	 * single module mode: XX=1
	 * double module mode: XX=0
	 */
	static unsigned char gs_mode_macro[] = {
		0x41,0x10,0x42,0x12,0x00,0x00,0x7F,/*ZZ*/
	};
	/* SC88 display macro: XX=01:bitmap, 00:text
	 */
	static unsigned char gs_disp_macro[] = {
		0x41,0x10,0x45,0x12,0x10,/*XX,00*/
	};
#endif

	/* GM on */
	if (memcmp(st->buf, gm_on_macro, sizeof(gm_on_macro)) == 0) {
		if (midi_mode != MODE_GS && midi_mode != MODE_XG)
			midi_mode = MODE_GM;
		init_midi_status(st);
	}

	/* GS macros */
	else if (memcmp(st->buf, gs_pfx_macro, sizeof(gs_pfx_macro)) == 0) {
		if (midi_mode != MODE_GS && midi_mode != MODE_XG)
			midi_mode = MODE_GS;

		if (st->buf[5] == 0x00 && st->buf[6] == 0x7f && st->buf[7] == 0x00) {
			/* GS reset */
			init_midi_status(st);
		}

		else if ((st->buf[5] & 0xf0) == 0x10 && st->buf[6] == 0x15) {
			/* drum pattern */
			int p = st->buf[5] & 0x0f;
			if (p == 0) p = 9;
			else if (p < 10) p--;
			if (st->buf[7] == 0)
				DRUM_CHANNEL_OFF(p);
			else
				DRUM_CHANNEL_ON(p);

		} else if ((st->buf[5] & 0xf0) == 0x10 && st->buf[6] == 0x21) {
			/* program */
			int p = st->buf[5] & 0x0f;
			if (p == 0) p = 9;
			else if (p < 10) p--;
			if (! IS_DRUM_CHANNEL(p))
				awe_set_instr(0, p, st->buf[7]);

		} else if (st->buf[5] == 0x01 && st->buf[6] == 0x30) {
			/* reverb mode */
			awe_set_reverb_mode(st->buf[7]);

		} else if (st->buf[5] == 0x01 && st->buf[6] == 0x38) {
			/* chorus mode */
			awe_set_chorus_mode(st->buf[7]);

		} else if (st->buf[5] == 0x00 && st->buf[6] == 0x04) {
			/* master volume */
			awe_change_master_volume(st->buf[7]);

		}
	}

	/* XG on */
	else if (memcmp(st->buf, xg_on_macro, sizeof(xg_on_macro)) == 0) {
		midi_mode = MODE_XG;
		xg_mapping = TRUE;
		xg_bankmode = 0;
	}
}


/*----------------------------------------------------------------*/

/*
 * convert NRPN/control values
 */

static int send_converted_effect(ConvTable *table, int num_tables, MidiStatus *st, int type, int val)
{
	int i, cval;
	for (i = 0; i < num_tables; i++) {
		if (table[i].control == type) {
			cval = table[i].convert(val);
			send_effect(st->chan, table[i].awe_effect, cval);
			return TRUE;
		}
	}
	return FALSE;
}

static int add_converted_effect(ConvTable *table, int num_tables, MidiStatus *st, int type, int val)
{
	int i, cval;
	for (i = 0; i < num_tables; i++) {
		if (table[i].control == type) {
			cval = table[i].convert(val);
			add_effect(st->chan, table[i].awe_effect|0x80, cval);
			return TRUE;
		}
	}
	return FALSE;
}


/*
 * AWE32 NRPN effects
 */

static unsigned short fx_delay(int val);
static unsigned short fx_attack(int val);
static unsigned short fx_hold(int val);
static unsigned short fx_decay(int val);
static unsigned short fx_the_value(int val);
static unsigned short fx_twice_value(int val);
static unsigned short fx_conv_pitch(int val);
static unsigned short fx_conv_Q(int val);

/* function for each NRPN */		/* [range]  units */
#define fx_env1_delay	fx_delay	/* [0,5900] 4msec */
#define fx_env1_attack	fx_attack	/* [0,5940] 1msec */
#define fx_env1_hold	fx_hold		/* [0,8191] 1msec */
#define fx_env1_decay	fx_decay	/* [0,5940] 4msec */
#define fx_env1_release	fx_decay	/* [0,5940] 4msec */
#define fx_env1_sustain	fx_the_value	/* [0,127] 0.75dB */
#define fx_env1_pitch	fx_the_value	/* [-127,127] 9.375cents */
#define fx_env1_cutoff	fx_the_value	/* [-127,127] 56.25cents */

#define fx_env2_delay	fx_delay	/* [0,5900] 4msec */
#define fx_env2_attack	fx_attack	/* [0,5940] 1msec */
#define fx_env2_hold	fx_hold		/* [0,8191] 1msec */
#define fx_env2_decay	fx_decay	/* [0,5940] 4msec */
#define fx_env2_release	fx_decay	/* [0,5940] 4msec */
#define fx_env2_sustain	fx_the_value	/* [0,127] 0.75dB */

#define fx_lfo1_delay	fx_delay	/* [0,5900] 4msec */
#define fx_lfo1_freq	fx_twice_value	/* [0,127] 84mHz */
#define fx_lfo1_volume	fx_twice_value	/* [0,127] 0.1875dB */
#define fx_lfo1_pitch	fx_the_value	/* [-127,127] 9.375cents */
#define fx_lfo1_cutoff	fx_twice_value	/* [-64,63] 56.25cents */

#define fx_lfo2_delay	fx_delay	/* [0,5900] 4msec */
#define fx_lfo2_freq	fx_twice_value	/* [0,127] 84mHz */
#define fx_lfo2_pitch	fx_the_value	/* [-127,127] 9.375cents */

#define fx_init_pitch	fx_conv_pitch	/* [-8192,8192] cents */
#define fx_chorus	fx_the_value	/* [0,255] -- */
#define fx_reverb	fx_the_value	/* [0,255] -- */
#define fx_cutoff	fx_twice_value	/* [0,127] 62Hz */
#define fx_filterQ	fx_conv_Q	/* [0,127] -- */

static unsigned short fx_delay(int val)
{
	return (unsigned short)calc_parm_delay(val);
}

static unsigned short fx_attack(int val)
{
	return (unsigned short)calc_parm_attack(val);
}

static unsigned short fx_hold(int val)
{
	return (unsigned short)calc_parm_hold(val);
}

static unsigned short fx_decay(int val)
{
	return (unsigned short)calc_parm_decay(val);
}

static unsigned short fx_the_value(int val)
{
	return (unsigned short)(val & 0xff);
}

static unsigned short fx_twice_value(int val)
{
	return (unsigned short)((val * 2) & 0xff);
}

static unsigned short fx_conv_pitch(int val)
{
	return (short)(val * 4096 / 1200);
}

static unsigned short fx_conv_Q(int val)
{
	return (unsigned short)((val / 8) & 0xff);
}


static ConvTable awe_effects[] =
{
	{ 0, AWE_FX_LFO1_DELAY,	fx_lfo1_delay},
	{ 1, AWE_FX_LFO1_FREQ,	fx_lfo1_freq},
	{ 2, AWE_FX_LFO2_DELAY,	fx_lfo2_delay},
	{ 3, AWE_FX_LFO2_FREQ,	fx_lfo2_freq},

	{ 4, AWE_FX_ENV1_DELAY,	fx_env1_delay},
	{ 5, AWE_FX_ENV1_ATTACK,fx_env1_attack},
	{ 6, AWE_FX_ENV1_HOLD,	fx_env1_hold},
	{ 7, AWE_FX_ENV1_DECAY,	fx_env1_decay},
	{ 8, AWE_FX_ENV1_SUSTAIN,	fx_env1_sustain},
	{ 9, AWE_FX_ENV1_RELEASE,	fx_env1_release},

	{10, AWE_FX_ENV2_DELAY,	fx_env2_delay},
	{11, AWE_FX_ENV2_ATTACK,	fx_env2_attack},
	{12, AWE_FX_ENV2_HOLD,	fx_env2_hold},
	{13, AWE_FX_ENV2_DECAY,	fx_env2_decay},
	{14, AWE_FX_ENV2_SUSTAIN,	fx_env2_sustain},
	{15, AWE_FX_ENV2_RELEASE,	fx_env2_release},

	{16, AWE_FX_INIT_PITCH,	fx_init_pitch},
	{17, AWE_FX_LFO1_PITCH,	fx_lfo1_pitch},
	{18, AWE_FX_LFO2_PITCH,	fx_lfo2_pitch},
	{19, AWE_FX_ENV1_PITCH,	fx_env1_pitch},
	{20, AWE_FX_LFO1_VOLUME,	fx_lfo1_volume},
	{21, AWE_FX_CUTOFF,		fx_cutoff},
	{22, AWE_FX_FILTERQ,	fx_filterQ},
	{23, AWE_FX_LFO1_CUTOFF,	fx_lfo1_cutoff},
	{24, AWE_FX_ENV1_CUTOFF,	fx_env1_cutoff},
	{25, AWE_FX_CHORUS,		fx_chorus},
	{26, AWE_FX_REVERB,		fx_reverb},
};

static int num_awe_effects = numberof(awe_effects);


/*
 * GS(SC88) NRPN effects; still experimental
 */

/* cutoff: quarter semitone step, max=255 */
static unsigned short gs_cutoff(int val)
{
	return (val - 64) * gs_sense[FX_CUTOFF] / 50;
}

/* resonance: 0 to 15(max) */
static unsigned short gs_filterQ(int val)
{
	return (val - 64) * gs_sense[FX_RESONANCE] / 50;
}

/* attack: */
static unsigned short gs_attack(int val)
{
	return -(val - 64) * gs_sense[FX_ATTACK] / 50;
}

/* decay: */
static unsigned short gs_decay(int val)
{
	return -(val - 64) * gs_sense[FX_RELEASE] / 50;
}

/* release: */
static unsigned short gs_release(int val)
{
	return -(val - 64) * gs_sense[FX_RELEASE] / 50;
}

/* vibrato freq: 0.042Hz step, max=255 */
static unsigned short gs_vib_rate(int val)
{
	return (val - 64) * gs_sense[FX_VIBRATE] / 50;
}

/* vibrato depth: max=127, 1 octave */
static unsigned short gs_vib_depth(int val)
{
	return (val - 64) * gs_sense[FX_VIBDEPTH] / 50;
}

/* vibrato delay: -0.725msec step */
static unsigned short gs_vib_delay(int val)
{
	return -(val - 64) * gs_sense[FX_VIBDELAY] / 50;
}

static ConvTable gs_effects[] =
{
	{32, AWE_FX_CUTOFF,	gs_cutoff},
	{33, AWE_FX_FILTERQ,	gs_filterQ},
	{99, AWE_FX_ENV2_ATTACK, gs_attack},
	{100, AWE_FX_ENV2_DECAY, gs_decay},
	{102, AWE_FX_ENV2_RELEASE, gs_release},
	{8, AWE_FX_LFO1_FREQ, gs_vib_rate},
	{9, AWE_FX_LFO1_VOLUME, gs_vib_depth},
	{10, AWE_FX_LFO1_DELAY, gs_vib_delay},
};

static int num_gs_effects = numberof(gs_effects);


/*
 * NRPN events: accept as AWE32/SC88 specific controls
 */

static void midi_nrpn_event(MidiStatus *st)
{
	if (rpn_msb[st->chan] == 127 && rpn_lsb[st->chan] <= 26) {
		if (! msb_bit) /* both MSB/LSB necessary */
			send_converted_effect(awe_effects, num_awe_effects,
					      st, rpn_lsb[st->chan],
					      rpn_val[st->chan] - 8192);
	} else if (rpn_msb[st->chan] == 1) {
		if (msb_bit) /* only MSB is valid */
			add_converted_effect(gs_effects, num_gs_effects,
					     st, rpn_lsb[st->chan],
					     rpn_val[st->chan] / 128);
	}
}


/*
 * XG control effects; still experimental
 */

/* cutoff: quarter semitone step, max=255 */
static unsigned short xg_cutoff(int val)
{
	return (val - 64) * xg_sense[FX_CUTOFF] / 64;
}

/* resonance: 0(open) to 15(most nasal) */
static unsigned short xg_filterQ(int val)
{
	return (val - 64) * xg_sense[FX_RESONANCE] / 64;
}

/* attack: */
static unsigned short xg_attack(int val)
{
	return -(val - 64) * xg_sense[FX_ATTACK] / 64;
}

/* release: */
static unsigned short xg_release(int val)
{
	return -(val - 64) * xg_sense[FX_RELEASE] / 64;
}

static ConvTable xg_effects[] =
{
	{71, AWE_FX_CUTOFF,	xg_cutoff},
	{74, AWE_FX_FILTERQ,	xg_filterQ},
	{72, AWE_FX_ENV2_RELEASE, xg_release},
	{73, AWE_FX_ENV2_ATTACK, xg_attack},
};

static int num_xg_effects = numberof(xg_effects);

static int xg_control_change(MidiStatus *st, int cmd, int val)
{
	return add_converted_effect(xg_effects, num_xg_effects, st, cmd, val);
}

#endif /* CONFIG_AWE32_MIDIEMU */


/*----------------------------------------------------------------*/


/*
 * initialization of AWE driver
 */

static void
awe_initialize(void)
{
	DEBUG(0,printk("AWE32: initializing..\n"));

	/* initialize hardware configuration */
	awe_poke(AWE_HWCF1, 0x0059);
	awe_poke(AWE_HWCF2, 0x0020);

	/* disable audio; this seems to reduce a clicking noise a bit.. */
	awe_poke(AWE_HWCF3, 0);

	/* initialize audio channels */
	awe_init_audio();

	/* initialize DMA */
	awe_init_dma();

	/* initialize init array */
	awe_init_array();

	/* check DRAM memory size */
	awe_check_dram();

	/* initialize the FM section of the AWE32 */
	awe_init_fm();

	/* set up voice envelopes */
	awe_tweak();

	/* enable audio */
	awe_poke(AWE_HWCF3, 0x0004);

	/* set default values */
	awe_init_ctrl_parms(TRUE);

	/* set equalizer */
	awe_update_equalizer();

	/* set reverb & chorus modes */
	awe_update_reverb_mode();
	awe_update_chorus_mode();
}


/*
 * Core Device Management Functions
 */

/* store values to i/o port array */
static void setup_ports(int port1, int port2, int port3)
{
	awe_ports[0] = port1;
	if (port2 == 0)
		port2 = port1 + 0x400;
	awe_ports[1] = port2;
	awe_ports[2] = port2 + 2;
	if (port3 == 0)
		port3 = port1 + 0x800;
	awe_ports[3] = port3;
	awe_ports[4] = port3 + 2;

	port_setuped = TRUE;
}

/*
 * port request
 *  0x620-623, 0xA20-A23, 0xE20-E23
 */

static int
awe_request_region(void)
{
	if (! port_setuped)
		return 0;
	if (! request_region(awe_ports[0], 4, "sound driver (AWE32)"))
		return 0;
	if (! request_region(awe_ports[1], 4, "sound driver (AWE32)"))
		goto err_out;
	if (! request_region(awe_ports[3], 4, "sound driver (AWE32)"))
		goto err_out1;
	return 1;
err_out1:
	release_region(awe_ports[1], 4);
err_out:
	release_region(awe_ports[0], 4);
	return 0;
}

static void
awe_release_region(void)
{
	if (! port_setuped) return;
	release_region(awe_ports[0], 4);
	release_region(awe_ports[1], 4);
	release_region(awe_ports[3], 4);
}

static int awe_attach_device(void)
{
	if (awe_present) return 0; /* for OSS38.. called twice? */

	/* reserve I/O ports for awedrv */
	if (! awe_request_region()) {
		printk(KERN_ERR "AWE32: I/O area already used.\n");
		return 0;
	}

	/* set buffers to NULL */
	sfhead = sftail = NULL;

	my_dev = sound_alloc_synthdev();
	if (my_dev == -1) {
		printk(KERN_ERR "AWE32 Error: too many synthesizers\n");
		awe_release_region();
		return 0;
	}

	voice_alloc = &awe_operations.alloc;
	voice_alloc->max_voice = awe_max_voices;
	synth_devs[my_dev] = &awe_operations;

#ifdef CONFIG_AWE32_MIXER
	attach_mixer();
#endif
#ifdef CONFIG_AWE32_MIDIEMU
	attach_midiemu();
#endif

	/* clear all samples */
	awe_reset_samples();

	/* initialize AWE32 hardware */
	awe_initialize();

	sprintf(awe_info.name, "AWE32-%s (RAM%dk)",
		AWEDRV_VERSION, memsize/1024);
	printk(KERN_INFO "<SoundBlaster EMU8000 (RAM%dk)>\n", memsize/1024);

	awe_present = TRUE;

	return 1;
}

static void awe_dettach_device(void)
{
	if (awe_present) {
		awe_reset_samples();
		awe_release_region();
		free_tables();
#ifdef CONFIG_AWE32_MIXER
		unload_mixer();
#endif
#ifdef CONFIG_AWE32_MIDIEMU
		unload_midiemu();
#endif
		sound_unload_synthdev(my_dev);
		awe_present = FALSE;
	}
}


/*
 * Legacy device Probing
 */

/* detect emu8000 chip on the specified address; from VV's guide */

static int __init
awe_detect_base(int addr)
{
	setup_ports(addr, 0, 0);
	if ((awe_peek(AWE_U1) & 0x000F) != 0x000C)
		return 0;
	if ((awe_peek(AWE_HWCF1) & 0x007E) != 0x0058)
		return 0;
	if ((awe_peek(AWE_HWCF2) & 0x0003) != 0x0003)
		return 0;
        DEBUG(0,printk("AWE32 found at %x\n", addr));
	return 1;
}

static int __init awe_detect_legacy_devices(void)
{
	int base;
	for (base = 0x620; base <= 0x680; base += 0x20)
		if (awe_detect_base(base)) {
			awe_attach_device();
			return 1;
			}
	DEBUG(0,printk("AWE32 Legacy detection failed\n"));
	return 0;
}


/*
 * PnP device Probing
 */

static struct pnp_device_id awe_pnp_ids[] = {
	{.id = "CTL0021", .driver_data = 0}, /* AWE32 WaveTable */
	{.id = "CTL0022", .driver_data = 0}, /* AWE64 WaveTable */
	{.id = "CTL0023", .driver_data = 0}, /* AWE64 Gold WaveTable */
	{ } /* terminator */
};

MODULE_DEVICE_TABLE(pnp, awe_pnp_ids);

static int awe_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id)
{
	int io1, io2, io3;

	if (awe_present) {
		printk(KERN_ERR "AWE32: This driver only supports one AWE32 device, skipping.\n");
	}

	if (!pnp_port_valid(dev,0) ||
	    !pnp_port_valid(dev,1) ||
	    !pnp_port_valid(dev,2)) {
		printk(KERN_ERR "AWE32: The PnP device does not have the required resources.\n");
		return -EINVAL;
	}
	io1 = pnp_port_start(dev,0);
	io2 = pnp_port_start(dev,1);
	io3 = pnp_port_start(dev,2);
	printk(KERN_INFO "AWE32: A PnP Wave Table was detected at IO's %#x,%#x,%#x.\n",
	       io1, io2, io3);
	setup_ports(io1, io2, io3);

	awe_attach_device();
	return 0;
}

static void awe_pnp_remove(struct pnp_dev *dev)
{
	awe_dettach_device();
}

static struct pnp_driver awe_pnp_driver = {
	.name		= "AWE32",
	.id_table	= awe_pnp_ids,
	.probe		= awe_pnp_probe,
	.remove		= awe_pnp_remove,
};

static int __init awe_detect_pnp_devices(void)
{
	int ret;

	ret = pnp_register_driver(&awe_pnp_driver);
	if (ret<0)
		printk(KERN_ERR "AWE32: PnP support is unavailable.\n");
	return ret;
}


/*
 * device / lowlevel (module) interface
 */

static int __init
awe_detect(void)
{
	printk(KERN_INFO "AWE32: Probing for WaveTable...\n");
	if (isapnp) {
		if (awe_detect_pnp_devices()>=0)
			return 1;
	} else
		printk(KERN_INFO "AWE32: Skipping PnP detection.\n");

	if (awe_detect_legacy_devices())
		return 1;

	return 0;
}

static int __init attach_awe(void)
{
	return awe_detect() ? 0 : -ENODEV;
}

static void __exit unload_awe(void)
{
	pnp_unregister_driver(&awe_pnp_driver);
	awe_dettach_device();
}


module_init(attach_awe);
module_exit(unload_awe);

#ifndef MODULE
static int __init setup_awe(char *str)
{
	/* io, memsize, isapnp */
	int ints[4];

	str = get_options(str, ARRAY_SIZE(ints), ints);

	io = ints[1];
	memsize = ints[2];
	isapnp = ints[3];

	return 1;
}

__setup("awe=", setup_awe);
#endif
