linux-headers (unknown)

(root)/
include/
linux/
soundcard.h
       1  /*
       2   * Copyright by Hannu Savolainen 1993-1997
       3   *
       4   * Redistribution and use in source and binary forms, with or without
       5   * modification, are permitted provided that the following conditions are
       6   * met: 1. Redistributions of source code must retain the above copyright
       7   * 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 documentation
      10   * and/or other materials provided with the distribution.
      11   *
      12   * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY
      13   * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
      14   * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
      15   * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
      16   * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
      17   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
      18   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
      19   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
      20   * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
      21   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
      22   * SUCH DAMAGE.
      23   */
      24  #ifndef SOUNDCARD_H
      25  #define SOUNDCARD_H
      26  
      27  
      28  /*
      29   * OSS interface version. With versions earlier than 3.6 this value is
      30   * an integer with value less than 361. In versions 3.6 and later
      31   * it's a six digit hexadecimal value. For example value
      32   * of 0x030600 represents OSS version 3.6.0.
      33   * Use ioctl(fd, OSS_GETVERSION, &int) to get the version number of
      34   * the currently active driver.
      35   */
      36  #define SOUND_VERSION	0x030802
      37  #define OPEN_SOUND_SYSTEM
      38  
      39  /* In Linux we need to be prepared for cross compiling */
      40  #include <linux/ioctl.h>
      41  
      42  /* Endian macros. */
      43  #  include <endian.h>
      44  
      45  /*
      46   *	Supported card ID numbers (Should be somewhere else?)
      47   */
      48  
      49  #define SNDCARD_ADLIB		1
      50  #define SNDCARD_SB		2
      51  #define SNDCARD_PAS		3
      52  #define SNDCARD_GUS		4
      53  #define SNDCARD_MPU401		5
      54  #define SNDCARD_SB16		6
      55  #define SNDCARD_SB16MIDI	7
      56  #define SNDCARD_UART6850	8
      57  #define SNDCARD_GUS16		9
      58  #define SNDCARD_MSS		10
      59  #define SNDCARD_PSS     	11
      60  #define SNDCARD_SSCAPE		12
      61  #define SNDCARD_PSS_MPU     	13
      62  #define SNDCARD_PSS_MSS     	14
      63  #define SNDCARD_SSCAPE_MSS	15
      64  #define SNDCARD_TRXPRO		16
      65  #define SNDCARD_TRXPRO_SB	17
      66  #define SNDCARD_TRXPRO_MPU	18
      67  #define SNDCARD_MAD16		19
      68  #define SNDCARD_MAD16_MPU	20
      69  #define SNDCARD_CS4232		21
      70  #define SNDCARD_CS4232_MPU	22
      71  #define SNDCARD_MAUI		23
      72  #define SNDCARD_PSEUDO_MSS	24
      73  #define SNDCARD_GUSPNP		25
      74  #define SNDCARD_UART401		26
      75  /* Sound card numbers 27 to N are reserved. Don't add more numbers here. */
      76  
      77  /***********************************
      78   * IOCTL Commands for /dev/sequencer
      79   */
      80  
      81  #ifndef _SIOWR
      82  #if defined(_IOWR) && (defined(_AIX) || (!defined(sun) && !defined(sparc) && !defined(__sparc__) && !defined(__INCioctlh) && !defined(__Lynx__)))
      83  /* Use already defined ioctl defines if they exist (except with Sun or Sparc) */
      84  #define	SIOCPARM_MASK	IOCPARM_MASK
      85  #define	SIOC_VOID	IOC_VOID
      86  #define	SIOC_OUT	IOC_OUT
      87  #define	SIOC_IN		IOC_IN
      88  #define	SIOC_INOUT	IOC_INOUT
      89  #define _SIOC_SIZE	_IOC_SIZE
      90  #define _SIOC_DIR	_IOC_DIR
      91  #define _SIOC_NONE	_IOC_NONE
      92  #define _SIOC_READ	_IOC_READ
      93  #define _SIOC_WRITE	_IOC_WRITE
      94  #define	_SIO		_IO
      95  #define	_SIOR		_IOR
      96  #define	_SIOW		_IOW
      97  #define	_SIOWR		_IOWR
      98  #else
      99  
     100  /* Ioctl's have the command encoded in the lower word,
     101   * and the size of any in or out parameters in the upper
     102   * word.  The high 2 bits of the upper word are used
     103   * to encode the in/out status of the parameter; for now
     104   * we restrict parameters to at most 8191 bytes.
     105   */
     106  /* #define	SIOCTYPE		(0xff<<8) */
     107  #define	SIOCPARM_MASK	0x1fff		/* parameters must be < 8192 bytes */
     108  #define	SIOC_VOID	0x00000000	/* no parameters */
     109  #define	SIOC_OUT	0x20000000	/* copy out parameters */
     110  #define	SIOC_IN		0x40000000	/* copy in parameters */
     111  #define	SIOC_INOUT	(SIOC_IN|SIOC_OUT)
     112  /* the 0x20000000 is so we can distinguish new ioctl's from old */
     113  #define	_SIO(x,y)	((int)(SIOC_VOID|(x<<8)|y))
     114  #define	_SIOR(x,y,t)	((int)(SIOC_OUT|((sizeof(t)&SIOCPARM_MASK)<<16)|(x<<8)|y))
     115  #define	_SIOW(x,y,t)	((int)(SIOC_IN|((sizeof(t)&SIOCPARM_MASK)<<16)|(x<<8)|y))
     116  /* this should be _SIORW, but stdio got there first */
     117  #define	_SIOWR(x,y,t)	((int)(SIOC_INOUT|((sizeof(t)&SIOCPARM_MASK)<<16)|(x<<8)|y))
     118  #define _SIOC_SIZE(x)	((x>>16)&SIOCPARM_MASK)	
     119  #define _SIOC_DIR(x)	(x & 0xf0000000)
     120  #define _SIOC_NONE	SIOC_VOID
     121  #define _SIOC_READ	SIOC_OUT
     122  #define _SIOC_WRITE	SIOC_IN
     123  #  endif /* _IOWR */
     124  #endif  /* !_SIOWR */
     125  
     126  #define SNDCTL_SEQ_RESET		_SIO  ('Q', 0)
     127  #define SNDCTL_SEQ_SYNC			_SIO  ('Q', 1)
     128  #define SNDCTL_SYNTH_INFO		_SIOWR('Q', 2, struct synth_info)
     129  #define SNDCTL_SEQ_CTRLRATE		_SIOWR('Q', 3, int)	/* Set/get timer resolution (HZ) */
     130  #define SNDCTL_SEQ_GETOUTCOUNT		_SIOR ('Q', 4, int)
     131  #define SNDCTL_SEQ_GETINCOUNT		_SIOR ('Q', 5, int)
     132  #define SNDCTL_SEQ_PERCMODE		_SIOW ('Q', 6, int)
     133  #define SNDCTL_FM_LOAD_INSTR		_SIOW ('Q', 7, struct sbi_instrument)	/* Obsolete. Don't use!!!!!! */
     134  #define SNDCTL_SEQ_TESTMIDI		_SIOW ('Q', 8, int)
     135  #define SNDCTL_SEQ_RESETSAMPLES		_SIOW ('Q', 9, int)
     136  #define SNDCTL_SEQ_NRSYNTHS		_SIOR ('Q',10, int)
     137  #define SNDCTL_SEQ_NRMIDIS		_SIOR ('Q',11, int)
     138  #define SNDCTL_MIDI_INFO		_SIOWR('Q',12, struct midi_info)
     139  #define SNDCTL_SEQ_THRESHOLD		_SIOW ('Q',13, int)
     140  #define SNDCTL_SYNTH_MEMAVL		_SIOWR('Q',14, int)	/* in=dev#, out=memsize */
     141  #define SNDCTL_FM_4OP_ENABLE		_SIOW ('Q',15, int)	/* in=dev# */
     142  #define SNDCTL_SEQ_PANIC		_SIO  ('Q',17)
     143  #define SNDCTL_SEQ_OUTOFBAND		_SIOW ('Q',18, struct seq_event_rec)
     144  #define SNDCTL_SEQ_GETTIME		_SIOR ('Q',19, int)
     145  #define SNDCTL_SYNTH_ID			_SIOWR('Q',20, struct synth_info)
     146  #define SNDCTL_SYNTH_CONTROL		_SIOWR('Q',21, struct synth_control)
     147  #define SNDCTL_SYNTH_REMOVESAMPLE	_SIOWR('Q',22, struct remove_sample)
     148  
     149  typedef struct synth_control
     150  {
     151  	int devno;	/* Synthesizer # */
     152  	char data[4000]; /* Device spesific command/data record */
     153  }synth_control;
     154  
     155  typedef struct remove_sample
     156  {
     157  	int devno;	/* Synthesizer # */
     158  	int bankno;	/* MIDI bank # (0=General MIDI) */
     159  	int instrno;	/* MIDI instrument number */
     160  } remove_sample;
     161  
     162  typedef struct seq_event_rec {
     163  		unsigned char arr[8];
     164  } seq_event_rec;
     165  
     166  #define SNDCTL_TMR_TIMEBASE		_SIOWR('T', 1, int)
     167  #define SNDCTL_TMR_START		_SIO  ('T', 2)
     168  #define SNDCTL_TMR_STOP			_SIO  ('T', 3)
     169  #define SNDCTL_TMR_CONTINUE		_SIO  ('T', 4)
     170  #define SNDCTL_TMR_TEMPO		_SIOWR('T', 5, int)
     171  #define SNDCTL_TMR_SOURCE		_SIOWR('T', 6, int)
     172  #	define TMR_INTERNAL		0x00000001
     173  #	define TMR_EXTERNAL		0x00000002
     174  #		define TMR_MODE_MIDI	0x00000010
     175  #		define TMR_MODE_FSK	0x00000020
     176  #		define TMR_MODE_CLS	0x00000040
     177  #		define TMR_MODE_SMPTE	0x00000080
     178  #define SNDCTL_TMR_METRONOME		_SIOW ('T', 7, int)
     179  #define SNDCTL_TMR_SELECT		_SIOW ('T', 8, int)
     180  
     181  /*
     182   * Some big endian/little endian handling macros
     183   */
     184  
     185  #define _LINUX_PATCHKEY_H_INDIRECT
     186  #include <linux/patchkey.h>
     187  #undef _LINUX_PATCHKEY_H_INDIRECT
     188  
     189  # if defined(__BYTE_ORDER)
     190  #  if __BYTE_ORDER == __BIG_ENDIAN
     191  #    define AFMT_S16_NE AFMT_S16_BE
     192  #  elif __BYTE_ORDER == __LITTLE_ENDIAN
     193  #    define AFMT_S16_NE AFMT_S16_LE
     194  #  else
     195  #    error "could not determine byte order"
     196  #  endif
     197  # endif
     198  
     199  /*
     200   *	Sample loading mechanism for internal synthesizers (/dev/sequencer)
     201   *	The following patch_info structure has been designed to support
     202   *	Gravis UltraSound. It tries to be universal format for uploading
     203   *	sample based patches but is probably too limited.
     204   *
     205   *      (PBD) As Hannu guessed, the GUS structure is too limited for 
     206   *      the WaveFront, but this is the right place for a constant definition.
     207   */
     208  
     209  struct patch_info {
     210  		unsigned short key;		/* Use WAVE_PATCH here */
     211  #define WAVE_PATCH	   _PATCHKEY(0x04)
     212  #define GUS_PATCH	   WAVE_PATCH
     213  #define WAVEFRONT_PATCH    _PATCHKEY(0x06)
     214  
     215  		short device_no;	/* Synthesizer number */
     216  		short instr_no;		/* Midi pgm# */
     217  
     218  		unsigned int mode;
     219  /*
     220   * The least significant byte has the same format than the GUS .PAT
     221   * files
     222   */
     223  #define WAVE_16_BITS	0x01	/* bit 0 = 8 or 16 bit wave data. */
     224  #define WAVE_UNSIGNED	0x02	/* bit 1 = Signed - Unsigned data. */
     225  #define WAVE_LOOPING	0x04	/* bit 2 = looping enabled-1. */
     226  #define WAVE_BIDIR_LOOP	0x08	/* bit 3 = Set is bidirectional looping. */
     227  #define WAVE_LOOP_BACK	0x10	/* bit 4 = Set is looping backward. */
     228  #define WAVE_SUSTAIN_ON	0x20	/* bit 5 = Turn sustaining on. (Env. pts. 3)*/
     229  #define WAVE_ENVELOPES	0x40	/* bit 6 = Enable envelopes - 1 */
     230  #define WAVE_FAST_RELEASE 0x80	/* bit 7 = Shut off immediately after note off */
     231  				/* 	(use the env_rate/env_offs fields). */
     232  /* Linux specific bits */
     233  #define WAVE_VIBRATO	0x00010000	/* The vibrato info is valid */
     234  #define WAVE_TREMOLO	0x00020000	/* The tremolo info is valid */
     235  #define WAVE_SCALE	0x00040000	/* The scaling info is valid */
     236  #define WAVE_FRACTIONS	0x00080000	/* Fraction information is valid */
     237  /* Reserved bits */
     238  #define WAVE_ROM	0x40000000	/* For future use */
     239  #define WAVE_MULAW	0x20000000	/* For future use */
     240  /* Other bits must be zeroed */
     241  
     242  		int len;	/* Size of the wave data in bytes */
     243  		int loop_start, loop_end; /* Byte offsets from the beginning */
     244  
     245  /* 
     246   * The base_freq and base_note fields are used when computing the
     247   * playback speed for a note. The base_note defines the tone frequency
     248   * which is heard if the sample is played using the base_freq as the
     249   * playback speed.
     250   *
     251   * The low_note and high_note fields define the minimum and maximum note
     252   * frequencies for which this sample is valid. It is possible to define
     253   * more than one samples for an instrument number at the same time. The
     254   * low_note and high_note fields are used to select the most suitable one.
     255   *
     256   * The fields base_note, high_note and low_note should contain
     257   * the note frequency multiplied by 1000. For example value for the
     258   * middle A is 440*1000.
     259   */
     260  
     261  		unsigned int base_freq;
     262  		unsigned int base_note;
     263  		unsigned int high_note;
     264  		unsigned int low_note;
     265  		int panning;	/* -128=left, 127=right */
     266  		int detuning;
     267  
     268  /*	New fields introduced in version 1.99.5	*/
     269  
     270         /* Envelope. Enabled by mode bit WAVE_ENVELOPES	*/
     271  		unsigned char	env_rate[ 6 ];	 /* GUS HW ramping rate */
     272  		unsigned char	env_offset[ 6 ]; /* 255 == 100% */
     273  
     274  	/* 
     275  	 * The tremolo, vibrato and scale info are not supported yet.
     276  	 * Enable by setting the mode bits WAVE_TREMOLO, WAVE_VIBRATO or
     277  	 * WAVE_SCALE
     278  	 */
     279  
     280  		unsigned char	tremolo_sweep;
     281  		unsigned char	tremolo_rate;
     282  		unsigned char	tremolo_depth;
     283  	
     284  		unsigned char	vibrato_sweep;
     285  		unsigned char	vibrato_rate;
     286  		unsigned char	vibrato_depth;
     287  
     288  		int		scale_frequency;
     289  		unsigned int	scale_factor;		/* from 0 to 2048 or 0 to 2 */
     290  	
     291  	        int		volume;
     292  		int		fractions;
     293  		int		reserved1;
     294  	        int		spare[2];
     295  		char data[1];	/* The waveform data starts here */
     296  	};
     297  
     298  struct sysex_info {
     299  		short key;		/* Use SYSEX_PATCH or MAUI_PATCH here */
     300  #define SYSEX_PATCH	_PATCHKEY(0x05)
     301  #define MAUI_PATCH	_PATCHKEY(0x06)
     302  		short device_no;	/* Synthesizer number */
     303  		int len;	/* Size of the sysex data in bytes */
     304  		unsigned char data[1];	/* Sysex data starts here */
     305  	};
     306  
     307  /*
     308   * /dev/sequencer input events.
     309   *
     310   * The data written to the /dev/sequencer is a stream of events. Events
     311   * are records of 4 or 8 bytes. The first byte defines the size. 
     312   * Any number of events can be written with a write call. There
     313   * is a set of macros for sending these events. Use these macros if you
     314   * want to maximize portability of your program.
     315   *
     316   * Events SEQ_WAIT, SEQ_MIDIPUTC and SEQ_ECHO. Are also input events.
     317   * (All input events are currently 4 bytes long. Be prepared to support
     318   * 8 byte events also. If you receive any event having first byte >= 128,
     319   * it's a 8 byte event.
     320   *
     321   * The events are documented at the end of this file.
     322   *
     323   * Normal events (4 bytes)
     324   * There is also a 8 byte version of most of the 4 byte events. The
     325   * 8 byte one is recommended.
     326   */
     327  #define SEQ_NOTEOFF		0
     328  #define SEQ_FMNOTEOFF		SEQ_NOTEOFF	/* Just old name */
     329  #define SEQ_NOTEON		1
     330  #define	SEQ_FMNOTEON		SEQ_NOTEON
     331  #define SEQ_WAIT		TMR_WAIT_ABS
     332  #define SEQ_PGMCHANGE		3
     333  #define SEQ_FMPGMCHANGE		SEQ_PGMCHANGE
     334  #define SEQ_SYNCTIMER		TMR_START
     335  #define SEQ_MIDIPUTC		5
     336  #define SEQ_DRUMON		6	/*** OBSOLETE ***/
     337  #define SEQ_DRUMOFF		7	/*** OBSOLETE ***/
     338  #define SEQ_ECHO		TMR_ECHO	/* For synching programs with output */
     339  #define SEQ_AFTERTOUCH		9
     340  #define SEQ_CONTROLLER		10
     341  
     342  /*******************************************
     343   *	Midi controller numbers
     344   *******************************************
     345   * Controllers 0 to 31 (0x00 to 0x1f) and
     346   * 32 to 63 (0x20 to 0x3f) are continuous
     347   * controllers.
     348   * In the MIDI 1.0 these controllers are sent using
     349   * two messages. Controller numbers 0 to 31 are used
     350   * to send the MSB and the controller numbers 32 to 63
     351   * are for the LSB. Note that just 7 bits are used in MIDI bytes.
     352   */
     353  
     354  #define	   CTL_BANK_SELECT		0x00
     355  #define	   CTL_MODWHEEL			0x01
     356  #define    CTL_BREATH			0x02
     357  /*		undefined		0x03 */
     358  #define    CTL_FOOT			0x04
     359  #define    CTL_PORTAMENTO_TIME		0x05
     360  #define    CTL_DATA_ENTRY		0x06
     361  #define    CTL_MAIN_VOLUME		0x07
     362  #define    CTL_BALANCE			0x08
     363  /*		undefined		0x09 */
     364  #define    CTL_PAN			0x0a
     365  #define    CTL_EXPRESSION		0x0b
     366  /*		undefined		0x0c */
     367  /*		undefined		0x0d */
     368  /*		undefined		0x0e */
     369  /*		undefined		0x0f */
     370  #define    CTL_GENERAL_PURPOSE1	0x10
     371  #define    CTL_GENERAL_PURPOSE2	0x11
     372  #define    CTL_GENERAL_PURPOSE3	0x12
     373  #define    CTL_GENERAL_PURPOSE4	0x13
     374  /*		undefined		0x14 - 0x1f */
     375  
     376  /*		undefined		0x20 */
     377  /* The controller numbers 0x21 to 0x3f are reserved for the */
     378  /* least significant bytes of the controllers 0x00 to 0x1f. */
     379  /* These controllers are not recognised by the driver. */
     380  
     381  /* Controllers 64 to 69 (0x40 to 0x45) are on/off switches. */
     382  /* 0=OFF and 127=ON (intermediate values are possible) */
     383  #define    CTL_DAMPER_PEDAL		0x40
     384  #define    CTL_SUSTAIN			0x40	/* Alias */
     385  #define    CTL_HOLD			0x40	/* Alias */
     386  #define    CTL_PORTAMENTO		0x41
     387  #define    CTL_SOSTENUTO		0x42
     388  #define    CTL_SOFT_PEDAL		0x43
     389  /*		undefined		0x44 */
     390  #define    CTL_HOLD2			0x45
     391  /*		undefined		0x46 - 0x4f */
     392  
     393  #define    CTL_GENERAL_PURPOSE5	0x50
     394  #define    CTL_GENERAL_PURPOSE6	0x51
     395  #define    CTL_GENERAL_PURPOSE7	0x52
     396  #define    CTL_GENERAL_PURPOSE8	0x53
     397  /*		undefined		0x54 - 0x5a */
     398  #define    CTL_EXT_EFF_DEPTH		0x5b
     399  #define    CTL_TREMOLO_DEPTH		0x5c
     400  #define    CTL_CHORUS_DEPTH		0x5d
     401  #define    CTL_DETUNE_DEPTH		0x5e
     402  #define    CTL_CELESTE_DEPTH		0x5e	/* Alias for the above one */
     403  #define    CTL_PHASER_DEPTH		0x5f
     404  #define    CTL_DATA_INCREMENT		0x60
     405  #define    CTL_DATA_DECREMENT		0x61
     406  #define    CTL_NONREG_PARM_NUM_LSB	0x62
     407  #define    CTL_NONREG_PARM_NUM_MSB	0x63
     408  #define    CTL_REGIST_PARM_NUM_LSB	0x64
     409  #define    CTL_REGIST_PARM_NUM_MSB	0x65
     410  /*		undefined		0x66 - 0x78 */
     411  /*		reserved		0x79 - 0x7f */
     412  
     413  /* Pseudo controllers (not midi compatible) */
     414  #define    CTRL_PITCH_BENDER		255
     415  #define    CTRL_PITCH_BENDER_RANGE	254
     416  #define    CTRL_EXPRESSION		253	/* Obsolete */
     417  #define    CTRL_MAIN_VOLUME		252	/* Obsolete */
     418  #define SEQ_BALANCE		11
     419  #define SEQ_VOLMODE             12
     420  
     421  /*
     422   * Volume mode decides how volumes are used
     423   */
     424  
     425  #define VOL_METHOD_ADAGIO	1
     426  #define VOL_METHOD_LINEAR	2
     427  
     428  /*
     429   * Note! SEQ_WAIT, SEQ_MIDIPUTC and SEQ_ECHO are used also as
     430   *	 input events.
     431   */
     432  
     433  /*
     434   * Event codes 0xf0 to 0xfc are reserved for future extensions.
     435   */
     436  
     437  #define SEQ_FULLSIZE		0xfd	/* Long events */
     438  /*
     439   *	SEQ_FULLSIZE events are used for loading patches/samples to the
     440   *	synthesizer devices. These events are passed directly to the driver
     441   *	of the associated synthesizer device. There is no limit to the size
     442   *	of the extended events. These events are not queued but executed
     443   *	immediately when the write() is called (execution can take several
     444   *	seconds of time). 
     445   *
     446   *	When a SEQ_FULLSIZE message is written to the device, it must
     447   *	be written using exactly one write() call. Other events cannot
     448   *	be mixed to the same write.
     449   *	
     450   *	For FM synths (YM3812/OPL3) use struct sbi_instrument and write it to the 
     451   *	/dev/sequencer. Don't write other data together with the instrument structure
     452   *	Set the key field of the structure to FM_PATCH. The device field is used to
     453   *	route the patch to the corresponding device.
     454   *
     455   *	For wave table use struct patch_info. Initialize the key field
     456   *      to WAVE_PATCH.
     457   */
     458  #define SEQ_PRIVATE		0xfe	/* Low level HW dependent events (8 bytes) */
     459  #define SEQ_EXTENDED		0xff	/* Extended events (8 bytes) OBSOLETE */
     460  
     461  /*
     462   * Record for FM patches
     463   */
     464  
     465  typedef unsigned char sbi_instr_data[32];
     466  
     467  struct sbi_instrument {
     468  		unsigned short	key;	/* FM_PATCH or OPL3_PATCH */
     469  #define FM_PATCH	_PATCHKEY(0x01)
     470  #define OPL3_PATCH	_PATCHKEY(0x03)
     471  		short		device;		/*	Synth# (0-4)	*/
     472  		int 		channel;	/*	Program# to be initialized 	*/
     473  		sbi_instr_data	operators;	/*	Register settings for operator cells (.SBI format)	*/
     474  	};
     475  
     476  struct synth_info {	/* Read only */
     477  		char	name[30];
     478  		int	device;		/* 0-N. INITIALIZE BEFORE CALLING */
     479  		int	synth_type;
     480  #define SYNTH_TYPE_FM			0
     481  #define SYNTH_TYPE_SAMPLE		1
     482  #define SYNTH_TYPE_MIDI			2	/* Midi interface */
     483  
     484  		int	synth_subtype;
     485  #define FM_TYPE_ADLIB			0x00
     486  #define FM_TYPE_OPL3			0x01
     487  #define MIDI_TYPE_MPU401		0x401
     488  
     489  #define SAMPLE_TYPE_BASIC		0x10
     490  #define SAMPLE_TYPE_GUS			SAMPLE_TYPE_BASIC
     491  #define SAMPLE_TYPE_WAVEFRONT           0x11
     492  
     493  		int	perc_mode;	/* No longer supported */
     494  		int	nr_voices;
     495  		int	nr_drums;	/* Obsolete field */
     496  		int	instr_bank_size;
     497  		unsigned int	capabilities;	
     498  #define SYNTH_CAP_PERCMODE		0x00000001 /* No longer used */
     499  #define SYNTH_CAP_OPL3			0x00000002 /* Set if OPL3 supported */
     500  #define SYNTH_CAP_INPUT			0x00000004 /* Input (MIDI) device */
     501  		int	dummies[19];	/* Reserve space */
     502  	};
     503  
     504  struct sound_timer_info {
     505  		char name[32];
     506  		int caps;
     507  	};
     508  
     509  #define MIDI_CAP_MPU401		1		/* MPU-401 intelligent mode */
     510  
     511  struct midi_info {
     512  		char		name[30];
     513  		int		device;		/* 0-N. INITIALIZE BEFORE CALLING */
     514  		unsigned int	capabilities;	/* To be defined later */
     515  		int		dev_type;
     516  		int		dummies[18];	/* Reserve space */
     517  	};
     518  
     519  /********************************************
     520   * ioctl commands for the /dev/midi##
     521   */
     522  typedef struct {
     523  		unsigned char cmd;
     524  		char nr_args, nr_returns;
     525  		unsigned char data[30];
     526  	} mpu_command_rec;
     527  
     528  #define SNDCTL_MIDI_PRETIME		_SIOWR('m', 0, int)
     529  #define SNDCTL_MIDI_MPUMODE		_SIOWR('m', 1, int)
     530  #define SNDCTL_MIDI_MPUCMD		_SIOWR('m', 2, mpu_command_rec)
     531  
     532  /********************************************
     533   * IOCTL commands for /dev/dsp and /dev/audio
     534   */
     535  
     536  #define SNDCTL_DSP_RESET		_SIO  ('P', 0)
     537  #define SNDCTL_DSP_SYNC			_SIO  ('P', 1)
     538  #define SNDCTL_DSP_SPEED		_SIOWR('P', 2, int)
     539  #define SNDCTL_DSP_STEREO		_SIOWR('P', 3, int)
     540  #define SNDCTL_DSP_GETBLKSIZE		_SIOWR('P', 4, int)
     541  #define SNDCTL_DSP_SAMPLESIZE		SNDCTL_DSP_SETFMT
     542  #define SNDCTL_DSP_CHANNELS		_SIOWR('P', 6, int)
     543  #define SOUND_PCM_WRITE_CHANNELS	SNDCTL_DSP_CHANNELS
     544  #define SOUND_PCM_WRITE_FILTER		_SIOWR('P', 7, int)
     545  #define SNDCTL_DSP_POST			_SIO  ('P', 8)
     546  #define SNDCTL_DSP_SUBDIVIDE		_SIOWR('P', 9, int)
     547  #define SNDCTL_DSP_SETFRAGMENT		_SIOWR('P',10, int)
     548  
     549  /*	Audio data formats (Note! U8=8 and S16_LE=16 for compatibility) */
     550  #define SNDCTL_DSP_GETFMTS		_SIOR ('P',11, int) /* Returns a mask */
     551  #define SNDCTL_DSP_SETFMT		_SIOWR('P',5, int) /* Selects ONE fmt*/
     552  #	define AFMT_QUERY		0x00000000	/* Return current fmt */
     553  #	define AFMT_MU_LAW		0x00000001
     554  #	define AFMT_A_LAW		0x00000002
     555  #	define AFMT_IMA_ADPCM		0x00000004
     556  #	define AFMT_U8			0x00000008
     557  #	define AFMT_S16_LE		0x00000010	/* Little endian signed 16*/
     558  #	define AFMT_S16_BE		0x00000020	/* Big endian signed 16 */
     559  #	define AFMT_S8			0x00000040
     560  #	define AFMT_U16_LE		0x00000080	/* Little endian U16 */
     561  #	define AFMT_U16_BE		0x00000100	/* Big endian U16 */
     562  #	define AFMT_MPEG		0x00000200	/* MPEG (2) audio */
     563  #	define AFMT_AC3		0x00000400	/* Dolby Digital AC3 */
     564  
     565  /*
     566   * Buffer status queries.
     567   */
     568  typedef struct audio_buf_info {
     569  			int fragments;	/* # of available fragments (partially usend ones not counted) */
     570  			int fragstotal;	/* Total # of fragments allocated */
     571  			int fragsize;	/* Size of a fragment in bytes */
     572  
     573  			int bytes;	/* Available space in bytes (includes partially used fragments) */
     574  			/* Note! 'bytes' could be more than fragments*fragsize */
     575  		} audio_buf_info;
     576  
     577  #define SNDCTL_DSP_GETOSPACE		_SIOR ('P',12, audio_buf_info)
     578  #define SNDCTL_DSP_GETISPACE		_SIOR ('P',13, audio_buf_info)
     579  #define SNDCTL_DSP_NONBLOCK		_SIO  ('P',14)
     580  #define SNDCTL_DSP_GETCAPS		_SIOR ('P',15, int)
     581  #	define DSP_CAP_REVISION		0x000000ff	/* Bits for revision level (0 to 255) */
     582  #	define DSP_CAP_DUPLEX		0x00000100	/* Full duplex record/playback */
     583  #	define DSP_CAP_REALTIME		0x00000200	/* Real time capability */
     584  #	define DSP_CAP_BATCH		0x00000400	/* Device has some kind of */
     585  							/* internal buffers which may */
     586  							/* cause some delays and */
     587  							/* decrease precision of timing */
     588  #	define DSP_CAP_COPROC		0x00000800	/* Has a coprocessor */
     589  							/* Sometimes it's a DSP */
     590  							/* but usually not */
     591  #	define DSP_CAP_TRIGGER		0x00001000	/* Supports SETTRIGGER */
     592  #	define DSP_CAP_MMAP		0x00002000	/* Supports mmap() */
     593  #	define DSP_CAP_MULTI		0x00004000	/* support multiple open */
     594  #	define DSP_CAP_BIND		0x00008000	/* channel binding to front/rear/cneter/lfe */
     595  
     596  
     597  #define SNDCTL_DSP_GETTRIGGER		_SIOR ('P',16, int)
     598  #define SNDCTL_DSP_SETTRIGGER		_SIOW ('P',16, int)
     599  #	define PCM_ENABLE_INPUT		0x00000001
     600  #	define PCM_ENABLE_OUTPUT		0x00000002
     601  
     602  typedef struct count_info {
     603  		int bytes;	/* Total # of bytes processed */
     604  		int blocks;	/* # of fragment transitions since last time */
     605  		int ptr;	/* Current DMA pointer value */
     606  	} count_info;
     607  
     608  #define SNDCTL_DSP_GETIPTR		_SIOR ('P',17, count_info)
     609  #define SNDCTL_DSP_GETOPTR		_SIOR ('P',18, count_info)
     610  
     611  typedef struct buffmem_desc {
     612  		unsigned *buffer;
     613  		int size;
     614  	} buffmem_desc;
     615  #define SNDCTL_DSP_MAPINBUF		_SIOR ('P', 19, buffmem_desc)
     616  #define SNDCTL_DSP_MAPOUTBUF		_SIOR ('P', 20, buffmem_desc)
     617  #define SNDCTL_DSP_SETSYNCRO		_SIO  ('P', 21)
     618  #define SNDCTL_DSP_SETDUPLEX		_SIO  ('P', 22)
     619  #define SNDCTL_DSP_GETODELAY		_SIOR ('P', 23, int)
     620  
     621  #define SNDCTL_DSP_GETCHANNELMASK		_SIOWR('P', 64, int)
     622  #define SNDCTL_DSP_BIND_CHANNEL		_SIOWR('P', 65, int)
     623  #	define DSP_BIND_QUERY		0x00000000
     624  #	define DSP_BIND_FRONT		0x00000001
     625  #	define DSP_BIND_SURR		0x00000002
     626  #	define DSP_BIND_CENTER_LFE	0x00000004
     627  #	define DSP_BIND_HANDSET		0x00000008
     628  #	define DSP_BIND_MIC		0x00000010
     629  #	define DSP_BIND_MODEM1		0x00000020
     630  #	define DSP_BIND_MODEM2		0x00000040
     631  #	define DSP_BIND_I2S		0x00000080
     632  #	define DSP_BIND_SPDIF		0x00000100
     633  
     634  #define SNDCTL_DSP_SETSPDIF		_SIOW ('P', 66, int)
     635  #define SNDCTL_DSP_GETSPDIF		_SIOR ('P', 67, int)
     636  #	define SPDIF_PRO	0x0001
     637  #	define SPDIF_N_AUD	0x0002
     638  #	define SPDIF_COPY	0x0004
     639  #	define SPDIF_PRE	0x0008
     640  #	define SPDIF_CC		0x07f0
     641  #	define SPDIF_L		0x0800
     642  #	define SPDIF_DRS	0x4000
     643  #	define SPDIF_V		0x8000
     644  
     645  /*
     646   * Application's profile defines the way how playback underrun situations should be handled.
     647   * 
     648   *	APF_NORMAL (the default) and APF_NETWORK make the driver to cleanup the
     649   *	playback buffer whenever an underrun occurs. This consumes some time
     650   *	prevents looping the existing buffer.
     651   *	APF_CPUINTENS is intended to be set by CPU intensive applications which
     652   *	are likely to run out of time occasionally. In this mode the buffer cleanup is
     653   *	disabled which saves CPU time but also let's the previous buffer content to
     654   *	be played during the "pause" after the underrun.
     655   */
     656  #define SNDCTL_DSP_PROFILE		_SIOW ('P', 23, int)
     657  #define	  APF_NORMAL	0	/* Normal applications */
     658  #define	  APF_NETWORK	1	/* Underruns probably caused by an "external" delay */
     659  #define   APF_CPUINTENS 2	/* Underruns probably caused by "overheating" the CPU */
     660  
     661  #define SOUND_PCM_READ_RATE		_SIOR ('P', 2, int)
     662  #define SOUND_PCM_READ_CHANNELS		_SIOR ('P', 6, int)
     663  #define SOUND_PCM_READ_BITS		_SIOR ('P', 5, int)
     664  #define SOUND_PCM_READ_FILTER		_SIOR ('P', 7, int)
     665  
     666  /* Some alias names */
     667  #define SOUND_PCM_WRITE_BITS		SNDCTL_DSP_SETFMT
     668  #define SOUND_PCM_WRITE_RATE		SNDCTL_DSP_SPEED
     669  #define SOUND_PCM_POST			SNDCTL_DSP_POST
     670  #define SOUND_PCM_RESET			SNDCTL_DSP_RESET
     671  #define SOUND_PCM_SYNC			SNDCTL_DSP_SYNC
     672  #define SOUND_PCM_SUBDIVIDE		SNDCTL_DSP_SUBDIVIDE
     673  #define SOUND_PCM_SETFRAGMENT		SNDCTL_DSP_SETFRAGMENT
     674  #define SOUND_PCM_GETFMTS		SNDCTL_DSP_GETFMTS
     675  #define SOUND_PCM_SETFMT		SNDCTL_DSP_SETFMT
     676  #define SOUND_PCM_GETOSPACE		SNDCTL_DSP_GETOSPACE
     677  #define SOUND_PCM_GETISPACE		SNDCTL_DSP_GETISPACE
     678  #define SOUND_PCM_NONBLOCK		SNDCTL_DSP_NONBLOCK
     679  #define SOUND_PCM_GETCAPS		SNDCTL_DSP_GETCAPS
     680  #define SOUND_PCM_GETTRIGGER		SNDCTL_DSP_GETTRIGGER
     681  #define SOUND_PCM_SETTRIGGER		SNDCTL_DSP_SETTRIGGER
     682  #define SOUND_PCM_SETSYNCRO		SNDCTL_DSP_SETSYNCRO
     683  #define SOUND_PCM_GETIPTR		SNDCTL_DSP_GETIPTR
     684  #define SOUND_PCM_GETOPTR		SNDCTL_DSP_GETOPTR
     685  #define SOUND_PCM_MAPINBUF		SNDCTL_DSP_MAPINBUF
     686  #define SOUND_PCM_MAPOUTBUF		SNDCTL_DSP_MAPOUTBUF
     687  
     688  /*
     689   * ioctl calls to be used in communication with coprocessors and
     690   * DSP chips.
     691   */
     692  
     693  typedef struct copr_buffer {
     694  		int command;	/* Set to 0 if not used */
     695  		int flags;
     696  #define CPF_NONE		0x0000
     697  #define CPF_FIRST		0x0001	/* First block */
     698  #define CPF_LAST		0x0002	/* Last block */
     699  		int len;
     700  		int offs;	/* If required by the device (0 if not used) */
     701  
     702  		unsigned char data[4000]; /* NOTE! 4000 is not 4k */
     703  	} copr_buffer;
     704  
     705  typedef struct copr_debug_buf {
     706  		int command;	/* Used internally. Set to 0 */
     707  		int parm1;
     708  		int parm2;
     709  		int flags;	
     710  		int len;	/* Length of data in bytes */
     711  	} copr_debug_buf;
     712  
     713  typedef struct copr_msg {
     714  		int len;
     715  		unsigned char data[4000];
     716  	} copr_msg;
     717  
     718  #define SNDCTL_COPR_RESET             _SIO  ('C',  0)
     719  #define SNDCTL_COPR_LOAD	      _SIOWR('C',  1, copr_buffer)
     720  #define SNDCTL_COPR_RDATA	      _SIOWR('C',  2, copr_debug_buf)
     721  #define SNDCTL_COPR_RCODE	      _SIOWR('C',  3, copr_debug_buf)
     722  #define SNDCTL_COPR_WDATA	      _SIOW ('C',  4, copr_debug_buf)
     723  #define SNDCTL_COPR_WCODE	      _SIOW ('C',  5, copr_debug_buf)
     724  #define SNDCTL_COPR_RUN		      _SIOWR('C',  6, copr_debug_buf)
     725  #define SNDCTL_COPR_HALT	      _SIOWR('C',  7, copr_debug_buf)
     726  #define SNDCTL_COPR_SENDMSG	      _SIOWR('C',  8, copr_msg)
     727  #define SNDCTL_COPR_RCVMSG	      _SIOR ('C',  9, copr_msg)
     728  
     729  /*********************************************
     730   * IOCTL commands for /dev/mixer
     731   */
     732  	
     733  /* 
     734   * Mixer devices
     735   *
     736   * There can be up to 20 different analog mixer channels. The
     737   * SOUND_MIXER_NRDEVICES gives the currently supported maximum. 
     738   * The SOUND_MIXER_READ_DEVMASK returns a bitmask which tells
     739   * the devices supported by the particular mixer.
     740   */
     741  
     742  #define SOUND_MIXER_NRDEVICES	25
     743  #define SOUND_MIXER_VOLUME	0
     744  #define SOUND_MIXER_BASS	1
     745  #define SOUND_MIXER_TREBLE	2
     746  #define SOUND_MIXER_SYNTH	3
     747  #define SOUND_MIXER_PCM		4
     748  #define SOUND_MIXER_SPEAKER	5
     749  #define SOUND_MIXER_LINE	6
     750  #define SOUND_MIXER_MIC		7
     751  #define SOUND_MIXER_CD		8
     752  #define SOUND_MIXER_IMIX	9	/*  Recording monitor  */
     753  #define SOUND_MIXER_ALTPCM	10
     754  #define SOUND_MIXER_RECLEV	11	/* Recording level */
     755  #define SOUND_MIXER_IGAIN	12	/* Input gain */
     756  #define SOUND_MIXER_OGAIN	13	/* Output gain */
     757  /* 
     758   * The AD1848 codec and compatibles have three line level inputs
     759   * (line, aux1 and aux2). Since each card manufacturer have assigned
     760   * different meanings to these inputs, it's inpractical to assign
     761   * specific meanings (line, cd, synth etc.) to them.
     762   */
     763  #define SOUND_MIXER_LINE1	14	/* Input source 1  (aux1) */
     764  #define SOUND_MIXER_LINE2	15	/* Input source 2  (aux2) */
     765  #define SOUND_MIXER_LINE3	16	/* Input source 3  (line) */
     766  #define SOUND_MIXER_DIGITAL1	17	/* Digital (input) 1 */
     767  #define SOUND_MIXER_DIGITAL2	18	/* Digital (input) 2 */
     768  #define SOUND_MIXER_DIGITAL3	19	/* Digital (input) 3 */
     769  #define SOUND_MIXER_PHONEIN	20	/* Phone input */
     770  #define SOUND_MIXER_PHONEOUT	21	/* Phone output */
     771  #define SOUND_MIXER_VIDEO	22	/* Video/TV (audio) in */
     772  #define SOUND_MIXER_RADIO	23	/* Radio in */
     773  #define SOUND_MIXER_MONITOR	24	/* Monitor (usually mic) volume */
     774  
     775  /* Some on/off settings (SOUND_SPECIAL_MIN - SOUND_SPECIAL_MAX) */
     776  /* Not counted to SOUND_MIXER_NRDEVICES, but use the same number space */
     777  #define SOUND_ONOFF_MIN		28
     778  #define SOUND_ONOFF_MAX		30
     779  
     780  /* Note!	Number 31 cannot be used since the sign bit is reserved */
     781  #define SOUND_MIXER_NONE	31
     782  
     783  /*
     784   * The following unsupported macros are no longer functional.
     785   * Use SOUND_MIXER_PRIVATE# macros in future.
     786   */
     787  #define SOUND_MIXER_ENHANCE	SOUND_MIXER_NONE
     788  #define SOUND_MIXER_MUTE	SOUND_MIXER_NONE
     789  #define SOUND_MIXER_LOUD	SOUND_MIXER_NONE
     790  
     791  
     792  #define SOUND_DEVICE_LABELS	{"Vol  ", "Bass ", "Trebl", "Synth", "Pcm  ", "Spkr ", "Line ", \
     793  				 "Mic  ", "CD   ", "Mix  ", "Pcm2 ", "Rec  ", "IGain", "OGain", \
     794  				 "Line1", "Line2", "Line3", "Digital1", "Digital2", "Digital3", \
     795  				 "PhoneIn", "PhoneOut", "Video", "Radio", "Monitor"}
     796  
     797  #define SOUND_DEVICE_NAMES	{"vol", "bass", "treble", "synth", "pcm", "speaker", "line", \
     798  				 "mic", "cd", "mix", "pcm2", "rec", "igain", "ogain", \
     799  				 "line1", "line2", "line3", "dig1", "dig2", "dig3", \
     800  				 "phin", "phout", "video", "radio", "monitor"}
     801  
     802  /*	Device bitmask identifiers	*/
     803  
     804  #define SOUND_MIXER_RECSRC	0xff	/* Arg contains a bit for each recording source */
     805  #define SOUND_MIXER_DEVMASK	0xfe	/* Arg contains a bit for each supported device */
     806  #define SOUND_MIXER_RECMASK	0xfd	/* Arg contains a bit for each supported recording source */
     807  #define SOUND_MIXER_CAPS	0xfc
     808  #	define SOUND_CAP_EXCL_INPUT	0x00000001	/* Only one recording source at a time */
     809  #define SOUND_MIXER_STEREODEVS	0xfb	/* Mixer channels supporting stereo */
     810  #define SOUND_MIXER_OUTSRC	0xfa	/* Arg contains a bit for each input source to output */
     811  #define SOUND_MIXER_OUTMASK	0xf9	/* Arg contains a bit for each supported input source to output */
     812  
     813  /*	Device mask bits	*/
     814  
     815  #define SOUND_MASK_VOLUME	(1 << SOUND_MIXER_VOLUME)
     816  #define SOUND_MASK_BASS		(1 << SOUND_MIXER_BASS)
     817  #define SOUND_MASK_TREBLE	(1 << SOUND_MIXER_TREBLE)
     818  #define SOUND_MASK_SYNTH	(1 << SOUND_MIXER_SYNTH)
     819  #define SOUND_MASK_PCM		(1 << SOUND_MIXER_PCM)
     820  #define SOUND_MASK_SPEAKER	(1 << SOUND_MIXER_SPEAKER)
     821  #define SOUND_MASK_LINE		(1 << SOUND_MIXER_LINE)
     822  #define SOUND_MASK_MIC		(1 << SOUND_MIXER_MIC)
     823  #define SOUND_MASK_CD		(1 << SOUND_MIXER_CD)
     824  #define SOUND_MASK_IMIX		(1 << SOUND_MIXER_IMIX)
     825  #define SOUND_MASK_ALTPCM	(1 << SOUND_MIXER_ALTPCM)
     826  #define SOUND_MASK_RECLEV	(1 << SOUND_MIXER_RECLEV)
     827  #define SOUND_MASK_IGAIN	(1 << SOUND_MIXER_IGAIN)
     828  #define SOUND_MASK_OGAIN	(1 << SOUND_MIXER_OGAIN)
     829  #define SOUND_MASK_LINE1	(1 << SOUND_MIXER_LINE1)
     830  #define SOUND_MASK_LINE2	(1 << SOUND_MIXER_LINE2)
     831  #define SOUND_MASK_LINE3	(1 << SOUND_MIXER_LINE3)
     832  #define SOUND_MASK_DIGITAL1	(1 << SOUND_MIXER_DIGITAL1)
     833  #define SOUND_MASK_DIGITAL2	(1 << SOUND_MIXER_DIGITAL2)
     834  #define SOUND_MASK_DIGITAL3	(1 << SOUND_MIXER_DIGITAL3)
     835  #define SOUND_MASK_PHONEIN	(1 << SOUND_MIXER_PHONEIN)
     836  #define SOUND_MASK_PHONEOUT	(1 << SOUND_MIXER_PHONEOUT)
     837  #define SOUND_MASK_RADIO	(1 << SOUND_MIXER_RADIO)
     838  #define SOUND_MASK_VIDEO	(1 << SOUND_MIXER_VIDEO)
     839  #define SOUND_MASK_MONITOR	(1 << SOUND_MIXER_MONITOR)
     840  
     841  /* Obsolete macros */
     842  #define SOUND_MASK_MUTE		(1 << SOUND_MIXER_MUTE)
     843  #define SOUND_MASK_ENHANCE	(1 << SOUND_MIXER_ENHANCE)
     844  #define SOUND_MASK_LOUD		(1 << SOUND_MIXER_LOUD)
     845  
     846  #define MIXER_READ(dev)		_SIOR('M', dev, int)
     847  #define SOUND_MIXER_READ_VOLUME		MIXER_READ(SOUND_MIXER_VOLUME)
     848  #define SOUND_MIXER_READ_BASS		MIXER_READ(SOUND_MIXER_BASS)
     849  #define SOUND_MIXER_READ_TREBLE		MIXER_READ(SOUND_MIXER_TREBLE)
     850  #define SOUND_MIXER_READ_SYNTH		MIXER_READ(SOUND_MIXER_SYNTH)
     851  #define SOUND_MIXER_READ_PCM		MIXER_READ(SOUND_MIXER_PCM)
     852  #define SOUND_MIXER_READ_SPEAKER	MIXER_READ(SOUND_MIXER_SPEAKER)
     853  #define SOUND_MIXER_READ_LINE		MIXER_READ(SOUND_MIXER_LINE)
     854  #define SOUND_MIXER_READ_MIC		MIXER_READ(SOUND_MIXER_MIC)
     855  #define SOUND_MIXER_READ_CD		MIXER_READ(SOUND_MIXER_CD)
     856  #define SOUND_MIXER_READ_IMIX		MIXER_READ(SOUND_MIXER_IMIX)
     857  #define SOUND_MIXER_READ_ALTPCM		MIXER_READ(SOUND_MIXER_ALTPCM)
     858  #define SOUND_MIXER_READ_RECLEV		MIXER_READ(SOUND_MIXER_RECLEV)
     859  #define SOUND_MIXER_READ_IGAIN		MIXER_READ(SOUND_MIXER_IGAIN)
     860  #define SOUND_MIXER_READ_OGAIN		MIXER_READ(SOUND_MIXER_OGAIN)
     861  #define SOUND_MIXER_READ_LINE1		MIXER_READ(SOUND_MIXER_LINE1)
     862  #define SOUND_MIXER_READ_LINE2		MIXER_READ(SOUND_MIXER_LINE2)
     863  #define SOUND_MIXER_READ_LINE3		MIXER_READ(SOUND_MIXER_LINE3)
     864  
     865  /* Obsolete macros */
     866  #define SOUND_MIXER_READ_MUTE		MIXER_READ(SOUND_MIXER_MUTE)
     867  #define SOUND_MIXER_READ_ENHANCE	MIXER_READ(SOUND_MIXER_ENHANCE)
     868  #define SOUND_MIXER_READ_LOUD		MIXER_READ(SOUND_MIXER_LOUD)
     869  
     870  #define SOUND_MIXER_READ_RECSRC		MIXER_READ(SOUND_MIXER_RECSRC)
     871  #define SOUND_MIXER_READ_DEVMASK	MIXER_READ(SOUND_MIXER_DEVMASK)
     872  #define SOUND_MIXER_READ_RECMASK	MIXER_READ(SOUND_MIXER_RECMASK)
     873  #define SOUND_MIXER_READ_STEREODEVS	MIXER_READ(SOUND_MIXER_STEREODEVS)
     874  #define SOUND_MIXER_READ_CAPS		MIXER_READ(SOUND_MIXER_CAPS)
     875  
     876  #define MIXER_WRITE(dev)		_SIOWR('M', dev, int)
     877  #define SOUND_MIXER_WRITE_VOLUME	MIXER_WRITE(SOUND_MIXER_VOLUME)
     878  #define SOUND_MIXER_WRITE_BASS		MIXER_WRITE(SOUND_MIXER_BASS)
     879  #define SOUND_MIXER_WRITE_TREBLE	MIXER_WRITE(SOUND_MIXER_TREBLE)
     880  #define SOUND_MIXER_WRITE_SYNTH		MIXER_WRITE(SOUND_MIXER_SYNTH)
     881  #define SOUND_MIXER_WRITE_PCM		MIXER_WRITE(SOUND_MIXER_PCM)
     882  #define SOUND_MIXER_WRITE_SPEAKER	MIXER_WRITE(SOUND_MIXER_SPEAKER)
     883  #define SOUND_MIXER_WRITE_LINE		MIXER_WRITE(SOUND_MIXER_LINE)
     884  #define SOUND_MIXER_WRITE_MIC		MIXER_WRITE(SOUND_MIXER_MIC)
     885  #define SOUND_MIXER_WRITE_CD		MIXER_WRITE(SOUND_MIXER_CD)
     886  #define SOUND_MIXER_WRITE_IMIX		MIXER_WRITE(SOUND_MIXER_IMIX)
     887  #define SOUND_MIXER_WRITE_ALTPCM	MIXER_WRITE(SOUND_MIXER_ALTPCM)
     888  #define SOUND_MIXER_WRITE_RECLEV	MIXER_WRITE(SOUND_MIXER_RECLEV)
     889  #define SOUND_MIXER_WRITE_IGAIN		MIXER_WRITE(SOUND_MIXER_IGAIN)
     890  #define SOUND_MIXER_WRITE_OGAIN		MIXER_WRITE(SOUND_MIXER_OGAIN)
     891  #define SOUND_MIXER_WRITE_LINE1		MIXER_WRITE(SOUND_MIXER_LINE1)
     892  #define SOUND_MIXER_WRITE_LINE2		MIXER_WRITE(SOUND_MIXER_LINE2)
     893  #define SOUND_MIXER_WRITE_LINE3		MIXER_WRITE(SOUND_MIXER_LINE3)
     894  
     895  /* Obsolete macros */
     896  #define SOUND_MIXER_WRITE_MUTE		MIXER_WRITE(SOUND_MIXER_MUTE)
     897  #define SOUND_MIXER_WRITE_ENHANCE	MIXER_WRITE(SOUND_MIXER_ENHANCE)
     898  #define SOUND_MIXER_WRITE_LOUD		MIXER_WRITE(SOUND_MIXER_LOUD)
     899  
     900  #define SOUND_MIXER_WRITE_RECSRC	MIXER_WRITE(SOUND_MIXER_RECSRC)
     901  
     902  typedef struct mixer_info
     903  {
     904    char id[16];
     905    char name[32];
     906    int  modify_counter;
     907    int fillers[10];
     908  } mixer_info;
     909  
     910  typedef struct _old_mixer_info /* Obsolete */
     911  {
     912    char id[16];
     913    char name[32];
     914  } _old_mixer_info;
     915  
     916  #define SOUND_MIXER_INFO		_SIOR ('M', 101, mixer_info)
     917  #define SOUND_OLD_MIXER_INFO		_SIOR ('M', 101, _old_mixer_info)
     918  
     919  /*
     920   * A mechanism for accessing "proprietary" mixer features. This method
     921   * permits passing 128 bytes of arbitrary data between a mixer application
     922   * and the mixer driver. Interpretation of the record is defined by
     923   * the particular mixer driver.
     924   */
     925  typedef unsigned char mixer_record[128];
     926  
     927  #define SOUND_MIXER_ACCESS		_SIOWR('M', 102, mixer_record)
     928  
     929  /*
     930   * Two ioctls for special souncard function
     931   */
     932  #define SOUND_MIXER_AGC  _SIOWR('M', 103, int)
     933  #define SOUND_MIXER_3DSE  _SIOWR('M', 104, int)
     934  
     935  /*
     936   * The SOUND_MIXER_PRIVATE# commands can be redefined by low level drivers.
     937   * These features can be used when accessing device specific features.
     938   */
     939  #define SOUND_MIXER_PRIVATE1		_SIOWR('M', 111, int)
     940  #define SOUND_MIXER_PRIVATE2		_SIOWR('M', 112, int)
     941  #define SOUND_MIXER_PRIVATE3		_SIOWR('M', 113, int)
     942  #define SOUND_MIXER_PRIVATE4		_SIOWR('M', 114, int)
     943  #define SOUND_MIXER_PRIVATE5		_SIOWR('M', 115, int)
     944  
     945  /*
     946   * SOUND_MIXER_GETLEVELS and SOUND_MIXER_SETLEVELS calls can be used
     947   * for querying current mixer settings from the driver and for loading
     948   * default volume settings _prior_ activating the mixer (loading
     949   * doesn't affect current state of the mixer hardware). These calls
     950   * are for internal use only.
     951   */
     952  
     953  typedef struct mixer_vol_table {
     954    int num;	/* Index to volume table */
     955    char name[32];
     956    int levels[32];
     957  } mixer_vol_table;
     958  
     959  #define SOUND_MIXER_GETLEVELS		_SIOWR('M', 116, mixer_vol_table)
     960  #define SOUND_MIXER_SETLEVELS		_SIOWR('M', 117, mixer_vol_table)
     961  
     962  /* 
     963   * An ioctl for identifying the driver version. It will return value
     964   * of the SOUND_VERSION macro used when compiling the driver.
     965   * This call was introduced in OSS version 3.6 and it will not work
     966   * with earlier versions (returns EINVAL).
     967   */
     968  #define OSS_GETVERSION			_SIOR ('M', 118, int)
     969  
     970  /*
     971   * Level 2 event types for /dev/sequencer
     972   */
     973  
     974  /*
     975   * The 4 most significant bits of byte 0 specify the class of
     976   * the event: 
     977   *
     978   *	0x8X = system level events,
     979   *	0x9X = device/port specific events, event[1] = device/port,
     980   *		The last 4 bits give the subtype:
     981   *			0x02	= Channel event (event[3] = chn).
     982   *			0x01	= note event (event[4] = note).
     983   *			(0x01 is not used alone but always with bit 0x02).
     984   *	       event[2] = MIDI message code (0x80=note off etc.)
     985   *
     986   */
     987  
     988  #define EV_SEQ_LOCAL		0x80
     989  #define EV_TIMING		0x81
     990  #define EV_CHN_COMMON		0x92
     991  #define EV_CHN_VOICE		0x93
     992  #define EV_SYSEX		0x94
     993  /*
     994   * Event types 200 to 220 are reserved for application use.
     995   * These numbers will not be used by the driver.
     996   */
     997  
     998  /*
     999   * Events for event type EV_CHN_VOICE
    1000   */
    1001  
    1002  #define MIDI_NOTEOFF		0x80
    1003  #define MIDI_NOTEON		0x90
    1004  #define MIDI_KEY_PRESSURE	0xA0
    1005  
    1006  /*
    1007   * Events for event type EV_CHN_COMMON
    1008   */
    1009  
    1010  #define MIDI_CTL_CHANGE		0xB0
    1011  #define MIDI_PGM_CHANGE		0xC0
    1012  #define MIDI_CHN_PRESSURE	0xD0
    1013  #define MIDI_PITCH_BEND		0xE0
    1014  
    1015  #define MIDI_SYSTEM_PREFIX	0xF0
    1016  
    1017  /*
    1018   * Timer event types
    1019   */
    1020  #define TMR_WAIT_REL		1	/* Time relative to the prev time */
    1021  #define TMR_WAIT_ABS		2	/* Absolute time since TMR_START */
    1022  #define TMR_STOP		3
    1023  #define TMR_START		4
    1024  #define TMR_CONTINUE		5
    1025  #define TMR_TEMPO		6
    1026  #define TMR_ECHO		8
    1027  #define TMR_CLOCK		9	/* MIDI clock */
    1028  #define TMR_SPP			10	/* Song position pointer */
    1029  #define TMR_TIMESIG		11	/* Time signature */
    1030  
    1031  /*
    1032   *	Local event types
    1033   */
    1034  #define LOCL_STARTAUDIO		1
    1035  
    1036  /*
    1037   *	Some convenience macros to simplify programming of the
    1038   *	/dev/sequencer interface
    1039   *
    1040   *	This is a legacy interface for applications written against
    1041   *	the OSSlib-3.8 style interface. It is no longer possible
    1042   *	to actually link against OSSlib with this header, but we
    1043   *	still provide these macros for programs using them.
    1044   *
    1045   *	If you want to use OSSlib, it is recommended that you get
    1046   *	the GPL version of OSS-4.x and build against that version
    1047   *	of the header.
    1048   *
    1049   *	We redefine the extern keyword so that usr/include/headers_check.pl
    1050   *	does not complain about SEQ_USE_EXTBUF.
    1051   */
    1052  #define SEQ_DECLAREBUF()		SEQ_USE_EXTBUF()
    1053  
    1054  void seqbuf_dump(void);	/* This function must be provided by programs */
    1055  
    1056  #define SEQ_PM_DEFINES int __foo_bar___
    1057  
    1058  #define SEQ_LOAD_GMINSTR(dev, instr)
    1059  #define SEQ_LOAD_GMDRUM(dev, drum)
    1060  
    1061  #define _SEQ_EXTERN extern
    1062  #define SEQ_USE_EXTBUF() \
    1063  		_SEQ_EXTERN unsigned char _seqbuf[]; \
    1064  		_SEQ_EXTERN int _seqbuflen; _SEQ_EXTERN int _seqbufptr
    1065  
    1066  #ifndef USE_SIMPLE_MACROS
    1067  /* Sample seqbuf_dump() implementation:
    1068   *
    1069   *	SEQ_DEFINEBUF (2048);	-- Defines a buffer for 2048 bytes
    1070   *
    1071   *	int seqfd;		-- The file descriptor for /dev/sequencer.
    1072   *
    1073   *	void
    1074   *	seqbuf_dump ()
    1075   *	{
    1076   *	  if (_seqbufptr)
    1077   *	    if (write (seqfd, _seqbuf, _seqbufptr) == -1)
    1078   *	      {
    1079   *		perror ("write /dev/sequencer");
    1080   *		exit (-1);
    1081   *	      }
    1082   *	  _seqbufptr = 0;
    1083   *	}
    1084   */
    1085  
    1086  #define SEQ_DEFINEBUF(len)		unsigned char _seqbuf[len]; int _seqbuflen = len;int _seqbufptr = 0
    1087  #define _SEQ_NEEDBUF(len)		if ((_seqbufptr+(len)) > _seqbuflen) seqbuf_dump()
    1088  #define _SEQ_ADVBUF(len)		_seqbufptr += len
    1089  #define SEQ_DUMPBUF			seqbuf_dump
    1090  #else
    1091  /*
    1092   * This variation of the sequencer macros is used just to format one event
    1093   * using fixed buffer.
    1094   * 
    1095   * The program using the macro library must define the following macros before
    1096   * using this library.
    1097   *
    1098   * #define _seqbuf 		 name of the buffer (unsigned char[]) 
    1099   * #define _SEQ_ADVBUF(len)	 If the applic needs to know the exact
    1100   *				 size of the event, this macro can be used.
    1101   *				 Otherwise this must be defined as empty.
    1102   * #define _seqbufptr		 Define the name of index variable or 0 if
    1103   *				 not required. 
    1104   */
    1105  #define _SEQ_NEEDBUF(len)	/* empty */
    1106  #endif
    1107  
    1108  #define SEQ_VOLUME_MODE(dev, mode)	{_SEQ_NEEDBUF(8);\
    1109  					_seqbuf[_seqbufptr] = SEQ_EXTENDED;\
    1110  					_seqbuf[_seqbufptr+1] = SEQ_VOLMODE;\
    1111  					_seqbuf[_seqbufptr+2] = (dev);\
    1112  					_seqbuf[_seqbufptr+3] = (mode);\
    1113  					_seqbuf[_seqbufptr+4] = 0;\
    1114  					_seqbuf[_seqbufptr+5] = 0;\
    1115  					_seqbuf[_seqbufptr+6] = 0;\
    1116  					_seqbuf[_seqbufptr+7] = 0;\
    1117  					_SEQ_ADVBUF(8);}
    1118  
    1119  /*
    1120   * Midi voice messages
    1121   */
    1122  
    1123  #define _CHN_VOICE(dev, event, chn, note, parm) \
    1124  					{_SEQ_NEEDBUF(8);\
    1125  					_seqbuf[_seqbufptr] = EV_CHN_VOICE;\
    1126  					_seqbuf[_seqbufptr+1] = (dev);\
    1127  					_seqbuf[_seqbufptr+2] = (event);\
    1128  					_seqbuf[_seqbufptr+3] = (chn);\
    1129  					_seqbuf[_seqbufptr+4] = (note);\
    1130  					_seqbuf[_seqbufptr+5] = (parm);\
    1131  					_seqbuf[_seqbufptr+6] = (0);\
    1132  					_seqbuf[_seqbufptr+7] = 0;\
    1133  					_SEQ_ADVBUF(8);}
    1134  
    1135  #define SEQ_START_NOTE(dev, chn, note, vol) \
    1136  		_CHN_VOICE(dev, MIDI_NOTEON, chn, note, vol)
    1137  
    1138  #define SEQ_STOP_NOTE(dev, chn, note, vol) \
    1139  		_CHN_VOICE(dev, MIDI_NOTEOFF, chn, note, vol)
    1140  
    1141  #define SEQ_KEY_PRESSURE(dev, chn, note, pressure) \
    1142  		_CHN_VOICE(dev, MIDI_KEY_PRESSURE, chn, note, pressure)
    1143  
    1144  /*
    1145   * Midi channel messages
    1146   */
    1147  
    1148  #define _CHN_COMMON(dev, event, chn, p1, p2, w14) \
    1149  					{_SEQ_NEEDBUF(8);\
    1150  					_seqbuf[_seqbufptr] = EV_CHN_COMMON;\
    1151  					_seqbuf[_seqbufptr+1] = (dev);\
    1152  					_seqbuf[_seqbufptr+2] = (event);\
    1153  					_seqbuf[_seqbufptr+3] = (chn);\
    1154  					_seqbuf[_seqbufptr+4] = (p1);\
    1155  					_seqbuf[_seqbufptr+5] = (p2);\
    1156  					*(short *)&_seqbuf[_seqbufptr+6] = (w14);\
    1157  					_SEQ_ADVBUF(8);}
    1158  /*
    1159   * SEQ_SYSEX permits sending of sysex messages. (It may look that it permits
    1160   * sending any MIDI bytes but it's absolutely not possible. Trying to do
    1161   * so _will_ cause problems with MPU401 intelligent mode).
    1162   *
    1163   * Sysex messages are sent in blocks of 1 to 6 bytes. Longer messages must be 
    1164   * sent by calling SEQ_SYSEX() several times (there must be no other events
    1165   * between them). First sysex fragment must have 0xf0 in the first byte
    1166   * and the last byte (buf[len-1] of the last fragment must be 0xf7. No byte
    1167   * between these sysex start and end markers cannot be larger than 0x7f. Also
    1168   * lengths of each fragments (except the last one) must be 6.
    1169   *
    1170   * Breaking the above rules may work with some MIDI ports but is likely to
    1171   * cause fatal problems with some other devices (such as MPU401).
    1172   */
    1173  #define SEQ_SYSEX(dev, buf, len) \
    1174  					{int ii, ll=(len); \
    1175  					 unsigned char *bufp=buf;\
    1176  					 if (ll>6)ll=6;\
    1177  					_SEQ_NEEDBUF(8);\
    1178  					_seqbuf[_seqbufptr] = EV_SYSEX;\
    1179  					_seqbuf[_seqbufptr+1] = (dev);\
    1180  					for(ii=0;ii<ll;ii++)\
    1181  					   _seqbuf[_seqbufptr+ii+2] = bufp[ii];\
    1182  					for(ii=ll;ii<6;ii++)\
    1183  					   _seqbuf[_seqbufptr+ii+2] = 0xff;\
    1184  					_SEQ_ADVBUF(8);}
    1185  
    1186  #define SEQ_CHN_PRESSURE(dev, chn, pressure) \
    1187  		_CHN_COMMON(dev, MIDI_CHN_PRESSURE, chn, pressure, 0, 0)
    1188  
    1189  #define SEQ_SET_PATCH SEQ_PGM_CHANGE
    1190  #define SEQ_PGM_CHANGE(dev, chn, patch) \
    1191  		_CHN_COMMON(dev, MIDI_PGM_CHANGE, chn, patch, 0, 0)
    1192  
    1193  #define SEQ_CONTROL(dev, chn, controller, value) \
    1194  		_CHN_COMMON(dev, MIDI_CTL_CHANGE, chn, controller, 0, value)
    1195  
    1196  #define SEQ_BENDER(dev, chn, value) \
    1197  		_CHN_COMMON(dev, MIDI_PITCH_BEND, chn, 0, 0, value)
    1198  
    1199  
    1200  #define SEQ_V2_X_CONTROL(dev, voice, controller, value)	{_SEQ_NEEDBUF(8);\
    1201  					_seqbuf[_seqbufptr] = SEQ_EXTENDED;\
    1202  					_seqbuf[_seqbufptr+1] = SEQ_CONTROLLER;\
    1203  					_seqbuf[_seqbufptr+2] = (dev);\
    1204  					_seqbuf[_seqbufptr+3] = (voice);\
    1205  					_seqbuf[_seqbufptr+4] = (controller);\
    1206  					_seqbuf[_seqbufptr+5] = ((value)&0xff);\
    1207  					_seqbuf[_seqbufptr+6] = ((value>>8)&0xff);\
    1208  					_seqbuf[_seqbufptr+7] = 0;\
    1209  					_SEQ_ADVBUF(8);}
    1210  /*
    1211   * The following 5 macros are incorrectly implemented and obsolete.
    1212   * Use SEQ_BENDER and SEQ_CONTROL (with proper controller) instead.
    1213   */
    1214  #define SEQ_PITCHBEND(dev, voice, value) SEQ_V2_X_CONTROL(dev, voice, CTRL_PITCH_BENDER, value)
    1215  #define SEQ_BENDER_RANGE(dev, voice, value) SEQ_V2_X_CONTROL(dev, voice, CTRL_PITCH_BENDER_RANGE, value)
    1216  #define SEQ_EXPRESSION(dev, voice, value) SEQ_CONTROL(dev, voice, CTL_EXPRESSION, value*128)
    1217  #define SEQ_MAIN_VOLUME(dev, voice, value) SEQ_CONTROL(dev, voice, CTL_MAIN_VOLUME, (value*16383)/100)
    1218  #define SEQ_PANNING(dev, voice, pos) SEQ_CONTROL(dev, voice, CTL_PAN, (pos+128) / 2)
    1219  
    1220  /*
    1221   * Timing and synchronization macros
    1222   */
    1223  
    1224  #define _TIMER_EVENT(ev, parm)		{_SEQ_NEEDBUF(8);\
    1225  				 	_seqbuf[_seqbufptr+0] = EV_TIMING; \
    1226  				 	_seqbuf[_seqbufptr+1] = (ev); \
    1227  					_seqbuf[_seqbufptr+2] = 0;\
    1228  					_seqbuf[_seqbufptr+3] = 0;\
    1229  				 	*(unsigned int *)&_seqbuf[_seqbufptr+4] = (parm); \
    1230  					_SEQ_ADVBUF(8);}
    1231  
    1232  #define SEQ_START_TIMER()		_TIMER_EVENT(TMR_START, 0)
    1233  #define SEQ_STOP_TIMER()		_TIMER_EVENT(TMR_STOP, 0)
    1234  #define SEQ_CONTINUE_TIMER()		_TIMER_EVENT(TMR_CONTINUE, 0)
    1235  #define SEQ_WAIT_TIME(ticks)		_TIMER_EVENT(TMR_WAIT_ABS, ticks)
    1236  #define SEQ_DELTA_TIME(ticks)		_TIMER_EVENT(TMR_WAIT_REL, ticks)
    1237  #define SEQ_ECHO_BACK(key)		_TIMER_EVENT(TMR_ECHO, key)
    1238  #define SEQ_SET_TEMPO(value)		_TIMER_EVENT(TMR_TEMPO, value)
    1239  #define SEQ_SONGPOS(pos)		_TIMER_EVENT(TMR_SPP, pos)
    1240  #define SEQ_TIME_SIGNATURE(sig)		_TIMER_EVENT(TMR_TIMESIG, sig)
    1241  
    1242  /*
    1243   * Local control events
    1244   */
    1245  
    1246  #define _LOCAL_EVENT(ev, parm)		{_SEQ_NEEDBUF(8);\
    1247  				 	_seqbuf[_seqbufptr+0] = EV_SEQ_LOCAL; \
    1248  				 	_seqbuf[_seqbufptr+1] = (ev); \
    1249  					_seqbuf[_seqbufptr+2] = 0;\
    1250  					_seqbuf[_seqbufptr+3] = 0;\
    1251  				 	*(unsigned int *)&_seqbuf[_seqbufptr+4] = (parm); \
    1252  					_SEQ_ADVBUF(8);}
    1253  
    1254  #define SEQ_PLAYAUDIO(devmask)		_LOCAL_EVENT(LOCL_STARTAUDIO, devmask)
    1255  /*
    1256   * Events for the level 1 interface only 
    1257   */
    1258  
    1259  #define SEQ_MIDIOUT(device, byte)	{_SEQ_NEEDBUF(4);\
    1260  					_seqbuf[_seqbufptr] = SEQ_MIDIPUTC;\
    1261  					_seqbuf[_seqbufptr+1] = (byte);\
    1262  					_seqbuf[_seqbufptr+2] = (device);\
    1263  					_seqbuf[_seqbufptr+3] = 0;\
    1264  					_SEQ_ADVBUF(4);}
    1265  
    1266  /*
    1267   * Patch loading.
    1268   */
    1269  #define SEQ_WRPATCH(patchx, len) \
    1270  		{if (_seqbufptr) SEQ_DUMPBUF();\
    1271  		 if (write(seqfd, (char*)(patchx), len)==-1) \
    1272  		    perror("Write patch: /dev/sequencer");}
    1273  #define SEQ_WRPATCH2(patchx, len) \
    1274  		(SEQ_DUMPBUF(), write(seqfd, (char*)(patchx), len))
    1275  
    1276  #endif /* SOUNDCARD_H */