brintos

brintos / linux-shallow public Read only

0
0
Text · 45.1 KiB · ac13187 Raw
1283 lines · c
1/*2 * Copyright by Hannu Savolainen 1993-19973 *4 * Redistribution and use in source and binary forms, with or without5 * modification, are permitted provided that the following conditions are6 * met: 1. Redistributions of source code must retain the above copyright7 * notice, this list of conditions and the following disclaimer. 2.8 * Redistributions in binary form must reproduce the above copyright notice,9 * this list of conditions and the following disclaimer in the documentation10 * and/or other materials provided with the distribution.11 *12 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY13 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED14 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE15 * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR16 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL17 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR18 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER19 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT20 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY21 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF22 * SUCH DAMAGE.23 */24#ifndef _UAPISOUNDCARD_H25#define _UAPISOUNDCARD_H26 27 28/*29 * OSS interface version. With versions earlier than 3.6 this value is30 * an integer with value less than 361. In versions 3.6 and later31 * it's a six digit hexadecimal value. For example value32 * of 0x030600 represents OSS version 3.6.0.33 * Use ioctl(fd, OSS_GETVERSION, &int) to get the version number of34 * the currently active driver.35 */36#define SOUND_VERSION	0x03080237#define OPEN_SOUND_SYSTEM38 39/* In Linux we need to be prepared for cross compiling */40#include <linux/ioctl.h>41 42/* Endian macros. */43#ifndef __KERNEL__44#  include <endian.h>45#endif46 47/*48 *	Supported card ID numbers (Should be somewhere else?)49 */50 51#define SNDCARD_ADLIB		152#define SNDCARD_SB		253#define SNDCARD_PAS		354#define SNDCARD_GUS		455#define SNDCARD_MPU401		556#define SNDCARD_SB16		657#define SNDCARD_SB16MIDI	758#define SNDCARD_UART6850	859#define SNDCARD_GUS16		960#define SNDCARD_MSS		1061#define SNDCARD_PSS     	1162#define SNDCARD_SSCAPE		1263#define SNDCARD_PSS_MPU     	1364#define SNDCARD_PSS_MSS     	1465#define SNDCARD_SSCAPE_MSS	1566#define SNDCARD_TRXPRO		1667#define SNDCARD_TRXPRO_SB	1768#define SNDCARD_TRXPRO_MPU	1869#define SNDCARD_MAD16		1970#define SNDCARD_MAD16_MPU	2071#define SNDCARD_CS4232		2172#define SNDCARD_CS4232_MPU	2273#define SNDCARD_MAUI		2374#define SNDCARD_PSEUDO_MSS	2475#define SNDCARD_GUSPNP		2576#define SNDCARD_UART401		2677/* Sound card numbers 27 to N are reserved. Don't add more numbers here. */78 79/***********************************80 * IOCTL Commands for /dev/sequencer81 */82 83#ifndef _SIOWR84#if defined(_IOWR) && (defined(_AIX) || (!defined(sun) && !defined(sparc) && !defined(__sparc__) && !defined(__INCioctlh) && !defined(__Lynx__)))85/* Use already defined ioctl defines if they exist (except with Sun or Sparc) */86#define	SIOCPARM_MASK	IOCPARM_MASK87#define	SIOC_VOID	IOC_VOID88#define	SIOC_OUT	IOC_OUT89#define	SIOC_IN		IOC_IN90#define	SIOC_INOUT	IOC_INOUT91#define _SIOC_SIZE	_IOC_SIZE92#define _SIOC_DIR	_IOC_DIR93#define _SIOC_NONE	_IOC_NONE94#define _SIOC_READ	_IOC_READ95#define _SIOC_WRITE	_IOC_WRITE96#define	_SIO		_IO97#define	_SIOR		_IOR98#define	_SIOW		_IOW99#define	_SIOWR		_IOWR100#else101 102/* Ioctl's have the command encoded in the lower word,103 * and the size of any in or out parameters in the upper104 * word.  The high 2 bits of the upper word are used105 * to encode the in/out status of the parameter; for now106 * we restrict parameters to at most 8191 bytes.107 */108/* #define	SIOCTYPE		(0xff<<8) */109#define	SIOCPARM_MASK	0x1fff		/* parameters must be < 8192 bytes */110#define	SIOC_VOID	0x00000000	/* no parameters */111#define	SIOC_OUT	0x20000000	/* copy out parameters */112#define	SIOC_IN		0x40000000	/* copy in parameters */113#define	SIOC_INOUT	(SIOC_IN|SIOC_OUT)114/* the 0x20000000 is so we can distinguish new ioctl's from old */115#define	_SIO(x,y)	((int)(SIOC_VOID|(x<<8)|y))116#define	_SIOR(x,y,t)	((int)(SIOC_OUT|((sizeof(t)&SIOCPARM_MASK)<<16)|(x<<8)|y))117#define	_SIOW(x,y,t)	((int)(SIOC_IN|((sizeof(t)&SIOCPARM_MASK)<<16)|(x<<8)|y))118/* this should be _SIORW, but stdio got there first */119#define	_SIOWR(x,y,t)	((int)(SIOC_INOUT|((sizeof(t)&SIOCPARM_MASK)<<16)|(x<<8)|y))120#define _SIOC_SIZE(x)	((x>>16)&SIOCPARM_MASK)	121#define _SIOC_DIR(x)	(x & 0xf0000000)122#define _SIOC_NONE	SIOC_VOID123#define _SIOC_READ	SIOC_OUT124#define _SIOC_WRITE	SIOC_IN125#  endif /* _IOWR */126#endif  /* !_SIOWR */127 128#define SNDCTL_SEQ_RESET		_SIO  ('Q', 0)129#define SNDCTL_SEQ_SYNC			_SIO  ('Q', 1)130#define SNDCTL_SYNTH_INFO		_SIOWR('Q', 2, struct synth_info)131#define SNDCTL_SEQ_CTRLRATE		_SIOWR('Q', 3, int)	/* Set/get timer resolution (HZ) */132#define SNDCTL_SEQ_GETOUTCOUNT		_SIOR ('Q', 4, int)133#define SNDCTL_SEQ_GETINCOUNT		_SIOR ('Q', 5, int)134#define SNDCTL_SEQ_PERCMODE		_SIOW ('Q', 6, int)135#define SNDCTL_FM_LOAD_INSTR		_SIOW ('Q', 7, struct sbi_instrument)	/* Obsolete. Don't use!!!!!! */136#define SNDCTL_SEQ_TESTMIDI		_SIOW ('Q', 8, int)137#define SNDCTL_SEQ_RESETSAMPLES		_SIOW ('Q', 9, int)138#define SNDCTL_SEQ_NRSYNTHS		_SIOR ('Q',10, int)139#define SNDCTL_SEQ_NRMIDIS		_SIOR ('Q',11, int)140#define SNDCTL_MIDI_INFO		_SIOWR('Q',12, struct midi_info)141#define SNDCTL_SEQ_THRESHOLD		_SIOW ('Q',13, int)142#define SNDCTL_SYNTH_MEMAVL		_SIOWR('Q',14, int)	/* in=dev#, out=memsize */143#define SNDCTL_FM_4OP_ENABLE		_SIOW ('Q',15, int)	/* in=dev# */144#define SNDCTL_SEQ_PANIC		_SIO  ('Q',17)145#define SNDCTL_SEQ_OUTOFBAND		_SIOW ('Q',18, struct seq_event_rec)146#define SNDCTL_SEQ_GETTIME		_SIOR ('Q',19, int)147#define SNDCTL_SYNTH_ID			_SIOWR('Q',20, struct synth_info)148#define SNDCTL_SYNTH_CONTROL		_SIOWR('Q',21, struct synth_control)149#define SNDCTL_SYNTH_REMOVESAMPLE	_SIOWR('Q',22, struct remove_sample)150 151typedef struct synth_control152{153	int devno;	/* Synthesizer # */154	char data[4000]; /* Device spesific command/data record */155}synth_control;156 157typedef struct remove_sample158{159	int devno;	/* Synthesizer # */160	int bankno;	/* MIDI bank # (0=General MIDI) */161	int instrno;	/* MIDI instrument number */162} remove_sample;163 164typedef struct seq_event_rec {165		unsigned char arr[8];166} seq_event_rec;167 168#define SNDCTL_TMR_TIMEBASE		_SIOWR('T', 1, int)169#define SNDCTL_TMR_START		_SIO  ('T', 2)170#define SNDCTL_TMR_STOP			_SIO  ('T', 3)171#define SNDCTL_TMR_CONTINUE		_SIO  ('T', 4)172#define SNDCTL_TMR_TEMPO		_SIOWR('T', 5, int)173#define SNDCTL_TMR_SOURCE		_SIOWR('T', 6, int)174#	define TMR_INTERNAL		0x00000001175#	define TMR_EXTERNAL		0x00000002176#		define TMR_MODE_MIDI	0x00000010177#		define TMR_MODE_FSK	0x00000020178#		define TMR_MODE_CLS	0x00000040179#		define TMR_MODE_SMPTE	0x00000080180#define SNDCTL_TMR_METRONOME		_SIOW ('T', 7, int)181#define SNDCTL_TMR_SELECT		_SIOW ('T', 8, int)182 183/*184 * Some big endian/little endian handling macros185 */186 187#define _LINUX_PATCHKEY_H_INDIRECT188#include <linux/patchkey.h>189#undef _LINUX_PATCHKEY_H_INDIRECT190 191#if !defined(__KERNEL__)192# if defined(__BYTE_ORDER)193#  if __BYTE_ORDER == __BIG_ENDIAN194#    define AFMT_S16_NE AFMT_S16_BE195#  elif __BYTE_ORDER == __LITTLE_ENDIAN196#    define AFMT_S16_NE AFMT_S16_LE197#  else198#    error "could not determine byte order"199#  endif200# endif201#endif202 203/*204 *	Sample loading mechanism for internal synthesizers (/dev/sequencer)205 *	The following patch_info structure has been designed to support206 *	Gravis UltraSound. It tries to be universal format for uploading207 *	sample based patches but is probably too limited.208 *209 *      (PBD) As Hannu guessed, the GUS structure is too limited for 210 *      the WaveFront, but this is the right place for a constant definition.211 */212 213struct patch_info {214		unsigned short key;		/* Use WAVE_PATCH here */215#define WAVE_PATCH	   _PATCHKEY(0x04)216#define GUS_PATCH	   WAVE_PATCH217#define WAVEFRONT_PATCH    _PATCHKEY(0x06)218 219		short device_no;	/* Synthesizer number */220		short instr_no;		/* Midi pgm# */221 222		unsigned int mode;223/*224 * The least significant byte has the same format than the GUS .PAT225 * files226 */227#define WAVE_16_BITS	0x01	/* bit 0 = 8 or 16 bit wave data. */228#define WAVE_UNSIGNED	0x02	/* bit 1 = Signed - Unsigned data. */229#define WAVE_LOOPING	0x04	/* bit 2 = looping enabled-1. */230#define WAVE_BIDIR_LOOP	0x08	/* bit 3 = Set is bidirectional looping. */231#define WAVE_LOOP_BACK	0x10	/* bit 4 = Set is looping backward. */232#define WAVE_SUSTAIN_ON	0x20	/* bit 5 = Turn sustaining on. (Env. pts. 3)*/233#define WAVE_ENVELOPES	0x40	/* bit 6 = Enable envelopes - 1 */234#define WAVE_FAST_RELEASE 0x80	/* bit 7 = Shut off immediately after note off */235				/* 	(use the env_rate/env_offs fields). */236/* Linux specific bits */237#define WAVE_VIBRATO	0x00010000	/* The vibrato info is valid */238#define WAVE_TREMOLO	0x00020000	/* The tremolo info is valid */239#define WAVE_SCALE	0x00040000	/* The scaling info is valid */240#define WAVE_FRACTIONS	0x00080000	/* Fraction information is valid */241/* Reserved bits */242#define WAVE_ROM	0x40000000	/* For future use */243#define WAVE_MULAW	0x20000000	/* For future use */244/* Other bits must be zeroed */245 246		int len;	/* Size of the wave data in bytes */247		int loop_start, loop_end; /* Byte offsets from the beginning */248 249/* 250 * The base_freq and base_note fields are used when computing the251 * playback speed for a note. The base_note defines the tone frequency252 * which is heard if the sample is played using the base_freq as the253 * playback speed.254 *255 * The low_note and high_note fields define the minimum and maximum note256 * frequencies for which this sample is valid. It is possible to define257 * more than one samples for an instrument number at the same time. The258 * low_note and high_note fields are used to select the most suitable one.259 *260 * The fields base_note, high_note and low_note should contain261 * the note frequency multiplied by 1000. For example value for the262 * middle A is 440*1000.263 */264 265		unsigned int base_freq;266		unsigned int base_note;267		unsigned int high_note;268		unsigned int low_note;269		int panning;	/* -128=left, 127=right */270		int detuning;271 272/*	New fields introduced in version 1.99.5	*/273 274       /* Envelope. Enabled by mode bit WAVE_ENVELOPES	*/275		unsigned char	env_rate[ 6 ];	 /* GUS HW ramping rate */276		unsigned char	env_offset[ 6 ]; /* 255 == 100% */277 278	/* 279	 * The tremolo, vibrato and scale info are not supported yet.280	 * Enable by setting the mode bits WAVE_TREMOLO, WAVE_VIBRATO or281	 * WAVE_SCALE282	 */283 284		unsigned char	tremolo_sweep;285		unsigned char	tremolo_rate;286		unsigned char	tremolo_depth;287	288		unsigned char	vibrato_sweep;289		unsigned char	vibrato_rate;290		unsigned char	vibrato_depth;291 292		int		scale_frequency;293		unsigned int	scale_factor;		/* from 0 to 2048 or 0 to 2 */294	295	        int		volume;296		int		fractions;297		int		reserved1;298	        int		spare[2];299		char data[1];	/* The waveform data starts here */300	};301 302struct sysex_info {303		short key;		/* Use SYSEX_PATCH or MAUI_PATCH here */304#define SYSEX_PATCH	_PATCHKEY(0x05)305#define MAUI_PATCH	_PATCHKEY(0x06)306		short device_no;	/* Synthesizer number */307		int len;	/* Size of the sysex data in bytes */308		unsigned char data[1];	/* Sysex data starts here */309	};310 311/*312 * /dev/sequencer input events.313 *314 * The data written to the /dev/sequencer is a stream of events. Events315 * are records of 4 or 8 bytes. The first byte defines the size. 316 * Any number of events can be written with a write call. There317 * is a set of macros for sending these events. Use these macros if you318 * want to maximize portability of your program.319 *320 * Events SEQ_WAIT, SEQ_MIDIPUTC and SEQ_ECHO. Are also input events.321 * (All input events are currently 4 bytes long. Be prepared to support322 * 8 byte events also. If you receive any event having first byte >= 128,323 * it's a 8 byte event.324 *325 * The events are documented at the end of this file.326 *327 * Normal events (4 bytes)328 * There is also a 8 byte version of most of the 4 byte events. The329 * 8 byte one is recommended.330 */331#define SEQ_NOTEOFF		0332#define SEQ_FMNOTEOFF		SEQ_NOTEOFF	/* Just old name */333#define SEQ_NOTEON		1334#define	SEQ_FMNOTEON		SEQ_NOTEON335#define SEQ_WAIT		TMR_WAIT_ABS336#define SEQ_PGMCHANGE		3337#define SEQ_FMPGMCHANGE		SEQ_PGMCHANGE338#define SEQ_SYNCTIMER		TMR_START339#define SEQ_MIDIPUTC		5340#define SEQ_DRUMON		6	/*** OBSOLETE ***/341#define SEQ_DRUMOFF		7	/*** OBSOLETE ***/342#define SEQ_ECHO		TMR_ECHO	/* For synching programs with output */343#define SEQ_AFTERTOUCH		9344#define SEQ_CONTROLLER		10345 346/*******************************************347 *	Midi controller numbers348 *******************************************349 * Controllers 0 to 31 (0x00 to 0x1f) and350 * 32 to 63 (0x20 to 0x3f) are continuous351 * controllers.352 * In the MIDI 1.0 these controllers are sent using353 * two messages. Controller numbers 0 to 31 are used354 * to send the MSB and the controller numbers 32 to 63355 * are for the LSB. Note that just 7 bits are used in MIDI bytes.356 */357 358#define	   CTL_BANK_SELECT		0x00359#define	   CTL_MODWHEEL			0x01360#define    CTL_BREATH			0x02361/*		undefined		0x03 */362#define    CTL_FOOT			0x04363#define    CTL_PORTAMENTO_TIME		0x05364#define    CTL_DATA_ENTRY		0x06365#define    CTL_MAIN_VOLUME		0x07366#define    CTL_BALANCE			0x08367/*		undefined		0x09 */368#define    CTL_PAN			0x0a369#define    CTL_EXPRESSION		0x0b370/*		undefined		0x0c */371/*		undefined		0x0d */372/*		undefined		0x0e */373/*		undefined		0x0f */374#define    CTL_GENERAL_PURPOSE1	0x10375#define    CTL_GENERAL_PURPOSE2	0x11376#define    CTL_GENERAL_PURPOSE3	0x12377#define    CTL_GENERAL_PURPOSE4	0x13378/*		undefined		0x14 - 0x1f */379 380/*		undefined		0x20 */381/* The controller numbers 0x21 to 0x3f are reserved for the */382/* least significant bytes of the controllers 0x00 to 0x1f. */383/* These controllers are not recognised by the driver. */384 385/* Controllers 64 to 69 (0x40 to 0x45) are on/off switches. */386/* 0=OFF and 127=ON (intermediate values are possible) */387#define    CTL_DAMPER_PEDAL		0x40388#define    CTL_SUSTAIN			0x40	/* Alias */389#define    CTL_HOLD			0x40	/* Alias */390#define    CTL_PORTAMENTO		0x41391#define    CTL_SOSTENUTO		0x42392#define    CTL_SOFT_PEDAL		0x43393/*		undefined		0x44 */394#define    CTL_HOLD2			0x45395/*		undefined		0x46 - 0x4f */396 397#define    CTL_GENERAL_PURPOSE5	0x50398#define    CTL_GENERAL_PURPOSE6	0x51399#define    CTL_GENERAL_PURPOSE7	0x52400#define    CTL_GENERAL_PURPOSE8	0x53401/*		undefined		0x54 - 0x5a */402#define    CTL_EXT_EFF_DEPTH		0x5b403#define    CTL_TREMOLO_DEPTH		0x5c404#define    CTL_CHORUS_DEPTH		0x5d405#define    CTL_DETUNE_DEPTH		0x5e406#define    CTL_CELESTE_DEPTH		0x5e	/* Alias for the above one */407#define    CTL_PHASER_DEPTH		0x5f408#define    CTL_DATA_INCREMENT		0x60409#define    CTL_DATA_DECREMENT		0x61410#define    CTL_NONREG_PARM_NUM_LSB	0x62411#define    CTL_NONREG_PARM_NUM_MSB	0x63412#define    CTL_REGIST_PARM_NUM_LSB	0x64413#define    CTL_REGIST_PARM_NUM_MSB	0x65414/*		undefined		0x66 - 0x78 */415/*		reserved		0x79 - 0x7f */416 417/* Pseudo controllers (not midi compatible) */418#define    CTRL_PITCH_BENDER		255419#define    CTRL_PITCH_BENDER_RANGE	254420#define    CTRL_EXPRESSION		253	/* Obsolete */421#define    CTRL_MAIN_VOLUME		252	/* Obsolete */422#define SEQ_BALANCE		11423#define SEQ_VOLMODE             12424 425/*426 * Volume mode decides how volumes are used427 */428 429#define VOL_METHOD_ADAGIO	1430#define VOL_METHOD_LINEAR	2431 432/*433 * Note! SEQ_WAIT, SEQ_MIDIPUTC and SEQ_ECHO are used also as434 *	 input events.435 */436 437/*438 * Event codes 0xf0 to 0xfc are reserved for future extensions.439 */440 441#define SEQ_FULLSIZE		0xfd	/* Long events */442/*443 *	SEQ_FULLSIZE events are used for loading patches/samples to the444 *	synthesizer devices. These events are passed directly to the driver445 *	of the associated synthesizer device. There is no limit to the size446 *	of the extended events. These events are not queued but executed447 *	immediately when the write() is called (execution can take several448 *	seconds of time). 449 *450 *	When a SEQ_FULLSIZE message is written to the device, it must451 *	be written using exactly one write() call. Other events cannot452 *	be mixed to the same write.453 *	454 *	For FM synths (YM3812/OPL3) use struct sbi_instrument and write it to the 455 *	/dev/sequencer. Don't write other data together with the instrument structure456 *	Set the key field of the structure to FM_PATCH. The device field is used to457 *	route the patch to the corresponding device.458 *459 *	For wave table use struct patch_info. Initialize the key field460 *      to WAVE_PATCH.461 */462#define SEQ_PRIVATE		0xfe	/* Low level HW dependent events (8 bytes) */463#define SEQ_EXTENDED		0xff	/* Extended events (8 bytes) OBSOLETE */464 465/*466 * Record for FM patches467 */468 469typedef unsigned char sbi_instr_data[32];470 471struct sbi_instrument {472		unsigned short	key;	/* FM_PATCH or OPL3_PATCH */473#define FM_PATCH	_PATCHKEY(0x01)474#define OPL3_PATCH	_PATCHKEY(0x03)475		short		device;		/*	Synth# (0-4)	*/476		int 		channel;	/*	Program# to be initialized 	*/477		sbi_instr_data	operators;	/*	Register settings for operator cells (.SBI format)	*/478	};479 480struct synth_info {	/* Read only */481		char	name[30];482		int	device;		/* 0-N. INITIALIZE BEFORE CALLING */483		int	synth_type;484#define SYNTH_TYPE_FM			0485#define SYNTH_TYPE_SAMPLE		1486#define SYNTH_TYPE_MIDI			2	/* Midi interface */487 488		int	synth_subtype;489#define FM_TYPE_ADLIB			0x00490#define FM_TYPE_OPL3			0x01491#define MIDI_TYPE_MPU401		0x401492 493#define SAMPLE_TYPE_BASIC		0x10494#define SAMPLE_TYPE_GUS			SAMPLE_TYPE_BASIC495#define SAMPLE_TYPE_WAVEFRONT           0x11496 497		int	perc_mode;	/* No longer supported */498		int	nr_voices;499		int	nr_drums;	/* Obsolete field */500		int	instr_bank_size;501		unsigned int	capabilities;	502#define SYNTH_CAP_PERCMODE		0x00000001 /* No longer used */503#define SYNTH_CAP_OPL3			0x00000002 /* Set if OPL3 supported */504#define SYNTH_CAP_INPUT			0x00000004 /* Input (MIDI) device */505		int	dummies[19];	/* Reserve space */506	};507 508struct sound_timer_info {509		char name[32];510		int caps;511	};512 513#define MIDI_CAP_MPU401		1		/* MPU-401 intelligent mode */514 515struct midi_info {516		char		name[30];517		int		device;		/* 0-N. INITIALIZE BEFORE CALLING */518		unsigned int	capabilities;	/* To be defined later */519		int		dev_type;520		int		dummies[18];	/* Reserve space */521	};522 523/********************************************524 * ioctl commands for the /dev/midi##525 */526typedef struct {527		unsigned char cmd;528		char nr_args, nr_returns;529		unsigned char data[30];530	} mpu_command_rec;531 532#define SNDCTL_MIDI_PRETIME		_SIOWR('m', 0, int)533#define SNDCTL_MIDI_MPUMODE		_SIOWR('m', 1, int)534#define SNDCTL_MIDI_MPUCMD		_SIOWR('m', 2, mpu_command_rec)535 536/********************************************537 * IOCTL commands for /dev/dsp and /dev/audio538 */539 540#define SNDCTL_DSP_RESET		_SIO  ('P', 0)541#define SNDCTL_DSP_SYNC			_SIO  ('P', 1)542#define SNDCTL_DSP_SPEED		_SIOWR('P', 2, int)543#define SNDCTL_DSP_STEREO		_SIOWR('P', 3, int)544#define SNDCTL_DSP_GETBLKSIZE		_SIOWR('P', 4, int)545#define SNDCTL_DSP_SAMPLESIZE		SNDCTL_DSP_SETFMT546#define SNDCTL_DSP_CHANNELS		_SIOWR('P', 6, int)547#define SOUND_PCM_WRITE_CHANNELS	SNDCTL_DSP_CHANNELS548#define SOUND_PCM_WRITE_FILTER		_SIOWR('P', 7, int)549#define SNDCTL_DSP_POST			_SIO  ('P', 8)550#define SNDCTL_DSP_SUBDIVIDE		_SIOWR('P', 9, int)551#define SNDCTL_DSP_SETFRAGMENT		_SIOWR('P',10, int)552 553/*	Audio data formats (Note! U8=8 and S16_LE=16 for compatibility) */554#define SNDCTL_DSP_GETFMTS		_SIOR ('P',11, int) /* Returns a mask */555#define SNDCTL_DSP_SETFMT		_SIOWR('P',5, int) /* Selects ONE fmt*/556#	define AFMT_QUERY		0x00000000	/* Return current fmt */557#	define AFMT_MU_LAW		0x00000001558#	define AFMT_A_LAW		0x00000002559#	define AFMT_IMA_ADPCM		0x00000004560#	define AFMT_U8			0x00000008561#	define AFMT_S16_LE		0x00000010	/* Little endian signed 16*/562#	define AFMT_S16_BE		0x00000020	/* Big endian signed 16 */563#	define AFMT_S8			0x00000040564#	define AFMT_U16_LE		0x00000080	/* Little endian U16 */565#	define AFMT_U16_BE		0x00000100	/* Big endian U16 */566#	define AFMT_MPEG		0x00000200	/* MPEG (2) audio */567#	define AFMT_AC3		0x00000400	/* Dolby Digital AC3 */568 569/*570 * Buffer status queries.571 */572typedef struct audio_buf_info {573			int fragments;	/* # of available fragments (partially usend ones not counted) */574			int fragstotal;	/* Total # of fragments allocated */575			int fragsize;	/* Size of a fragment in bytes */576 577			int bytes;	/* Available space in bytes (includes partially used fragments) */578			/* Note! 'bytes' could be more than fragments*fragsize */579		} audio_buf_info;580 581#define SNDCTL_DSP_GETOSPACE		_SIOR ('P',12, audio_buf_info)582#define SNDCTL_DSP_GETISPACE		_SIOR ('P',13, audio_buf_info)583#define SNDCTL_DSP_NONBLOCK		_SIO  ('P',14)584#define SNDCTL_DSP_GETCAPS		_SIOR ('P',15, int)585#	define DSP_CAP_REVISION		0x000000ff	/* Bits for revision level (0 to 255) */586#	define DSP_CAP_DUPLEX		0x00000100	/* Full duplex record/playback */587#	define DSP_CAP_REALTIME		0x00000200	/* Real time capability */588#	define DSP_CAP_BATCH		0x00000400	/* Device has some kind of */589							/* internal buffers which may */590							/* cause some delays and */591							/* decrease precision of timing */592#	define DSP_CAP_COPROC		0x00000800	/* Has a coprocessor */593							/* Sometimes it's a DSP */594							/* but usually not */595#	define DSP_CAP_TRIGGER		0x00001000	/* Supports SETTRIGGER */596#	define DSP_CAP_MMAP		0x00002000	/* Supports mmap() */597#	define DSP_CAP_MULTI		0x00004000	/* support multiple open */598#	define DSP_CAP_BIND		0x00008000	/* channel binding to front/rear/cneter/lfe */599 600 601#define SNDCTL_DSP_GETTRIGGER		_SIOR ('P',16, int)602#define SNDCTL_DSP_SETTRIGGER		_SIOW ('P',16, int)603#	define PCM_ENABLE_INPUT		0x00000001604#	define PCM_ENABLE_OUTPUT		0x00000002605 606typedef struct count_info {607		int bytes;	/* Total # of bytes processed */608		int blocks;	/* # of fragment transitions since last time */609		int ptr;	/* Current DMA pointer value */610	} count_info;611 612#define SNDCTL_DSP_GETIPTR		_SIOR ('P',17, count_info)613#define SNDCTL_DSP_GETOPTR		_SIOR ('P',18, count_info)614 615typedef struct buffmem_desc {616		unsigned *buffer;617		int size;618	} buffmem_desc;619#define SNDCTL_DSP_MAPINBUF		_SIOR ('P', 19, buffmem_desc)620#define SNDCTL_DSP_MAPOUTBUF		_SIOR ('P', 20, buffmem_desc)621#define SNDCTL_DSP_SETSYNCRO		_SIO  ('P', 21)622#define SNDCTL_DSP_SETDUPLEX		_SIO  ('P', 22)623#define SNDCTL_DSP_GETODELAY		_SIOR ('P', 23, int)624 625#define SNDCTL_DSP_GETCHANNELMASK		_SIOWR('P', 64, int)626#define SNDCTL_DSP_BIND_CHANNEL		_SIOWR('P', 65, int)627#	define DSP_BIND_QUERY		0x00000000628#	define DSP_BIND_FRONT		0x00000001629#	define DSP_BIND_SURR		0x00000002630#	define DSP_BIND_CENTER_LFE	0x00000004631#	define DSP_BIND_HANDSET		0x00000008632#	define DSP_BIND_MIC		0x00000010633#	define DSP_BIND_MODEM1		0x00000020634#	define DSP_BIND_MODEM2		0x00000040635#	define DSP_BIND_I2S		0x00000080636#	define DSP_BIND_SPDIF		0x00000100637 638#define SNDCTL_DSP_SETSPDIF		_SIOW ('P', 66, int)639#define SNDCTL_DSP_GETSPDIF		_SIOR ('P', 67, int)640#	define SPDIF_PRO	0x0001641#	define SPDIF_N_AUD	0x0002642#	define SPDIF_COPY	0x0004643#	define SPDIF_PRE	0x0008644#	define SPDIF_CC		0x07f0645#	define SPDIF_L		0x0800646#	define SPDIF_DRS	0x4000647#	define SPDIF_V		0x8000648 649/*650 * Application's profile defines the way how playback underrun situations should be handled.651 * 652 *	APF_NORMAL (the default) and APF_NETWORK make the driver to cleanup the653 *	playback buffer whenever an underrun occurs. This consumes some time654 *	prevents looping the existing buffer.655 *	APF_CPUINTENS is intended to be set by CPU intensive applications which656 *	are likely to run out of time occasionally. In this mode the buffer cleanup is657 *	disabled which saves CPU time but also let's the previous buffer content to658 *	be played during the "pause" after the underrun.659 */660#define SNDCTL_DSP_PROFILE		_SIOW ('P', 23, int)661#define	  APF_NORMAL	0	/* Normal applications */662#define	  APF_NETWORK	1	/* Underruns probably caused by an "external" delay */663#define   APF_CPUINTENS 2	/* Underruns probably caused by "overheating" the CPU */664 665#define SOUND_PCM_READ_RATE		_SIOR ('P', 2, int)666#define SOUND_PCM_READ_CHANNELS		_SIOR ('P', 6, int)667#define SOUND_PCM_READ_BITS		_SIOR ('P', 5, int)668#define SOUND_PCM_READ_FILTER		_SIOR ('P', 7, int)669 670/* Some alias names */671#define SOUND_PCM_WRITE_BITS		SNDCTL_DSP_SETFMT672#define SOUND_PCM_WRITE_RATE		SNDCTL_DSP_SPEED673#define SOUND_PCM_POST			SNDCTL_DSP_POST674#define SOUND_PCM_RESET			SNDCTL_DSP_RESET675#define SOUND_PCM_SYNC			SNDCTL_DSP_SYNC676#define SOUND_PCM_SUBDIVIDE		SNDCTL_DSP_SUBDIVIDE677#define SOUND_PCM_SETFRAGMENT		SNDCTL_DSP_SETFRAGMENT678#define SOUND_PCM_GETFMTS		SNDCTL_DSP_GETFMTS679#define SOUND_PCM_SETFMT		SNDCTL_DSP_SETFMT680#define SOUND_PCM_GETOSPACE		SNDCTL_DSP_GETOSPACE681#define SOUND_PCM_GETISPACE		SNDCTL_DSP_GETISPACE682#define SOUND_PCM_NONBLOCK		SNDCTL_DSP_NONBLOCK683#define SOUND_PCM_GETCAPS		SNDCTL_DSP_GETCAPS684#define SOUND_PCM_GETTRIGGER		SNDCTL_DSP_GETTRIGGER685#define SOUND_PCM_SETTRIGGER		SNDCTL_DSP_SETTRIGGER686#define SOUND_PCM_SETSYNCRO		SNDCTL_DSP_SETSYNCRO687#define SOUND_PCM_GETIPTR		SNDCTL_DSP_GETIPTR688#define SOUND_PCM_GETOPTR		SNDCTL_DSP_GETOPTR689#define SOUND_PCM_MAPINBUF		SNDCTL_DSP_MAPINBUF690#define SOUND_PCM_MAPOUTBUF		SNDCTL_DSP_MAPOUTBUF691 692/*693 * ioctl calls to be used in communication with coprocessors and694 * DSP chips.695 */696 697typedef struct copr_buffer {698		int command;	/* Set to 0 if not used */699		int flags;700#define CPF_NONE		0x0000701#define CPF_FIRST		0x0001	/* First block */702#define CPF_LAST		0x0002	/* Last block */703		int len;704		int offs;	/* If required by the device (0 if not used) */705 706		unsigned char data[4000]; /* NOTE! 4000 is not 4k */707	} copr_buffer;708 709typedef struct copr_debug_buf {710		int command;	/* Used internally. Set to 0 */711		int parm1;712		int parm2;713		int flags;	714		int len;	/* Length of data in bytes */715	} copr_debug_buf;716 717typedef struct copr_msg {718		int len;719		unsigned char data[4000];720	} copr_msg;721 722#define SNDCTL_COPR_RESET             _SIO  ('C',  0)723#define SNDCTL_COPR_LOAD	      _SIOWR('C',  1, copr_buffer)724#define SNDCTL_COPR_RDATA	      _SIOWR('C',  2, copr_debug_buf)725#define SNDCTL_COPR_RCODE	      _SIOWR('C',  3, copr_debug_buf)726#define SNDCTL_COPR_WDATA	      _SIOW ('C',  4, copr_debug_buf)727#define SNDCTL_COPR_WCODE	      _SIOW ('C',  5, copr_debug_buf)728#define SNDCTL_COPR_RUN		      _SIOWR('C',  6, copr_debug_buf)729#define SNDCTL_COPR_HALT	      _SIOWR('C',  7, copr_debug_buf)730#define SNDCTL_COPR_SENDMSG	      _SIOWR('C',  8, copr_msg)731#define SNDCTL_COPR_RCVMSG	      _SIOR ('C',  9, copr_msg)732 733/*********************************************734 * IOCTL commands for /dev/mixer735 */736	737/* 738 * Mixer devices739 *740 * There can be up to 20 different analog mixer channels. The741 * SOUND_MIXER_NRDEVICES gives the currently supported maximum. 742 * The SOUND_MIXER_READ_DEVMASK returns a bitmask which tells743 * the devices supported by the particular mixer.744 */745 746#define SOUND_MIXER_NRDEVICES	25747#define SOUND_MIXER_VOLUME	0748#define SOUND_MIXER_BASS	1749#define SOUND_MIXER_TREBLE	2750#define SOUND_MIXER_SYNTH	3751#define SOUND_MIXER_PCM		4752#define SOUND_MIXER_SPEAKER	5753#define SOUND_MIXER_LINE	6754#define SOUND_MIXER_MIC		7755#define SOUND_MIXER_CD		8756#define SOUND_MIXER_IMIX	9	/*  Recording monitor  */757#define SOUND_MIXER_ALTPCM	10758#define SOUND_MIXER_RECLEV	11	/* Recording level */759#define SOUND_MIXER_IGAIN	12	/* Input gain */760#define SOUND_MIXER_OGAIN	13	/* Output gain */761/* 762 * The AD1848 codec and compatibles have three line level inputs763 * (line, aux1 and aux2). Since each card manufacturer have assigned764 * different meanings to these inputs, it's inpractical to assign765 * specific meanings (line, cd, synth etc.) to them.766 */767#define SOUND_MIXER_LINE1	14	/* Input source 1  (aux1) */768#define SOUND_MIXER_LINE2	15	/* Input source 2  (aux2) */769#define SOUND_MIXER_LINE3	16	/* Input source 3  (line) */770#define SOUND_MIXER_DIGITAL1	17	/* Digital (input) 1 */771#define SOUND_MIXER_DIGITAL2	18	/* Digital (input) 2 */772#define SOUND_MIXER_DIGITAL3	19	/* Digital (input) 3 */773#define SOUND_MIXER_PHONEIN	20	/* Phone input */774#define SOUND_MIXER_PHONEOUT	21	/* Phone output */775#define SOUND_MIXER_VIDEO	22	/* Video/TV (audio) in */776#define SOUND_MIXER_RADIO	23	/* Radio in */777#define SOUND_MIXER_MONITOR	24	/* Monitor (usually mic) volume */778 779/* Some on/off settings (SOUND_SPECIAL_MIN - SOUND_SPECIAL_MAX) */780/* Not counted to SOUND_MIXER_NRDEVICES, but use the same number space */781#define SOUND_ONOFF_MIN		28782#define SOUND_ONOFF_MAX		30783 784/* Note!	Number 31 cannot be used since the sign bit is reserved */785#define SOUND_MIXER_NONE	31786 787/*788 * The following unsupported macros are no longer functional.789 * Use SOUND_MIXER_PRIVATE# macros in future.790 */791#define SOUND_MIXER_ENHANCE	SOUND_MIXER_NONE792#define SOUND_MIXER_MUTE	SOUND_MIXER_NONE793#define SOUND_MIXER_LOUD	SOUND_MIXER_NONE794 795 796#define SOUND_DEVICE_LABELS	{"Vol  ", "Bass ", "Trebl", "Synth", "Pcm  ", "Spkr ", "Line ", \797				 "Mic  ", "CD   ", "Mix  ", "Pcm2 ", "Rec  ", "IGain", "OGain", \798				 "Line1", "Line2", "Line3", "Digital1", "Digital2", "Digital3", \799				 "PhoneIn", "PhoneOut", "Video", "Radio", "Monitor"}800 801#define SOUND_DEVICE_NAMES	{"vol", "bass", "treble", "synth", "pcm", "speaker", "line", \802				 "mic", "cd", "mix", "pcm2", "rec", "igain", "ogain", \803				 "line1", "line2", "line3", "dig1", "dig2", "dig3", \804				 "phin", "phout", "video", "radio", "monitor"}805 806/*	Device bitmask identifiers	*/807 808#define SOUND_MIXER_RECSRC	0xff	/* Arg contains a bit for each recording source */809#define SOUND_MIXER_DEVMASK	0xfe	/* Arg contains a bit for each supported device */810#define SOUND_MIXER_RECMASK	0xfd	/* Arg contains a bit for each supported recording source */811#define SOUND_MIXER_CAPS	0xfc812#	define SOUND_CAP_EXCL_INPUT	0x00000001	/* Only one recording source at a time */813#define SOUND_MIXER_STEREODEVS	0xfb	/* Mixer channels supporting stereo */814#define SOUND_MIXER_OUTSRC	0xfa	/* Arg contains a bit for each input source to output */815#define SOUND_MIXER_OUTMASK	0xf9	/* Arg contains a bit for each supported input source to output */816 817/*	Device mask bits	*/818 819#define SOUND_MASK_VOLUME	(1 << SOUND_MIXER_VOLUME)820#define SOUND_MASK_BASS		(1 << SOUND_MIXER_BASS)821#define SOUND_MASK_TREBLE	(1 << SOUND_MIXER_TREBLE)822#define SOUND_MASK_SYNTH	(1 << SOUND_MIXER_SYNTH)823#define SOUND_MASK_PCM		(1 << SOUND_MIXER_PCM)824#define SOUND_MASK_SPEAKER	(1 << SOUND_MIXER_SPEAKER)825#define SOUND_MASK_LINE		(1 << SOUND_MIXER_LINE)826#define SOUND_MASK_MIC		(1 << SOUND_MIXER_MIC)827#define SOUND_MASK_CD		(1 << SOUND_MIXER_CD)828#define SOUND_MASK_IMIX		(1 << SOUND_MIXER_IMIX)829#define SOUND_MASK_ALTPCM	(1 << SOUND_MIXER_ALTPCM)830#define SOUND_MASK_RECLEV	(1 << SOUND_MIXER_RECLEV)831#define SOUND_MASK_IGAIN	(1 << SOUND_MIXER_IGAIN)832#define SOUND_MASK_OGAIN	(1 << SOUND_MIXER_OGAIN)833#define SOUND_MASK_LINE1	(1 << SOUND_MIXER_LINE1)834#define SOUND_MASK_LINE2	(1 << SOUND_MIXER_LINE2)835#define SOUND_MASK_LINE3	(1 << SOUND_MIXER_LINE3)836#define SOUND_MASK_DIGITAL1	(1 << SOUND_MIXER_DIGITAL1)837#define SOUND_MASK_DIGITAL2	(1 << SOUND_MIXER_DIGITAL2)838#define SOUND_MASK_DIGITAL3	(1 << SOUND_MIXER_DIGITAL3)839#define SOUND_MASK_PHONEIN	(1 << SOUND_MIXER_PHONEIN)840#define SOUND_MASK_PHONEOUT	(1 << SOUND_MIXER_PHONEOUT)841#define SOUND_MASK_RADIO	(1 << SOUND_MIXER_RADIO)842#define SOUND_MASK_VIDEO	(1 << SOUND_MIXER_VIDEO)843#define SOUND_MASK_MONITOR	(1 << SOUND_MIXER_MONITOR)844 845/* Obsolete macros */846#define SOUND_MASK_MUTE		(1 << SOUND_MIXER_MUTE)847#define SOUND_MASK_ENHANCE	(1 << SOUND_MIXER_ENHANCE)848#define SOUND_MASK_LOUD		(1 << SOUND_MIXER_LOUD)849 850#define MIXER_READ(dev)		_SIOR('M', dev, int)851#define SOUND_MIXER_READ_VOLUME		MIXER_READ(SOUND_MIXER_VOLUME)852#define SOUND_MIXER_READ_BASS		MIXER_READ(SOUND_MIXER_BASS)853#define SOUND_MIXER_READ_TREBLE		MIXER_READ(SOUND_MIXER_TREBLE)854#define SOUND_MIXER_READ_SYNTH		MIXER_READ(SOUND_MIXER_SYNTH)855#define SOUND_MIXER_READ_PCM		MIXER_READ(SOUND_MIXER_PCM)856#define SOUND_MIXER_READ_SPEAKER	MIXER_READ(SOUND_MIXER_SPEAKER)857#define SOUND_MIXER_READ_LINE		MIXER_READ(SOUND_MIXER_LINE)858#define SOUND_MIXER_READ_MIC		MIXER_READ(SOUND_MIXER_MIC)859#define SOUND_MIXER_READ_CD		MIXER_READ(SOUND_MIXER_CD)860#define SOUND_MIXER_READ_IMIX		MIXER_READ(SOUND_MIXER_IMIX)861#define SOUND_MIXER_READ_ALTPCM		MIXER_READ(SOUND_MIXER_ALTPCM)862#define SOUND_MIXER_READ_RECLEV		MIXER_READ(SOUND_MIXER_RECLEV)863#define SOUND_MIXER_READ_IGAIN		MIXER_READ(SOUND_MIXER_IGAIN)864#define SOUND_MIXER_READ_OGAIN		MIXER_READ(SOUND_MIXER_OGAIN)865#define SOUND_MIXER_READ_LINE1		MIXER_READ(SOUND_MIXER_LINE1)866#define SOUND_MIXER_READ_LINE2		MIXER_READ(SOUND_MIXER_LINE2)867#define SOUND_MIXER_READ_LINE3		MIXER_READ(SOUND_MIXER_LINE3)868 869/* Obsolete macros */870#define SOUND_MIXER_READ_MUTE		MIXER_READ(SOUND_MIXER_MUTE)871#define SOUND_MIXER_READ_ENHANCE	MIXER_READ(SOUND_MIXER_ENHANCE)872#define SOUND_MIXER_READ_LOUD		MIXER_READ(SOUND_MIXER_LOUD)873 874#define SOUND_MIXER_READ_RECSRC		MIXER_READ(SOUND_MIXER_RECSRC)875#define SOUND_MIXER_READ_DEVMASK	MIXER_READ(SOUND_MIXER_DEVMASK)876#define SOUND_MIXER_READ_RECMASK	MIXER_READ(SOUND_MIXER_RECMASK)877#define SOUND_MIXER_READ_STEREODEVS	MIXER_READ(SOUND_MIXER_STEREODEVS)878#define SOUND_MIXER_READ_CAPS		MIXER_READ(SOUND_MIXER_CAPS)879 880#define MIXER_WRITE(dev)		_SIOWR('M', dev, int)881#define SOUND_MIXER_WRITE_VOLUME	MIXER_WRITE(SOUND_MIXER_VOLUME)882#define SOUND_MIXER_WRITE_BASS		MIXER_WRITE(SOUND_MIXER_BASS)883#define SOUND_MIXER_WRITE_TREBLE	MIXER_WRITE(SOUND_MIXER_TREBLE)884#define SOUND_MIXER_WRITE_SYNTH		MIXER_WRITE(SOUND_MIXER_SYNTH)885#define SOUND_MIXER_WRITE_PCM		MIXER_WRITE(SOUND_MIXER_PCM)886#define SOUND_MIXER_WRITE_SPEAKER	MIXER_WRITE(SOUND_MIXER_SPEAKER)887#define SOUND_MIXER_WRITE_LINE		MIXER_WRITE(SOUND_MIXER_LINE)888#define SOUND_MIXER_WRITE_MIC		MIXER_WRITE(SOUND_MIXER_MIC)889#define SOUND_MIXER_WRITE_CD		MIXER_WRITE(SOUND_MIXER_CD)890#define SOUND_MIXER_WRITE_IMIX		MIXER_WRITE(SOUND_MIXER_IMIX)891#define SOUND_MIXER_WRITE_ALTPCM	MIXER_WRITE(SOUND_MIXER_ALTPCM)892#define SOUND_MIXER_WRITE_RECLEV	MIXER_WRITE(SOUND_MIXER_RECLEV)893#define SOUND_MIXER_WRITE_IGAIN		MIXER_WRITE(SOUND_MIXER_IGAIN)894#define SOUND_MIXER_WRITE_OGAIN		MIXER_WRITE(SOUND_MIXER_OGAIN)895#define SOUND_MIXER_WRITE_LINE1		MIXER_WRITE(SOUND_MIXER_LINE1)896#define SOUND_MIXER_WRITE_LINE2		MIXER_WRITE(SOUND_MIXER_LINE2)897#define SOUND_MIXER_WRITE_LINE3		MIXER_WRITE(SOUND_MIXER_LINE3)898 899/* Obsolete macros */900#define SOUND_MIXER_WRITE_MUTE		MIXER_WRITE(SOUND_MIXER_MUTE)901#define SOUND_MIXER_WRITE_ENHANCE	MIXER_WRITE(SOUND_MIXER_ENHANCE)902#define SOUND_MIXER_WRITE_LOUD		MIXER_WRITE(SOUND_MIXER_LOUD)903 904#define SOUND_MIXER_WRITE_RECSRC	MIXER_WRITE(SOUND_MIXER_RECSRC)905 906typedef struct mixer_info907{908  char id[16];909  char name[32];910  int  modify_counter;911  int fillers[10];912} mixer_info;913 914typedef struct _old_mixer_info /* Obsolete */915{916  char id[16];917  char name[32];918} _old_mixer_info;919 920#define SOUND_MIXER_INFO		_SIOR ('M', 101, mixer_info)921#define SOUND_OLD_MIXER_INFO		_SIOR ('M', 101, _old_mixer_info)922 923/*924 * A mechanism for accessing "proprietary" mixer features. This method925 * permits passing 128 bytes of arbitrary data between a mixer application926 * and the mixer driver. Interpretation of the record is defined by927 * the particular mixer driver.928 */929typedef unsigned char mixer_record[128];930 931#define SOUND_MIXER_ACCESS		_SIOWR('M', 102, mixer_record)932 933/*934 * Two ioctls for special souncard function935 */936#define SOUND_MIXER_AGC  _SIOWR('M', 103, int)937#define SOUND_MIXER_3DSE  _SIOWR('M', 104, int)938 939/*940 * The SOUND_MIXER_PRIVATE# commands can be redefined by low level drivers.941 * These features can be used when accessing device specific features.942 */943#define SOUND_MIXER_PRIVATE1		_SIOWR('M', 111, int)944#define SOUND_MIXER_PRIVATE2		_SIOWR('M', 112, int)945#define SOUND_MIXER_PRIVATE3		_SIOWR('M', 113, int)946#define SOUND_MIXER_PRIVATE4		_SIOWR('M', 114, int)947#define SOUND_MIXER_PRIVATE5		_SIOWR('M', 115, int)948 949/*950 * SOUND_MIXER_GETLEVELS and SOUND_MIXER_SETLEVELS calls can be used951 * for querying current mixer settings from the driver and for loading952 * default volume settings _prior_ activating the mixer (loading953 * doesn't affect current state of the mixer hardware). These calls954 * are for internal use only.955 */956 957typedef struct mixer_vol_table {958  int num;	/* Index to volume table */959  char name[32];960  int levels[32];961} mixer_vol_table;962 963#define SOUND_MIXER_GETLEVELS		_SIOWR('M', 116, mixer_vol_table)964#define SOUND_MIXER_SETLEVELS		_SIOWR('M', 117, mixer_vol_table)965 966/* 967 * An ioctl for identifying the driver version. It will return value968 * of the SOUND_VERSION macro used when compiling the driver.969 * This call was introduced in OSS version 3.6 and it will not work970 * with earlier versions (returns EINVAL).971 */972#define OSS_GETVERSION			_SIOR ('M', 118, int)973 974/*975 * Level 2 event types for /dev/sequencer976 */977 978/*979 * The 4 most significant bits of byte 0 specify the class of980 * the event: 981 *982 *	0x8X = system level events,983 *	0x9X = device/port specific events, event[1] = device/port,984 *		The last 4 bits give the subtype:985 *			0x02	= Channel event (event[3] = chn).986 *			0x01	= note event (event[4] = note).987 *			(0x01 is not used alone but always with bit 0x02).988 *	       event[2] = MIDI message code (0x80=note off etc.)989 *990 */991 992#define EV_SEQ_LOCAL		0x80993#define EV_TIMING		0x81994#define EV_CHN_COMMON		0x92995#define EV_CHN_VOICE		0x93996#define EV_SYSEX		0x94997/*998 * Event types 200 to 220 are reserved for application use.999 * These numbers will not be used by the driver.1000 */1001 1002/*1003 * Events for event type EV_CHN_VOICE1004 */1005 1006#define MIDI_NOTEOFF		0x801007#define MIDI_NOTEON		0x901008#define MIDI_KEY_PRESSURE	0xA01009 1010/*1011 * Events for event type EV_CHN_COMMON1012 */1013 1014#define MIDI_CTL_CHANGE		0xB01015#define MIDI_PGM_CHANGE		0xC01016#define MIDI_CHN_PRESSURE	0xD01017#define MIDI_PITCH_BEND		0xE01018 1019#define MIDI_SYSTEM_PREFIX	0xF01020 1021/*1022 * Timer event types1023 */1024#define TMR_WAIT_REL		1	/* Time relative to the prev time */1025#define TMR_WAIT_ABS		2	/* Absolute time since TMR_START */1026#define TMR_STOP		31027#define TMR_START		41028#define TMR_CONTINUE		51029#define TMR_TEMPO		61030#define TMR_ECHO		81031#define TMR_CLOCK		9	/* MIDI clock */1032#define TMR_SPP			10	/* Song position pointer */1033#define TMR_TIMESIG		11	/* Time signature */1034 1035/*1036 *	Local event types1037 */1038#define LOCL_STARTAUDIO		11039 1040#if !defined(__KERNEL__) || defined(USE_SEQ_MACROS)1041/*1042 *	Some convenience macros to simplify programming of the1043 *	/dev/sequencer interface1044 *1045 *	This is a legacy interface for applications written against1046 *	the OSSlib-3.8 style interface. It is no longer possible1047 *	to actually link against OSSlib with this header, but we1048 *	still provide these macros for programs using them.1049 *1050 *	If you want to use OSSlib, it is recommended that you get1051 *	the GPL version of OSS-4.x and build against that version1052 *	of the header.1053 *1054 *	We redefine the extern keyword so that usr/include/headers_check.pl1055 *	does not complain about SEQ_USE_EXTBUF.1056 */1057#define SEQ_DECLAREBUF()		SEQ_USE_EXTBUF()1058 1059void seqbuf_dump(void);	/* This function must be provided by programs */1060 1061#define SEQ_PM_DEFINES int __foo_bar___1062 1063#define SEQ_LOAD_GMINSTR(dev, instr)1064#define SEQ_LOAD_GMDRUM(dev, drum)1065 1066#define _SEQ_EXTERN extern1067#define SEQ_USE_EXTBUF() \1068		_SEQ_EXTERN unsigned char _seqbuf[]; \1069		_SEQ_EXTERN int _seqbuflen; _SEQ_EXTERN int _seqbufptr1070 1071#ifndef USE_SIMPLE_MACROS1072/* Sample seqbuf_dump() implementation:1073 *1074 *	SEQ_DEFINEBUF (2048);	-- Defines a buffer for 2048 bytes1075 *1076 *	int seqfd;		-- The file descriptor for /dev/sequencer.1077 *1078 *	void1079 *	seqbuf_dump ()1080 *	{1081 *	  if (_seqbufptr)1082 *	    if (write (seqfd, _seqbuf, _seqbufptr) == -1)1083 *	      {1084 *		perror ("write /dev/sequencer");1085 *		exit (-1);1086 *	      }1087 *	  _seqbufptr = 0;1088 *	}1089 */1090 1091#define SEQ_DEFINEBUF(len)		unsigned char _seqbuf[len]; int _seqbuflen = len;int _seqbufptr = 01092#define _SEQ_NEEDBUF(len)		if ((_seqbufptr+(len)) > _seqbuflen) seqbuf_dump()1093#define _SEQ_ADVBUF(len)		_seqbufptr += len1094#define SEQ_DUMPBUF			seqbuf_dump1095#else1096/*1097 * This variation of the sequencer macros is used just to format one event1098 * using fixed buffer.1099 * 1100 * The program using the macro library must define the following macros before1101 * using this library.1102 *1103 * #define _seqbuf 		 name of the buffer (unsigned char[]) 1104 * #define _SEQ_ADVBUF(len)	 If the applic needs to know the exact1105 *				 size of the event, this macro can be used.1106 *				 Otherwise this must be defined as empty.1107 * #define _seqbufptr		 Define the name of index variable or 0 if1108 *				 not required. 1109 */1110#define _SEQ_NEEDBUF(len)	/* empty */1111#endif1112 1113#define SEQ_VOLUME_MODE(dev, mode)	{_SEQ_NEEDBUF(8);\1114					_seqbuf[_seqbufptr] = SEQ_EXTENDED;\1115					_seqbuf[_seqbufptr+1] = SEQ_VOLMODE;\1116					_seqbuf[_seqbufptr+2] = (dev);\1117					_seqbuf[_seqbufptr+3] = (mode);\1118					_seqbuf[_seqbufptr+4] = 0;\1119					_seqbuf[_seqbufptr+5] = 0;\1120					_seqbuf[_seqbufptr+6] = 0;\1121					_seqbuf[_seqbufptr+7] = 0;\1122					_SEQ_ADVBUF(8);}1123 1124/*1125 * Midi voice messages1126 */1127 1128#define _CHN_VOICE(dev, event, chn, note, parm) \1129					{_SEQ_NEEDBUF(8);\1130					_seqbuf[_seqbufptr] = EV_CHN_VOICE;\1131					_seqbuf[_seqbufptr+1] = (dev);\1132					_seqbuf[_seqbufptr+2] = (event);\1133					_seqbuf[_seqbufptr+3] = (chn);\1134					_seqbuf[_seqbufptr+4] = (note);\1135					_seqbuf[_seqbufptr+5] = (parm);\1136					_seqbuf[_seqbufptr+6] = (0);\1137					_seqbuf[_seqbufptr+7] = 0;\1138					_SEQ_ADVBUF(8);}1139 1140#define SEQ_START_NOTE(dev, chn, note, vol) \1141		_CHN_VOICE(dev, MIDI_NOTEON, chn, note, vol)1142 1143#define SEQ_STOP_NOTE(dev, chn, note, vol) \1144		_CHN_VOICE(dev, MIDI_NOTEOFF, chn, note, vol)1145 1146#define SEQ_KEY_PRESSURE(dev, chn, note, pressure) \1147		_CHN_VOICE(dev, MIDI_KEY_PRESSURE, chn, note, pressure)1148 1149/*1150 * Midi channel messages1151 */1152 1153#define _CHN_COMMON(dev, event, chn, p1, p2, w14) \1154					{_SEQ_NEEDBUF(8);\1155					_seqbuf[_seqbufptr] = EV_CHN_COMMON;\1156					_seqbuf[_seqbufptr+1] = (dev);\1157					_seqbuf[_seqbufptr+2] = (event);\1158					_seqbuf[_seqbufptr+3] = (chn);\1159					_seqbuf[_seqbufptr+4] = (p1);\1160					_seqbuf[_seqbufptr+5] = (p2);\1161					*(short *)&_seqbuf[_seqbufptr+6] = (w14);\1162					_SEQ_ADVBUF(8);}1163/*1164 * SEQ_SYSEX permits sending of sysex messages. (It may look that it permits1165 * sending any MIDI bytes but it's absolutely not possible. Trying to do1166 * so _will_ cause problems with MPU401 intelligent mode).1167 *1168 * Sysex messages are sent in blocks of 1 to 6 bytes. Longer messages must be 1169 * sent by calling SEQ_SYSEX() several times (there must be no other events1170 * between them). First sysex fragment must have 0xf0 in the first byte1171 * and the last byte (buf[len-1] of the last fragment must be 0xf7. No byte1172 * between these sysex start and end markers cannot be larger than 0x7f. Also1173 * lengths of each fragments (except the last one) must be 6.1174 *1175 * Breaking the above rules may work with some MIDI ports but is likely to1176 * cause fatal problems with some other devices (such as MPU401).1177 */1178#define SEQ_SYSEX(dev, buf, len) \1179					{int ii, ll=(len); \1180					 unsigned char *bufp=buf;\1181					 if (ll>6)ll=6;\1182					_SEQ_NEEDBUF(8);\1183					_seqbuf[_seqbufptr] = EV_SYSEX;\1184					_seqbuf[_seqbufptr+1] = (dev);\1185					for(ii=0;ii<ll;ii++)\1186					   _seqbuf[_seqbufptr+ii+2] = bufp[ii];\1187					for(ii=ll;ii<6;ii++)\1188					   _seqbuf[_seqbufptr+ii+2] = 0xff;\1189					_SEQ_ADVBUF(8);}1190 1191#define SEQ_CHN_PRESSURE(dev, chn, pressure) \1192		_CHN_COMMON(dev, MIDI_CHN_PRESSURE, chn, pressure, 0, 0)1193 1194#define SEQ_SET_PATCH SEQ_PGM_CHANGE1195#define SEQ_PGM_CHANGE(dev, chn, patch) \1196		_CHN_COMMON(dev, MIDI_PGM_CHANGE, chn, patch, 0, 0)1197 1198#define SEQ_CONTROL(dev, chn, controller, value) \1199		_CHN_COMMON(dev, MIDI_CTL_CHANGE, chn, controller, 0, value)1200 1201#define SEQ_BENDER(dev, chn, value) \1202		_CHN_COMMON(dev, MIDI_PITCH_BEND, chn, 0, 0, value)1203 1204 1205#define SEQ_V2_X_CONTROL(dev, voice, controller, value)	{_SEQ_NEEDBUF(8);\1206					_seqbuf[_seqbufptr] = SEQ_EXTENDED;\1207					_seqbuf[_seqbufptr+1] = SEQ_CONTROLLER;\1208					_seqbuf[_seqbufptr+2] = (dev);\1209					_seqbuf[_seqbufptr+3] = (voice);\1210					_seqbuf[_seqbufptr+4] = (controller);\1211					_seqbuf[_seqbufptr+5] = ((value)&0xff);\1212					_seqbuf[_seqbufptr+6] = ((value>>8)&0xff);\1213					_seqbuf[_seqbufptr+7] = 0;\1214					_SEQ_ADVBUF(8);}1215/*1216 * The following 5 macros are incorrectly implemented and obsolete.1217 * Use SEQ_BENDER and SEQ_CONTROL (with proper controller) instead.1218 */1219#define SEQ_PITCHBEND(dev, voice, value) SEQ_V2_X_CONTROL(dev, voice, CTRL_PITCH_BENDER, value)1220#define SEQ_BENDER_RANGE(dev, voice, value) SEQ_V2_X_CONTROL(dev, voice, CTRL_PITCH_BENDER_RANGE, value)1221#define SEQ_EXPRESSION(dev, voice, value) SEQ_CONTROL(dev, voice, CTL_EXPRESSION, value*128)1222#define SEQ_MAIN_VOLUME(dev, voice, value) SEQ_CONTROL(dev, voice, CTL_MAIN_VOLUME, (value*16383)/100)1223#define SEQ_PANNING(dev, voice, pos) SEQ_CONTROL(dev, voice, CTL_PAN, (pos+128) / 2)1224 1225/*1226 * Timing and synchronization macros1227 */1228 1229#define _TIMER_EVENT(ev, parm)		{_SEQ_NEEDBUF(8);\1230				 	_seqbuf[_seqbufptr+0] = EV_TIMING; \1231				 	_seqbuf[_seqbufptr+1] = (ev); \1232					_seqbuf[_seqbufptr+2] = 0;\1233					_seqbuf[_seqbufptr+3] = 0;\1234				 	*(unsigned int *)&_seqbuf[_seqbufptr+4] = (parm); \1235					_SEQ_ADVBUF(8);}1236 1237#define SEQ_START_TIMER()		_TIMER_EVENT(TMR_START, 0)1238#define SEQ_STOP_TIMER()		_TIMER_EVENT(TMR_STOP, 0)1239#define SEQ_CONTINUE_TIMER()		_TIMER_EVENT(TMR_CONTINUE, 0)1240#define SEQ_WAIT_TIME(ticks)		_TIMER_EVENT(TMR_WAIT_ABS, ticks)1241#define SEQ_DELTA_TIME(ticks)		_TIMER_EVENT(TMR_WAIT_REL, ticks)1242#define SEQ_ECHO_BACK(key)		_TIMER_EVENT(TMR_ECHO, key)1243#define SEQ_SET_TEMPO(value)		_TIMER_EVENT(TMR_TEMPO, value)1244#define SEQ_SONGPOS(pos)		_TIMER_EVENT(TMR_SPP, pos)1245#define SEQ_TIME_SIGNATURE(sig)		_TIMER_EVENT(TMR_TIMESIG, sig)1246 1247/*1248 * Local control events1249 */1250 1251#define _LOCAL_EVENT(ev, parm)		{_SEQ_NEEDBUF(8);\1252				 	_seqbuf[_seqbufptr+0] = EV_SEQ_LOCAL; \1253				 	_seqbuf[_seqbufptr+1] = (ev); \1254					_seqbuf[_seqbufptr+2] = 0;\1255					_seqbuf[_seqbufptr+3] = 0;\1256				 	*(unsigned int *)&_seqbuf[_seqbufptr+4] = (parm); \1257					_SEQ_ADVBUF(8);}1258 1259#define SEQ_PLAYAUDIO(devmask)		_LOCAL_EVENT(LOCL_STARTAUDIO, devmask)1260/*1261 * Events for the level 1 interface only 1262 */1263 1264#define SEQ_MIDIOUT(device, byte)	{_SEQ_NEEDBUF(4);\1265					_seqbuf[_seqbufptr] = SEQ_MIDIPUTC;\1266					_seqbuf[_seqbufptr+1] = (byte);\1267					_seqbuf[_seqbufptr+2] = (device);\1268					_seqbuf[_seqbufptr+3] = 0;\1269					_SEQ_ADVBUF(4);}1270 1271/*1272 * Patch loading.1273 */1274#define SEQ_WRPATCH(patchx, len) \1275		{if (_seqbufptr) SEQ_DUMPBUF();\1276		 if (write(seqfd, (char*)(patchx), len)==-1) \1277		    perror("Write patch: /dev/sequencer");}1278#define SEQ_WRPATCH2(patchx, len) \1279		(SEQ_DUMPBUF(), write(seqfd, (char*)(patchx), len))1280 1281#endif1282#endif /* _UAPISOUNDCARD_H */1283