/*
 * sound/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
