130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Copyright by Hannu Savolainen 1993-1997
330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Redistribution and use in source and binary forms, with or without
530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * modification, are permitted provided that the following conditions are
630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * met: 1. Redistributions of source code must retain the above copyright
730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * notice, this list of conditions and the following disclaimer. 2.
830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Redistributions in binary form must reproduce the above copyright notice,
930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * this list of conditions and the following disclaimer in the documentation
1030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * and/or other materials provided with the distribution.
1130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
1230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY
1330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
1430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
1530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
1630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
1830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
1930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * SUCH DAMAGE.
2330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
2430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#ifndef _UAPISOUNDCARD_H
2530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _UAPISOUNDCARD_H
2630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
2730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
2830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
2930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * OSS interface version. With versions earlier than 3.6 this value is
3030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * an integer with value less than 361. In versions 3.6 and later
3130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * it's a six digit hexadecimal value. For example value
3230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * of 0x030600 represents OSS version 3.6.0.
3330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Use ioctl(fd, OSS_GETVERSION, &int) to get the version number of
3430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * the currently active driver.
3530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
3630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_VERSION	0x030802
3730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define OPEN_SOUND_SYSTEM
3830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
3930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* In Linux we need to be prepared for cross compiling */
4030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#include <linux/ioctl.h>
4130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
4230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Endian macros. */
4330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#ifndef __KERNEL__
4430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#  include <endian.h>
4530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#endif
4630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
4730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
4830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	Supported card ID numbers (Should be somewhere else?)
4930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
5030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
5130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_ADLIB		1
5230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_SB		2
5330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_PAS		3
5430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_GUS		4
5530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_MPU401		5
5630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_SB16		6
5730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_SB16MIDI	7
5830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_UART6850	8
5930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_GUS16		9
6030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_MSS		10
6130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_PSS     	11
6230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_SSCAPE		12
6330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_PSS_MPU     	13
6430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_PSS_MSS     	14
6530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_SSCAPE_MSS	15
6630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_TRXPRO		16
6730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_TRXPRO_SB	17
6830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_TRXPRO_MPU	18
6930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_MAD16		19
7030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_MAD16_MPU	20
7130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_CS4232		21
7230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_CS4232_MPU	22
7330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_MAUI		23
7430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_PSEUDO_MSS	24
7530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_GUSPNP		25
7630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_UART401		26
7730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Sound card numbers 27 to N are reserved. Don't add more numbers here. */
7830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
7930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/***********************************
8030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * IOCTL Commands for /dev/sequencer
8130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
8230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
8330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#ifndef _SIOWR
8430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#if defined(_IOWR) && (defined(_AIX) || (!defined(sun) && !defined(sparc) && !defined(__sparc__) && !defined(__INCioctlh) && !defined(__Lynx__)))
8530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Use already defined ioctl defines if they exist (except with Sun or Sparc) */
8630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define	SIOCPARM_MASK	IOCPARM_MASK
8730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define	SIOC_VOID	IOC_VOID
8830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define	SIOC_OUT	IOC_OUT
8930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define	SIOC_IN		IOC_IN
9030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define	SIOC_INOUT	IOC_INOUT
9130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _SIOC_SIZE	_IOC_SIZE
9230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _SIOC_DIR	_IOC_DIR
9330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _SIOC_NONE	_IOC_NONE
9430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _SIOC_READ	_IOC_READ
9530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _SIOC_WRITE	_IOC_WRITE
9630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define	_SIO		_IO
9730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define	_SIOR		_IOR
9830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define	_SIOW		_IOW
9930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define	_SIOWR		_IOWR
10030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#else
10130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
10230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Ioctl's have the command encoded in the lower word,
10330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * and the size of any in or out parameters in the upper
10430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * word.  The high 2 bits of the upper word are used
10530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * to encode the in/out status of the parameter; for now
10630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * we restrict parameters to at most 8191 bytes.
10730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
10830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* #define	SIOCTYPE		(0xff<<8) */
10930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define	SIOCPARM_MASK	0x1fff		/* parameters must be < 8192 bytes */
11030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define	SIOC_VOID	0x00000000	/* no parameters */
11130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define	SIOC_OUT	0x20000000	/* copy out parameters */
11230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define	SIOC_IN		0x40000000	/* copy in parameters */
11330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define	SIOC_INOUT	(SIOC_IN|SIOC_OUT)
11430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* the 0x20000000 is so we can distinguish new ioctl's from old */
11530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define	_SIO(x,y)	((int)(SIOC_VOID|(x<<8)|y))
11630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define	_SIOR(x,y,t)	((int)(SIOC_OUT|((sizeof(t)&SIOCPARM_MASK)<<16)|(x<<8)|y))
11730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define	_SIOW(x,y,t)	((int)(SIOC_IN|((sizeof(t)&SIOCPARM_MASK)<<16)|(x<<8)|y))
11830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* this should be _SIORW, but stdio got there first */
11930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define	_SIOWR(x,y,t)	((int)(SIOC_INOUT|((sizeof(t)&SIOCPARM_MASK)<<16)|(x<<8)|y))
12030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _SIOC_SIZE(x)	((x>>16)&SIOCPARM_MASK)
12130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _SIOC_DIR(x)	(x & 0xf0000000)
12230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _SIOC_NONE	SIOC_VOID
12330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _SIOC_READ	SIOC_OUT
12430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _SIOC_WRITE	SIOC_IN
12530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#  endif /* _IOWR */
12630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#endif  /* !_SIOWR */
12730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
12830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SEQ_RESET		_SIO  ('Q', 0)
12930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SEQ_SYNC			_SIO  ('Q', 1)
13030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SYNTH_INFO		_SIOWR('Q', 2, struct synth_info)
13130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SEQ_CTRLRATE		_SIOWR('Q', 3, int)	/* Set/get timer resolution (HZ) */
13230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SEQ_GETOUTCOUNT		_SIOR ('Q', 4, int)
13330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SEQ_GETINCOUNT		_SIOR ('Q', 5, int)
13430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SEQ_PERCMODE		_SIOW ('Q', 6, int)
13530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_FM_LOAD_INSTR		_SIOW ('Q', 7, struct sbi_instrument)	/* Obsolete. Don't use!!!!!! */
13630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SEQ_TESTMIDI		_SIOW ('Q', 8, int)
13730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SEQ_RESETSAMPLES		_SIOW ('Q', 9, int)
13830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SEQ_NRSYNTHS		_SIOR ('Q',10, int)
13930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SEQ_NRMIDIS		_SIOR ('Q',11, int)
14030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_MIDI_INFO		_SIOWR('Q',12, struct midi_info)
14130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SEQ_THRESHOLD		_SIOW ('Q',13, int)
14230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SYNTH_MEMAVL		_SIOWR('Q',14, int)	/* in=dev#, out=memsize */
14330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_FM_4OP_ENABLE		_SIOW ('Q',15, int)	/* in=dev# */
14430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SEQ_PANIC		_SIO  ('Q',17)
14530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SEQ_OUTOFBAND		_SIOW ('Q',18, struct seq_event_rec)
14630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SEQ_GETTIME		_SIOR ('Q',19, int)
14730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SYNTH_ID			_SIOWR('Q',20, struct synth_info)
14830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SYNTH_CONTROL		_SIOWR('Q',21, struct synth_control)
14930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SYNTH_REMOVESAMPLE	_SIOWR('Q',22, struct remove_sample)
15030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
15130692c65c4174412c90e79489e98ab85c1a7412fBen Chengtypedef struct synth_control
15230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng{
15330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	int devno;	/* Synthesizer # */
15430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	char data[4000]; /* Device spesific command/data record */
15530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng}synth_control;
15630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
15730692c65c4174412c90e79489e98ab85c1a7412fBen Chengtypedef struct remove_sample
15830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng{
15930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	int devno;	/* Synthesizer # */
16030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	int bankno;	/* MIDI bank # (0=General MIDI) */
16130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	int instrno;	/* MIDI instrument number */
16230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng} remove_sample;
16330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
16430692c65c4174412c90e79489e98ab85c1a7412fBen Chengtypedef struct seq_event_rec {
16530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		unsigned char arr[8];
16630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng} seq_event_rec;
16730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
16830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_TMR_TIMEBASE		_SIOWR('T', 1, int)
16930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_TMR_START		_SIO  ('T', 2)
17030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_TMR_STOP			_SIO  ('T', 3)
17130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_TMR_CONTINUE		_SIO  ('T', 4)
17230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_TMR_TEMPO		_SIOWR('T', 5, int)
17330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_TMR_SOURCE		_SIOWR('T', 6, int)
17430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define TMR_INTERNAL		0x00000001
17530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define TMR_EXTERNAL		0x00000002
17630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#		define TMR_MODE_MIDI	0x00000010
17730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#		define TMR_MODE_FSK	0x00000020
17830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#		define TMR_MODE_CLS	0x00000040
17930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#		define TMR_MODE_SMPTE	0x00000080
18030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_TMR_METRONOME		_SIOW ('T', 7, int)
18130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_TMR_SELECT		_SIOW ('T', 8, int)
18230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
18330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
18430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Some big endian/little endian handling macros
18530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
18630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
18730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _LINUX_PATCHKEY_H_INDIRECT
18830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#include <linux/patchkey.h>
18930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#undef _LINUX_PATCHKEY_H_INDIRECT
19030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
19130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#if !defined(__KERNEL__)
19230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# if defined(__BYTE_ORDER)
19330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#  if __BYTE_ORDER == __BIG_ENDIAN
19430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#    define AFMT_S16_NE AFMT_S16_BE
19530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#  elif __BYTE_ORDER == __LITTLE_ENDIAN
19630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#    define AFMT_S16_NE AFMT_S16_LE
19730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#  else
19830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#    error "could not determine byte order"
19930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#  endif
20030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# endif
20130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#endif
20230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
20330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
20430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	Sample loading mechanism for internal synthesizers (/dev/sequencer)
20530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	The following patch_info structure has been designed to support
20630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	Gravis UltraSound. It tries to be universal format for uploading
20730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	sample based patches but is probably too limited.
20830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
20930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *      (PBD) As Hannu guessed, the GUS structure is too limited for
21030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *      the WaveFront, but this is the right place for a constant definition.
21130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
21230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
21330692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct patch_info {
21430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		unsigned short key;		/* Use WAVE_PATCH here */
21530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define WAVE_PATCH	   _PATCHKEY(0x04)
21630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define GUS_PATCH	   WAVE_PATCH
21730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define WAVEFRONT_PATCH    _PATCHKEY(0x06)
21830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
21930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		short device_no;	/* Synthesizer number */
22030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		short instr_no;		/* Midi pgm# */
22130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
22230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		unsigned int mode;
22330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
22430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * The least significant byte has the same format than the GUS .PAT
22530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * files
22630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
22730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define WAVE_16_BITS	0x01	/* bit 0 = 8 or 16 bit wave data. */
22830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define WAVE_UNSIGNED	0x02	/* bit 1 = Signed - Unsigned data. */
22930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define WAVE_LOOPING	0x04	/* bit 2 = looping enabled-1. */
23030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define WAVE_BIDIR_LOOP	0x08	/* bit 3 = Set is bidirectional looping. */
23130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define WAVE_LOOP_BACK	0x10	/* bit 4 = Set is looping backward. */
23230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define WAVE_SUSTAIN_ON	0x20	/* bit 5 = Turn sustaining on. (Env. pts. 3)*/
23330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define WAVE_ENVELOPES	0x40	/* bit 6 = Enable envelopes - 1 */
23430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define WAVE_FAST_RELEASE 0x80	/* bit 7 = Shut off immediately after note off */
23530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng				/* 	(use the env_rate/env_offs fields). */
23630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Linux specific bits */
23730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define WAVE_VIBRATO	0x00010000	/* The vibrato info is valid */
23830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define WAVE_TREMOLO	0x00020000	/* The tremolo info is valid */
23930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define WAVE_SCALE	0x00040000	/* The scaling info is valid */
24030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define WAVE_FRACTIONS	0x00080000	/* Fraction information is valid */
24130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Reserved bits */
24230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define WAVE_ROM	0x40000000	/* For future use */
24330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define WAVE_MULAW	0x20000000	/* For future use */
24430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Other bits must be zeroed */
24530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
24630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		int len;	/* Size of the wave data in bytes */
24730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		int loop_start, loop_end; /* Byte offsets from the beginning */
24830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
24930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
25030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * The base_freq and base_note fields are used when computing the
25130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * playback speed for a note. The base_note defines the tone frequency
25230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * which is heard if the sample is played using the base_freq as the
25330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * playback speed.
25430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
25530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * The low_note and high_note fields define the minimum and maximum note
25630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * frequencies for which this sample is valid. It is possible to define
25730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * more than one samples for an instrument number at the same time. The
25830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * low_note and high_note fields are used to select the most suitable one.
25930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
26030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * The fields base_note, high_note and low_note should contain
26130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * the note frequency multiplied by 1000. For example value for the
26230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * middle A is 440*1000.
26330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
26430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
26530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		unsigned int base_freq;
26630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		unsigned int base_note;
26730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		unsigned int high_note;
26830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		unsigned int low_note;
26930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		int panning;	/* -128=left, 127=right */
27030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		int detuning;
27130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
27230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*	New fields introduced in version 1.99.5	*/
27330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
27430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng       /* Envelope. Enabled by mode bit WAVE_ENVELOPES	*/
27530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		unsigned char	env_rate[ 6 ];	 /* GUS HW ramping rate */
27630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		unsigned char	env_offset[ 6 ]; /* 255 == 100% */
27730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
27830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	/*
27930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	 * The tremolo, vibrato and scale info are not supported yet.
28030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	 * Enable by setting the mode bits WAVE_TREMOLO, WAVE_VIBRATO or
28130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	 * WAVE_SCALE
28230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	 */
28330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
28430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		unsigned char	tremolo_sweep;
28530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		unsigned char	tremolo_rate;
28630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		unsigned char	tremolo_depth;
28730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
28830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		unsigned char	vibrato_sweep;
28930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		unsigned char	vibrato_rate;
29030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		unsigned char	vibrato_depth;
29130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
29230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		int		scale_frequency;
29330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		unsigned int	scale_factor;		/* from 0 to 2048 or 0 to 2 */
29430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
29530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	        int		volume;
29630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		int		fractions;
29730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		int		reserved1;
29830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	        int		spare[2];
29930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		char data[1];	/* The waveform data starts here */
30030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	};
30130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
30230692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct sysex_info {
30330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		short key;		/* Use SYSEX_PATCH or MAUI_PATCH here */
30430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SYSEX_PATCH	_PATCHKEY(0x05)
30530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define MAUI_PATCH	_PATCHKEY(0x06)
30630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		short device_no;	/* Synthesizer number */
30730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		int len;	/* Size of the sysex data in bytes */
30830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		unsigned char data[1];	/* Sysex data starts here */
30930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	};
31030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
31130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
31230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * /dev/sequencer input events.
31330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
31430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * The data written to the /dev/sequencer is a stream of events. Events
31530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * are records of 4 or 8 bytes. The first byte defines the size.
31630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Any number of events can be written with a write call. There
31730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * is a set of macros for sending these events. Use these macros if you
31830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * want to maximize portability of your program.
31930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
32030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Events SEQ_WAIT, SEQ_MIDIPUTC and SEQ_ECHO. Are also input events.
32130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * (All input events are currently 4 bytes long. Be prepared to support
32230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 8 byte events also. If you receive any event having first byte >= 128,
32330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * it's a 8 byte event.
32430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
32530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * The events are documented at the end of this file.
32630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
32730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Normal events (4 bytes)
32830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * There is also a 8 byte version of most of the 4 byte events. The
32930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 8 byte one is recommended.
33030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
33130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_NOTEOFF		0
33230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_FMNOTEOFF		SEQ_NOTEOFF	/* Just old name */
33330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_NOTEON		1
33430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define	SEQ_FMNOTEON		SEQ_NOTEON
33530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_WAIT		TMR_WAIT_ABS
33630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_PGMCHANGE		3
33730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_FMPGMCHANGE		SEQ_PGMCHANGE
33830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_SYNCTIMER		TMR_START
33930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_MIDIPUTC		5
34030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_DRUMON		6	/*** OBSOLETE ***/
34130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_DRUMOFF		7	/*** OBSOLETE ***/
34230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_ECHO		TMR_ECHO	/* For synching programs with output */
34330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_AFTERTOUCH		9
34430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_CONTROLLER		10
34530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
34630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*******************************************
34730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	Midi controller numbers
34830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *******************************************
34930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Controllers 0 to 31 (0x00 to 0x1f) and
35030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 32 to 63 (0x20 to 0x3f) are continuous
35130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * controllers.
35230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * In the MIDI 1.0 these controllers are sent using
35330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * two messages. Controller numbers 0 to 31 are used
35430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * to send the MSB and the controller numbers 32 to 63
35530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * are for the LSB. Note that just 7 bits are used in MIDI bytes.
35630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
35730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
35830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define	   CTL_BANK_SELECT		0x00
35930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define	   CTL_MODWHEEL			0x01
36030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTL_BREATH			0x02
36130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*		undefined		0x03 */
36230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTL_FOOT			0x04
36330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTL_PORTAMENTO_TIME		0x05
36430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTL_DATA_ENTRY		0x06
36530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTL_MAIN_VOLUME		0x07
36630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTL_BALANCE			0x08
36730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*		undefined		0x09 */
36830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTL_PAN			0x0a
36930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTL_EXPRESSION		0x0b
37030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*		undefined		0x0c */
37130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*		undefined		0x0d */
37230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*		undefined		0x0e */
37330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*		undefined		0x0f */
37430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTL_GENERAL_PURPOSE1	0x10
37530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTL_GENERAL_PURPOSE2	0x11
37630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTL_GENERAL_PURPOSE3	0x12
37730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTL_GENERAL_PURPOSE4	0x13
37830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*		undefined		0x14 - 0x1f */
37930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
38030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*		undefined		0x20 */
38130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* The controller numbers 0x21 to 0x3f are reserved for the */
38230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* least significant bytes of the controllers 0x00 to 0x1f. */
38330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* These controllers are not recognised by the driver. */
38430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
38530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Controllers 64 to 69 (0x40 to 0x45) are on/off switches. */
38630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 0=OFF and 127=ON (intermediate values are possible) */
38730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTL_DAMPER_PEDAL		0x40
38830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTL_SUSTAIN			0x40	/* Alias */
38930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTL_HOLD			0x40	/* Alias */
39030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTL_PORTAMENTO		0x41
39130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTL_SOSTENUTO		0x42
39230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTL_SOFT_PEDAL		0x43
39330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*		undefined		0x44 */
39430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTL_HOLD2			0x45
39530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*		undefined		0x46 - 0x4f */
39630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
39730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTL_GENERAL_PURPOSE5	0x50
39830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTL_GENERAL_PURPOSE6	0x51
39930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTL_GENERAL_PURPOSE7	0x52
40030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTL_GENERAL_PURPOSE8	0x53
40130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*		undefined		0x54 - 0x5a */
40230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTL_EXT_EFF_DEPTH		0x5b
40330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTL_TREMOLO_DEPTH		0x5c
40430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTL_CHORUS_DEPTH		0x5d
40530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTL_DETUNE_DEPTH		0x5e
40630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTL_CELESTE_DEPTH		0x5e	/* Alias for the above one */
40730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTL_PHASER_DEPTH		0x5f
40830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTL_DATA_INCREMENT		0x60
40930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTL_DATA_DECREMENT		0x61
41030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTL_NONREG_PARM_NUM_LSB	0x62
41130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTL_NONREG_PARM_NUM_MSB	0x63
41230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTL_REGIST_PARM_NUM_LSB	0x64
41330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTL_REGIST_PARM_NUM_MSB	0x65
41430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*		undefined		0x66 - 0x78 */
41530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*		reserved		0x79 - 0x7f */
41630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
41730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Pseudo controllers (not midi compatible) */
41830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTRL_PITCH_BENDER		255
41930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTRL_PITCH_BENDER_RANGE	254
42030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTRL_EXPRESSION		253	/* Obsolete */
42130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define    CTRL_MAIN_VOLUME		252	/* Obsolete */
42230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_BALANCE		11
42330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_VOLMODE             12
42430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
42530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
42630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Volume mode decides how volumes are used
42730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
42830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
42930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define VOL_METHOD_ADAGIO	1
43030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define VOL_METHOD_LINEAR	2
43130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
43230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
43330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Note! SEQ_WAIT, SEQ_MIDIPUTC and SEQ_ECHO are used also as
43430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	 input events.
43530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
43630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
43730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
43830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Event codes 0xf0 to 0xfc are reserved for future extensions.
43930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
44030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
44130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_FULLSIZE		0xfd	/* Long events */
44230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
44330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	SEQ_FULLSIZE events are used for loading patches/samples to the
44430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	synthesizer devices. These events are passed directly to the driver
44530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	of the associated synthesizer device. There is no limit to the size
44630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	of the extended events. These events are not queued but executed
44730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	immediately when the write() is called (execution can take several
44830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	seconds of time).
44930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
45030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	When a SEQ_FULLSIZE message is written to the device, it must
45130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	be written using exactly one write() call. Other events cannot
45230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	be mixed to the same write.
45330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
45430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	For FM synths (YM3812/OPL3) use struct sbi_instrument and write it to the
45530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	/dev/sequencer. Don't write other data together with the instrument structure
45630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	Set the key field of the structure to FM_PATCH. The device field is used to
45730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	route the patch to the corresponding device.
45830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
45930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	For wave table use struct patch_info. Initialize the key field
46030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *      to WAVE_PATCH.
46130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
46230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_PRIVATE		0xfe	/* Low level HW dependent events (8 bytes) */
46330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_EXTENDED		0xff	/* Extended events (8 bytes) OBSOLETE */
46430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
46530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
46630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Record for FM patches
46730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
46830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
46930692c65c4174412c90e79489e98ab85c1a7412fBen Chengtypedef unsigned char sbi_instr_data[32];
47030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
47130692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct sbi_instrument {
47230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		unsigned short	key;	/* FM_PATCH or OPL3_PATCH */
47330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define FM_PATCH	_PATCHKEY(0x01)
47430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define OPL3_PATCH	_PATCHKEY(0x03)
47530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		short		device;		/*	Synth# (0-4)	*/
47630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		int 		channel;	/*	Program# to be initialized 	*/
47730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		sbi_instr_data	operators;	/*	Register settings for operator cells (.SBI format)	*/
47830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	};
47930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
48030692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct synth_info {	/* Read only */
48130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		char	name[30];
48230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		int	device;		/* 0-N. INITIALIZE BEFORE CALLING */
48330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		int	synth_type;
48430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SYNTH_TYPE_FM			0
48530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SYNTH_TYPE_SAMPLE		1
48630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SYNTH_TYPE_MIDI			2	/* Midi interface */
48730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
48830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		int	synth_subtype;
48930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define FM_TYPE_ADLIB			0x00
49030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define FM_TYPE_OPL3			0x01
49130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define MIDI_TYPE_MPU401		0x401
49230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
49330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SAMPLE_TYPE_BASIC		0x10
49430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SAMPLE_TYPE_GUS			SAMPLE_TYPE_BASIC
49530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SAMPLE_TYPE_WAVEFRONT           0x11
49630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
49730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		int	perc_mode;	/* No longer supported */
49830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		int	nr_voices;
49930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		int	nr_drums;	/* Obsolete field */
50030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		int	instr_bank_size;
50130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		unsigned int	capabilities;
50230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SYNTH_CAP_PERCMODE		0x00000001 /* No longer used */
50330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SYNTH_CAP_OPL3			0x00000002 /* Set if OPL3 supported */
50430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SYNTH_CAP_INPUT			0x00000004 /* Input (MIDI) device */
50530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		int	dummies[19];	/* Reserve space */
50630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	};
50730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
50830692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct sound_timer_info {
50930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		char name[32];
51030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		int caps;
51130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	};
51230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
51330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define MIDI_CAP_MPU401		1		/* MPU-401 intelligent mode */
51430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
51530692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct midi_info {
51630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		char		name[30];
51730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		int		device;		/* 0-N. INITIALIZE BEFORE CALLING */
51830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		unsigned int	capabilities;	/* To be defined later */
51930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		int		dev_type;
52030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		int		dummies[18];	/* Reserve space */
52130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	};
52230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
52330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/********************************************
52430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * ioctl commands for the /dev/midi##
52530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
52630692c65c4174412c90e79489e98ab85c1a7412fBen Chengtypedef struct {
52730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		unsigned char cmd;
52830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		char nr_args, nr_returns;
52930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		unsigned char data[30];
53030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	} mpu_command_rec;
53130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
53230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_MIDI_PRETIME		_SIOWR('m', 0, int)
53330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_MIDI_MPUMODE		_SIOWR('m', 1, int)
53430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_MIDI_MPUCMD		_SIOWR('m', 2, mpu_command_rec)
53530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
53630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/********************************************
53730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * IOCTL commands for /dev/dsp and /dev/audio
53830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
53930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
54030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_RESET		_SIO  ('P', 0)
54130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_SYNC			_SIO  ('P', 1)
54230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_SPEED		_SIOWR('P', 2, int)
54330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_STEREO		_SIOWR('P', 3, int)
54430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_GETBLKSIZE		_SIOWR('P', 4, int)
54530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_SAMPLESIZE		SNDCTL_DSP_SETFMT
54630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_CHANNELS		_SIOWR('P', 6, int)
54730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_WRITE_CHANNELS	SNDCTL_DSP_CHANNELS
54830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_WRITE_FILTER		_SIOWR('P', 7, int)
54930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_POST			_SIO  ('P', 8)
55030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_SUBDIVIDE		_SIOWR('P', 9, int)
55130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_SETFRAGMENT		_SIOWR('P',10, int)
55230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
55330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*	Audio data formats (Note! U8=8 and S16_LE=16 for compatibility) */
55430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_GETFMTS		_SIOR ('P',11, int) /* Returns a mask */
55530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_SETFMT		_SIOWR('P',5, int) /* Selects ONE fmt*/
55630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define AFMT_QUERY		0x00000000	/* Return current fmt */
55730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define AFMT_MU_LAW		0x00000001
55830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define AFMT_A_LAW		0x00000002
55930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define AFMT_IMA_ADPCM		0x00000004
56030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define AFMT_U8			0x00000008
56130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define AFMT_S16_LE		0x00000010	/* Little endian signed 16*/
56230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define AFMT_S16_BE		0x00000020	/* Big endian signed 16 */
56330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define AFMT_S8			0x00000040
56430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define AFMT_U16_LE		0x00000080	/* Little endian U16 */
56530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define AFMT_U16_BE		0x00000100	/* Big endian U16 */
56630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define AFMT_MPEG		0x00000200	/* MPEG (2) audio */
56730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define AFMT_AC3		0x00000400	/* Dolby Digital AC3 */
56830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
56930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
57030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Buffer status queries.
57130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
57230692c65c4174412c90e79489e98ab85c1a7412fBen Chengtypedef struct audio_buf_info {
57330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng			int fragments;	/* # of available fragments (partially usend ones not counted) */
57430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng			int fragstotal;	/* Total # of fragments allocated */
57530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng			int fragsize;	/* Size of a fragment in bytes */
57630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
57730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng			int bytes;	/* Available space in bytes (includes partially used fragments) */
57830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng			/* Note! 'bytes' could be more than fragments*fragsize */
57930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		} audio_buf_info;
58030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
58130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_GETOSPACE		_SIOR ('P',12, audio_buf_info)
58230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_GETISPACE		_SIOR ('P',13, audio_buf_info)
58330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_NONBLOCK		_SIO  ('P',14)
58430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_GETCAPS		_SIOR ('P',15, int)
58530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define DSP_CAP_REVISION		0x000000ff	/* Bits for revision level (0 to 255) */
58630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define DSP_CAP_DUPLEX		0x00000100	/* Full duplex record/playback */
58730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define DSP_CAP_REALTIME		0x00000200	/* Real time capability */
58830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define DSP_CAP_BATCH		0x00000400	/* Device has some kind of */
58930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng							/* internal buffers which may */
59030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng							/* cause some delays and */
59130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng							/* decrease precision of timing */
59230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define DSP_CAP_COPROC		0x00000800	/* Has a coprocessor */
59330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng							/* Sometimes it's a DSP */
59430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng							/* but usually not */
59530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define DSP_CAP_TRIGGER		0x00001000	/* Supports SETTRIGGER */
59630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define DSP_CAP_MMAP		0x00002000	/* Supports mmap() */
59730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define DSP_CAP_MULTI		0x00004000	/* support multiple open */
59830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define DSP_CAP_BIND		0x00008000	/* channel binding to front/rear/cneter/lfe */
59930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
60030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
60130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_GETTRIGGER		_SIOR ('P',16, int)
60230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_SETTRIGGER		_SIOW ('P',16, int)
60330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define PCM_ENABLE_INPUT		0x00000001
60430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define PCM_ENABLE_OUTPUT		0x00000002
60530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
60630692c65c4174412c90e79489e98ab85c1a7412fBen Chengtypedef struct count_info {
60730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		int bytes;	/* Total # of bytes processed */
60830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		int blocks;	/* # of fragment transitions since last time */
60930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		int ptr;	/* Current DMA pointer value */
61030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	} count_info;
61130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
61230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_GETIPTR		_SIOR ('P',17, count_info)
61330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_GETOPTR		_SIOR ('P',18, count_info)
61430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
61530692c65c4174412c90e79489e98ab85c1a7412fBen Chengtypedef struct buffmem_desc {
61630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		unsigned *buffer;
61730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		int size;
61830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	} buffmem_desc;
61930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_MAPINBUF		_SIOR ('P', 19, buffmem_desc)
62030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_MAPOUTBUF		_SIOR ('P', 20, buffmem_desc)
62130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_SETSYNCRO		_SIO  ('P', 21)
62230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_SETDUPLEX		_SIO  ('P', 22)
62330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_GETODELAY		_SIOR ('P', 23, int)
62430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
62530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_GETCHANNELMASK		_SIOWR('P', 64, int)
62630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_BIND_CHANNEL		_SIOWR('P', 65, int)
62730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define DSP_BIND_QUERY		0x00000000
62830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define DSP_BIND_FRONT		0x00000001
62930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define DSP_BIND_SURR		0x00000002
63030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define DSP_BIND_CENTER_LFE	0x00000004
63130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define DSP_BIND_HANDSET		0x00000008
63230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define DSP_BIND_MIC		0x00000010
63330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define DSP_BIND_MODEM1		0x00000020
63430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define DSP_BIND_MODEM2		0x00000040
63530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define DSP_BIND_I2S		0x00000080
63630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define DSP_BIND_SPDIF		0x00000100
63730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
63830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_SETSPDIF		_SIOW ('P', 66, int)
63930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_GETSPDIF		_SIOR ('P', 67, int)
64030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define SPDIF_PRO	0x0001
64130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define SPDIF_N_AUD	0x0002
64230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define SPDIF_COPY	0x0004
64330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define SPDIF_PRE	0x0008
64430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define SPDIF_CC		0x07f0
64530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define SPDIF_L		0x0800
64630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define SPDIF_DRS	0x4000
64730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define SPDIF_V		0x8000
64830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
64930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
65030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Application's profile defines the way how playback underrun situations should be handled.
65130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
65230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	APF_NORMAL (the default) and APF_NETWORK make the driver to cleanup the
65330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	playback buffer whenever an underrun occurs. This consumes some time
65430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	prevents looping the existing buffer.
65530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	APF_CPUINTENS is intended to be set by CPU intensive applications which
65630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	are likely to run out of time occasionally. In this mode the buffer cleanup is
65730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	disabled which saves CPU time but also let's the previous buffer content to
65830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	be played during the "pause" after the underrun.
65930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
66030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_PROFILE		_SIOW ('P', 23, int)
66130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define	  APF_NORMAL	0	/* Normal applications */
66230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define	  APF_NETWORK	1	/* Underruns probably caused by an "external" delay */
66330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define   APF_CPUINTENS 2	/* Underruns probably caused by "overheating" the CPU */
66430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
66530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_READ_RATE		_SIOR ('P', 2, int)
66630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_READ_CHANNELS		_SIOR ('P', 6, int)
66730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_READ_BITS		_SIOR ('P', 5, int)
66830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_READ_FILTER		_SIOR ('P', 7, int)
66930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
67030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Some alias names */
67130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_WRITE_BITS		SNDCTL_DSP_SETFMT
67230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_WRITE_RATE		SNDCTL_DSP_SPEED
67330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_POST			SNDCTL_DSP_POST
67430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_RESET			SNDCTL_DSP_RESET
67530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_SYNC			SNDCTL_DSP_SYNC
67630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_SUBDIVIDE		SNDCTL_DSP_SUBDIVIDE
67730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_SETFRAGMENT		SNDCTL_DSP_SETFRAGMENT
67830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_GETFMTS		SNDCTL_DSP_GETFMTS
67930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_SETFMT		SNDCTL_DSP_SETFMT
68030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_GETOSPACE		SNDCTL_DSP_GETOSPACE
68130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_GETISPACE		SNDCTL_DSP_GETISPACE
68230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_NONBLOCK		SNDCTL_DSP_NONBLOCK
68330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_GETCAPS		SNDCTL_DSP_GETCAPS
68430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_GETTRIGGER		SNDCTL_DSP_GETTRIGGER
68530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_SETTRIGGER		SNDCTL_DSP_SETTRIGGER
68630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_SETSYNCRO		SNDCTL_DSP_SETSYNCRO
68730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_GETIPTR		SNDCTL_DSP_GETIPTR
68830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_GETOPTR		SNDCTL_DSP_GETOPTR
68930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_MAPINBUF		SNDCTL_DSP_MAPINBUF
69030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_MAPOUTBUF		SNDCTL_DSP_MAPOUTBUF
69130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
69230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
69330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * ioctl calls to be used in communication with coprocessors and
69430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * DSP chips.
69530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
69630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
69730692c65c4174412c90e79489e98ab85c1a7412fBen Chengtypedef struct copr_buffer {
69830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		int command;	/* Set to 0 if not used */
69930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		int flags;
70030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CPF_NONE		0x0000
70130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CPF_FIRST		0x0001	/* First block */
70230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CPF_LAST		0x0002	/* Last block */
70330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		int len;
70430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		int offs;	/* If required by the device (0 if not used) */
70530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
70630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		unsigned char data[4000]; /* NOTE! 4000 is not 4k */
70730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	} copr_buffer;
70830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
70930692c65c4174412c90e79489e98ab85c1a7412fBen Chengtypedef struct copr_debug_buf {
71030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		int command;	/* Used internally. Set to 0 */
71130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		int parm1;
71230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		int parm2;
71330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		int flags;
71430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		int len;	/* Length of data in bytes */
71530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	} copr_debug_buf;
71630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
71730692c65c4174412c90e79489e98ab85c1a7412fBen Chengtypedef struct copr_msg {
71830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		int len;
71930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		unsigned char data[4000];
72030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	} copr_msg;
72130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
72230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_COPR_RESET             _SIO  ('C',  0)
72330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_COPR_LOAD	      _SIOWR('C',  1, copr_buffer)
72430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_COPR_RDATA	      _SIOWR('C',  2, copr_debug_buf)
72530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_COPR_RCODE	      _SIOWR('C',  3, copr_debug_buf)
72630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_COPR_WDATA	      _SIOW ('C',  4, copr_debug_buf)
72730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_COPR_WCODE	      _SIOW ('C',  5, copr_debug_buf)
72830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_COPR_RUN		      _SIOWR('C',  6, copr_debug_buf)
72930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_COPR_HALT	      _SIOWR('C',  7, copr_debug_buf)
73030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_COPR_SENDMSG	      _SIOWR('C',  8, copr_msg)
73130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_COPR_RCVMSG	      _SIOR ('C',  9, copr_msg)
73230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
73330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*********************************************
73430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * IOCTL commands for /dev/mixer
73530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
73630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
73730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
73830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Mixer devices
73930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
74030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * There can be up to 20 different analog mixer channels. The
74130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * SOUND_MIXER_NRDEVICES gives the currently supported maximum.
74230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * The SOUND_MIXER_READ_DEVMASK returns a bitmask which tells
74330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * the devices supported by the particular mixer.
74430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
74530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
74630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_NRDEVICES	25
74730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_VOLUME	0
74830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_BASS	1
74930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_TREBLE	2
75030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_SYNTH	3
75130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_PCM		4
75230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_SPEAKER	5
75330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_LINE	6
75430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_MIC		7
75530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_CD		8
75630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_IMIX	9	/*  Recording monitor  */
75730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_ALTPCM	10
75830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_RECLEV	11	/* Recording level */
75930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_IGAIN	12	/* Input gain */
76030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_OGAIN	13	/* Output gain */
76130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
76230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * The AD1848 codec and compatibles have three line level inputs
76330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * (line, aux1 and aux2). Since each card manufacturer have assigned
76430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * different meanings to these inputs, it's inpractical to assign
76530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * specific meanings (line, cd, synth etc.) to them.
76630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
76730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_LINE1	14	/* Input source 1  (aux1) */
76830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_LINE2	15	/* Input source 2  (aux2) */
76930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_LINE3	16	/* Input source 3  (line) */
77030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_DIGITAL1	17	/* Digital (input) 1 */
77130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_DIGITAL2	18	/* Digital (input) 2 */
77230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_DIGITAL3	19	/* Digital (input) 3 */
77330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_PHONEIN	20	/* Phone input */
77430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_PHONEOUT	21	/* Phone output */
77530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_VIDEO	22	/* Video/TV (audio) in */
77630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_RADIO	23	/* Radio in */
77730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_MONITOR	24	/* Monitor (usually mic) volume */
77830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
77930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Some on/off settings (SOUND_SPECIAL_MIN - SOUND_SPECIAL_MAX) */
78030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Not counted to SOUND_MIXER_NRDEVICES, but use the same number space */
78130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_ONOFF_MIN		28
78230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_ONOFF_MAX		30
78330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
78430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Note!	Number 31 cannot be used since the sign bit is reserved */
78530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_NONE	31
78630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
78730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
78830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * The following unsupported macros are no longer functional.
78930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Use SOUND_MIXER_PRIVATE# macros in future.
79030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
79130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_ENHANCE	SOUND_MIXER_NONE
79230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_MUTE	SOUND_MIXER_NONE
79330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_LOUD	SOUND_MIXER_NONE
79430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
79530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
79630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_DEVICE_LABELS	{"Vol  ", "Bass ", "Trebl", "Synth", "Pcm  ", "Spkr ", "Line ", \
79730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng				 "Mic  ", "CD   ", "Mix  ", "Pcm2 ", "Rec  ", "IGain", "OGain", \
79830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng				 "Line1", "Line2", "Line3", "Digital1", "Digital2", "Digital3", \
79930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng				 "PhoneIn", "PhoneOut", "Video", "Radio", "Monitor"}
80030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
80130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_DEVICE_NAMES	{"vol", "bass", "treble", "synth", "pcm", "speaker", "line", \
80230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng				 "mic", "cd", "mix", "pcm2", "rec", "igain", "ogain", \
80330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng				 "line1", "line2", "line3", "dig1", "dig2", "dig3", \
80430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng				 "phin", "phout", "video", "radio", "monitor"}
80530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
80630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*	Device bitmask identifiers	*/
80730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
80830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_RECSRC	0xff	/* Arg contains a bit for each recording source */
80930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_DEVMASK	0xfe	/* Arg contains a bit for each supported device */
81030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_RECMASK	0xfd	/* Arg contains a bit for each supported recording source */
81130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_CAPS	0xfc
81230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#	define SOUND_CAP_EXCL_INPUT	0x00000001	/* Only one recording source at a time */
81330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_STEREODEVS	0xfb	/* Mixer channels supporting stereo */
81430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_OUTSRC	0xfa	/* Arg contains a bit for each input source to output */
81530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_OUTMASK	0xf9	/* Arg contains a bit for each supported input source to output */
81630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
81730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*	Device mask bits	*/
81830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
81930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_VOLUME	(1 << SOUND_MIXER_VOLUME)
82030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_BASS		(1 << SOUND_MIXER_BASS)
82130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_TREBLE	(1 << SOUND_MIXER_TREBLE)
82230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_SYNTH	(1 << SOUND_MIXER_SYNTH)
82330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_PCM		(1 << SOUND_MIXER_PCM)
82430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_SPEAKER	(1 << SOUND_MIXER_SPEAKER)
82530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_LINE		(1 << SOUND_MIXER_LINE)
82630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_MIC		(1 << SOUND_MIXER_MIC)
82730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_CD		(1 << SOUND_MIXER_CD)
82830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_IMIX		(1 << SOUND_MIXER_IMIX)
82930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_ALTPCM	(1 << SOUND_MIXER_ALTPCM)
83030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_RECLEV	(1 << SOUND_MIXER_RECLEV)
83130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_IGAIN	(1 << SOUND_MIXER_IGAIN)
83230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_OGAIN	(1 << SOUND_MIXER_OGAIN)
83330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_LINE1	(1 << SOUND_MIXER_LINE1)
83430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_LINE2	(1 << SOUND_MIXER_LINE2)
83530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_LINE3	(1 << SOUND_MIXER_LINE3)
83630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_DIGITAL1	(1 << SOUND_MIXER_DIGITAL1)
83730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_DIGITAL2	(1 << SOUND_MIXER_DIGITAL2)
83830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_DIGITAL3	(1 << SOUND_MIXER_DIGITAL3)
83930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_PHONEIN	(1 << SOUND_MIXER_PHONEIN)
84030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_PHONEOUT	(1 << SOUND_MIXER_PHONEOUT)
84130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_RADIO	(1 << SOUND_MIXER_RADIO)
84230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_VIDEO	(1 << SOUND_MIXER_VIDEO)
84330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_MONITOR	(1 << SOUND_MIXER_MONITOR)
84430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
84530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Obsolete macros */
84630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_MUTE		(1 << SOUND_MIXER_MUTE)
84730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_ENHANCE	(1 << SOUND_MIXER_ENHANCE)
84830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_LOUD		(1 << SOUND_MIXER_LOUD)
84930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
85030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define MIXER_READ(dev)		_SIOR('M', dev, int)
85130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_VOLUME		MIXER_READ(SOUND_MIXER_VOLUME)
85230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_BASS		MIXER_READ(SOUND_MIXER_BASS)
85330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_TREBLE		MIXER_READ(SOUND_MIXER_TREBLE)
85430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_SYNTH		MIXER_READ(SOUND_MIXER_SYNTH)
85530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_PCM		MIXER_READ(SOUND_MIXER_PCM)
85630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_SPEAKER	MIXER_READ(SOUND_MIXER_SPEAKER)
85730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_LINE		MIXER_READ(SOUND_MIXER_LINE)
85830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_MIC		MIXER_READ(SOUND_MIXER_MIC)
85930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_CD		MIXER_READ(SOUND_MIXER_CD)
86030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_IMIX		MIXER_READ(SOUND_MIXER_IMIX)
86130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_ALTPCM		MIXER_READ(SOUND_MIXER_ALTPCM)
86230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_RECLEV		MIXER_READ(SOUND_MIXER_RECLEV)
86330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_IGAIN		MIXER_READ(SOUND_MIXER_IGAIN)
86430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_OGAIN		MIXER_READ(SOUND_MIXER_OGAIN)
86530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_LINE1		MIXER_READ(SOUND_MIXER_LINE1)
86630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_LINE2		MIXER_READ(SOUND_MIXER_LINE2)
86730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_LINE3		MIXER_READ(SOUND_MIXER_LINE3)
86830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
86930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Obsolete macros */
87030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_MUTE		MIXER_READ(SOUND_MIXER_MUTE)
87130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_ENHANCE	MIXER_READ(SOUND_MIXER_ENHANCE)
87230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_LOUD		MIXER_READ(SOUND_MIXER_LOUD)
87330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
87430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_RECSRC		MIXER_READ(SOUND_MIXER_RECSRC)
87530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_DEVMASK	MIXER_READ(SOUND_MIXER_DEVMASK)
87630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_RECMASK	MIXER_READ(SOUND_MIXER_RECMASK)
87730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_STEREODEVS	MIXER_READ(SOUND_MIXER_STEREODEVS)
87830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_CAPS		MIXER_READ(SOUND_MIXER_CAPS)
87930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
88030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define MIXER_WRITE(dev)		_SIOWR('M', dev, int)
88130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_VOLUME	MIXER_WRITE(SOUND_MIXER_VOLUME)
88230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_BASS		MIXER_WRITE(SOUND_MIXER_BASS)
88330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_TREBLE	MIXER_WRITE(SOUND_MIXER_TREBLE)
88430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_SYNTH		MIXER_WRITE(SOUND_MIXER_SYNTH)
88530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_PCM		MIXER_WRITE(SOUND_MIXER_PCM)
88630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_SPEAKER	MIXER_WRITE(SOUND_MIXER_SPEAKER)
88730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_LINE		MIXER_WRITE(SOUND_MIXER_LINE)
88830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_MIC		MIXER_WRITE(SOUND_MIXER_MIC)
88930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_CD		MIXER_WRITE(SOUND_MIXER_CD)
89030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_IMIX		MIXER_WRITE(SOUND_MIXER_IMIX)
89130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_ALTPCM	MIXER_WRITE(SOUND_MIXER_ALTPCM)
89230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_RECLEV	MIXER_WRITE(SOUND_MIXER_RECLEV)
89330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_IGAIN		MIXER_WRITE(SOUND_MIXER_IGAIN)
89430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_OGAIN		MIXER_WRITE(SOUND_MIXER_OGAIN)
89530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_LINE1		MIXER_WRITE(SOUND_MIXER_LINE1)
89630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_LINE2		MIXER_WRITE(SOUND_MIXER_LINE2)
89730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_LINE3		MIXER_WRITE(SOUND_MIXER_LINE3)
89830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
89930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Obsolete macros */
90030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_MUTE		MIXER_WRITE(SOUND_MIXER_MUTE)
90130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_ENHANCE	MIXER_WRITE(SOUND_MIXER_ENHANCE)
90230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_LOUD		MIXER_WRITE(SOUND_MIXER_LOUD)
90330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
90430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_RECSRC	MIXER_WRITE(SOUND_MIXER_RECSRC)
90530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
90630692c65c4174412c90e79489e98ab85c1a7412fBen Chengtypedef struct mixer_info
90730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng{
90830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng  char id[16];
90930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng  char name[32];
91030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng  int  modify_counter;
91130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng  int fillers[10];
91230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng} mixer_info;
91330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
91430692c65c4174412c90e79489e98ab85c1a7412fBen Chengtypedef struct _old_mixer_info /* Obsolete */
91530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng{
91630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng  char id[16];
91730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng  char name[32];
91830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng} _old_mixer_info;
91930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
92030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_INFO		_SIOR ('M', 101, mixer_info)
92130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_OLD_MIXER_INFO		_SIOR ('M', 101, _old_mixer_info)
92230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
92330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
92430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * A mechanism for accessing "proprietary" mixer features. This method
92530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * permits passing 128 bytes of arbitrary data between a mixer application
92630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * and the mixer driver. Interpretation of the record is defined by
92730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * the particular mixer driver.
92830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
92930692c65c4174412c90e79489e98ab85c1a7412fBen Chengtypedef unsigned char mixer_record[128];
93030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
93130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_ACCESS		_SIOWR('M', 102, mixer_record)
93230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
93330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
93430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Two ioctls for special souncard function
93530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
93630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_AGC  _SIOWR('M', 103, int)
93730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_3DSE  _SIOWR('M', 104, int)
93830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
93930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
94030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * The SOUND_MIXER_PRIVATE# commands can be redefined by low level drivers.
94130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * These features can be used when accessing device specific features.
94230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
94330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_PRIVATE1		_SIOWR('M', 111, int)
94430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_PRIVATE2		_SIOWR('M', 112, int)
94530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_PRIVATE3		_SIOWR('M', 113, int)
94630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_PRIVATE4		_SIOWR('M', 114, int)
94730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_PRIVATE5		_SIOWR('M', 115, int)
94830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
94930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
95030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * SOUND_MIXER_GETLEVELS and SOUND_MIXER_SETLEVELS calls can be used
95130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * for querying current mixer settings from the driver and for loading
95230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * default volume settings _prior_ activating the mixer (loading
95330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * doesn't affect current state of the mixer hardware). These calls
95430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * are for internal use only.
95530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
95630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
95730692c65c4174412c90e79489e98ab85c1a7412fBen Chengtypedef struct mixer_vol_table {
95830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng  int num;	/* Index to volume table */
95930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng  char name[32];
96030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng  int levels[32];
96130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng} mixer_vol_table;
96230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
96330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_GETLEVELS		_SIOWR('M', 116, mixer_vol_table)
96430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_SETLEVELS		_SIOWR('M', 117, mixer_vol_table)
96530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
96630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
96730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * An ioctl for identifying the driver version. It will return value
96830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * of the SOUND_VERSION macro used when compiling the driver.
96930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * This call was introduced in OSS version 3.6 and it will not work
97030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * with earlier versions (returns EINVAL).
97130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
97230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define OSS_GETVERSION			_SIOR ('M', 118, int)
97330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
97430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
97530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Level 2 event types for /dev/sequencer
97630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
97730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
97830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
97930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * The 4 most significant bits of byte 0 specify the class of
98030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * the event:
98130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
98230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	0x8X = system level events,
98330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	0x9X = device/port specific events, event[1] = device/port,
98430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *		The last 4 bits give the subtype:
98530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *			0x02	= Channel event (event[3] = chn).
98630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *			0x01	= note event (event[4] = note).
98730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *			(0x01 is not used alone but always with bit 0x02).
98830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	       event[2] = MIDI message code (0x80=note off etc.)
98930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
99030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
99130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
99230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define EV_SEQ_LOCAL		0x80
99330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define EV_TIMING		0x81
99430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define EV_CHN_COMMON		0x92
99530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define EV_CHN_VOICE		0x93
99630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define EV_SYSEX		0x94
99730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
99830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Event types 200 to 220 are reserved for application use.
99930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * These numbers will not be used by the driver.
100030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
100130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
100230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
100330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Events for event type EV_CHN_VOICE
100430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
100530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
100630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define MIDI_NOTEOFF		0x80
100730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define MIDI_NOTEON		0x90
100830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define MIDI_KEY_PRESSURE	0xA0
100930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
101030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
101130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Events for event type EV_CHN_COMMON
101230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
101330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
101430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define MIDI_CTL_CHANGE		0xB0
101530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define MIDI_PGM_CHANGE		0xC0
101630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define MIDI_CHN_PRESSURE	0xD0
101730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define MIDI_PITCH_BEND		0xE0
101830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
101930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define MIDI_SYSTEM_PREFIX	0xF0
102030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
102130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
102230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Timer event types
102330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
102430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define TMR_WAIT_REL		1	/* Time relative to the prev time */
102530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define TMR_WAIT_ABS		2	/* Absolute time since TMR_START */
102630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define TMR_STOP		3
102730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define TMR_START		4
102830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define TMR_CONTINUE		5
102930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define TMR_TEMPO		6
103030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define TMR_ECHO		8
103130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define TMR_CLOCK		9	/* MIDI clock */
103230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define TMR_SPP			10	/* Song position pointer */
103330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define TMR_TIMESIG		11	/* Time signature */
103430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
103530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
103630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	Local event types
103730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
103830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define LOCL_STARTAUDIO		1
103930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
104030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#if !defined(__KERNEL__) || defined(USE_SEQ_MACROS)
104130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
104230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	Some convenience macros to simplify programming of the
104330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	/dev/sequencer interface
104430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
104530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	This is a legacy interface for applications written against
104630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	the OSSlib-3.8 style interface. It is no longer possible
104730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	to actually link against OSSlib with this header, but we
104830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	still provide these macros for programs using them.
104930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
105030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	If you want to use OSSlib, it is recommended that you get
105130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	the GPL version of OSS-4.x and build against that version
105230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	of the header.
105330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
105430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	We redefine the extern keyword so that make headers_check
105530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	does not complain about SEQ_USE_EXTBUF.
105630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
105730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_DECLAREBUF()		SEQ_USE_EXTBUF()
105830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
105930692c65c4174412c90e79489e98ab85c1a7412fBen Chengvoid seqbuf_dump(void);	/* This function must be provided by programs */
106030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
106130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_PM_DEFINES int __foo_bar___
106230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
106330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_LOAD_GMINSTR(dev, instr)
106430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_LOAD_GMDRUM(dev, drum)
106530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
106630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _SEQ_EXTERN extern
106730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_USE_EXTBUF() \
106830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		_SEQ_EXTERN unsigned char _seqbuf[]; \
106930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		_SEQ_EXTERN int _seqbuflen; _SEQ_EXTERN int _seqbufptr
107030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
107130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#ifndef USE_SIMPLE_MACROS
107230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Sample seqbuf_dump() implementation:
107330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
107430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	SEQ_DEFINEBUF (2048);	-- Defines a buffer for 2048 bytes
107530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
107630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	int seqfd;		-- The file descriptor for /dev/sequencer.
107730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
107830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	void
107930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	seqbuf_dump ()
108030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	{
108130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	  if (_seqbufptr)
108230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	    if (write (seqfd, _seqbuf, _seqbufptr) == -1)
108330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	      {
108430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *		perror ("write /dev/sequencer");
108530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *		exit (-1);
108630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	      }
108730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	  _seqbufptr = 0;
108830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *	}
108930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
109030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
109130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_DEFINEBUF(len)		unsigned char _seqbuf[len]; int _seqbuflen = len;int _seqbufptr = 0
109230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _SEQ_NEEDBUF(len)		if ((_seqbufptr+(len)) > _seqbuflen) seqbuf_dump()
109330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _SEQ_ADVBUF(len)		_seqbufptr += len
109430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_DUMPBUF			seqbuf_dump
109530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#else
109630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
109730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * This variation of the sequencer macros is used just to format one event
109830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * using fixed buffer.
109930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
110030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * The program using the macro library must define the following macros before
110130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * using this library.
110230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
110330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * #define _seqbuf 		 name of the buffer (unsigned char[])
110430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * #define _SEQ_ADVBUF(len)	 If the applic needs to know the exact
110530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *				 size of the event, this macro can be used.
110630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *				 Otherwise this must be defined as empty.
110730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * #define _seqbufptr		 Define the name of index variable or 0 if
110830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *				 not required.
110930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
111030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _SEQ_NEEDBUF(len)	/* empty */
111130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#endif
111230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
111330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_VOLUME_MODE(dev, mode)	{_SEQ_NEEDBUF(8);\
111430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr] = SEQ_EXTENDED;\
111530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr+1] = SEQ_VOLMODE;\
111630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr+2] = (dev);\
111730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr+3] = (mode);\
111830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr+4] = 0;\
111930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr+5] = 0;\
112030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr+6] = 0;\
112130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr+7] = 0;\
112230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_SEQ_ADVBUF(8);}
112330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
112430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
112530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Midi voice messages
112630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
112730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
112830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _CHN_VOICE(dev, event, chn, note, parm) \
112930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					{_SEQ_NEEDBUF(8);\
113030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr] = EV_CHN_VOICE;\
113130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr+1] = (dev);\
113230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr+2] = (event);\
113330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr+3] = (chn);\
113430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr+4] = (note);\
113530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr+5] = (parm);\
113630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr+6] = (0);\
113730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr+7] = 0;\
113830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_SEQ_ADVBUF(8);}
113930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
114030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_START_NOTE(dev, chn, note, vol) \
114130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		_CHN_VOICE(dev, MIDI_NOTEON, chn, note, vol)
114230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
114330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_STOP_NOTE(dev, chn, note, vol) \
114430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		_CHN_VOICE(dev, MIDI_NOTEOFF, chn, note, vol)
114530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
114630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_KEY_PRESSURE(dev, chn, note, pressure) \
114730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		_CHN_VOICE(dev, MIDI_KEY_PRESSURE, chn, note, pressure)
114830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
114930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
115030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Midi channel messages
115130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
115230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
115330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _CHN_COMMON(dev, event, chn, p1, p2, w14) \
115430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					{_SEQ_NEEDBUF(8);\
115530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr] = EV_CHN_COMMON;\
115630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr+1] = (dev);\
115730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr+2] = (event);\
115830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr+3] = (chn);\
115930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr+4] = (p1);\
116030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr+5] = (p2);\
116130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					*(short *)&_seqbuf[_seqbufptr+6] = (w14);\
116230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_SEQ_ADVBUF(8);}
116330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
116430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * SEQ_SYSEX permits sending of sysex messages. (It may look that it permits
116530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * sending any MIDI bytes but it's absolutely not possible. Trying to do
116630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * so _will_ cause problems with MPU401 intelligent mode).
116730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
116830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Sysex messages are sent in blocks of 1 to 6 bytes. Longer messages must be
116930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * sent by calling SEQ_SYSEX() several times (there must be no other events
117030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * between them). First sysex fragment must have 0xf0 in the first byte
117130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * and the last byte (buf[len-1] of the last fragment must be 0xf7. No byte
117230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * between these sysex start and end markers cannot be larger than 0x7f. Also
117330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * lengths of each fragments (except the last one) must be 6.
117430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
117530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Breaking the above rules may work with some MIDI ports but is likely to
117630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * cause fatal problems with some other devices (such as MPU401).
117730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
117830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_SYSEX(dev, buf, len) \
117930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					{int ii, ll=(len); \
118030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					 unsigned char *bufp=buf;\
118130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					 if (ll>6)ll=6;\
118230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_SEQ_NEEDBUF(8);\
118330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr] = EV_SYSEX;\
118430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr+1] = (dev);\
118530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					for(ii=0;ii<ll;ii++)\
118630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					   _seqbuf[_seqbufptr+ii+2] = bufp[ii];\
118730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					for(ii=ll;ii<6;ii++)\
118830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					   _seqbuf[_seqbufptr+ii+2] = 0xff;\
118930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_SEQ_ADVBUF(8);}
119030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
119130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_CHN_PRESSURE(dev, chn, pressure) \
119230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		_CHN_COMMON(dev, MIDI_CHN_PRESSURE, chn, pressure, 0, 0)
119330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
119430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_SET_PATCH SEQ_PGM_CHANGE
119530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_PGM_CHANGE(dev, chn, patch) \
119630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		_CHN_COMMON(dev, MIDI_PGM_CHANGE, chn, patch, 0, 0)
119730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
119830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_CONTROL(dev, chn, controller, value) \
119930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		_CHN_COMMON(dev, MIDI_CTL_CHANGE, chn, controller, 0, value)
120030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
120130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_BENDER(dev, chn, value) \
120230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		_CHN_COMMON(dev, MIDI_PITCH_BEND, chn, 0, 0, value)
120330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
120430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
120530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_V2_X_CONTROL(dev, voice, controller, value)	{_SEQ_NEEDBUF(8);\
120630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr] = SEQ_EXTENDED;\
120730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr+1] = SEQ_CONTROLLER;\
120830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr+2] = (dev);\
120930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr+3] = (voice);\
121030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr+4] = (controller);\
121130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr+5] = ((value)&0xff);\
121230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr+6] = ((value>>8)&0xff);\
121330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr+7] = 0;\
121430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_SEQ_ADVBUF(8);}
121530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
121630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * The following 5 macros are incorrectly implemented and obsolete.
121730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Use SEQ_BENDER and SEQ_CONTROL (with proper controller) instead.
121830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
121930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_PITCHBEND(dev, voice, value) SEQ_V2_X_CONTROL(dev, voice, CTRL_PITCH_BENDER, value)
122030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_BENDER_RANGE(dev, voice, value) SEQ_V2_X_CONTROL(dev, voice, CTRL_PITCH_BENDER_RANGE, value)
122130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_EXPRESSION(dev, voice, value) SEQ_CONTROL(dev, voice, CTL_EXPRESSION, value*128)
122230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_MAIN_VOLUME(dev, voice, value) SEQ_CONTROL(dev, voice, CTL_MAIN_VOLUME, (value*16383)/100)
122330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_PANNING(dev, voice, pos) SEQ_CONTROL(dev, voice, CTL_PAN, (pos+128) / 2)
122430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
122530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
122630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Timing and synchronization macros
122730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
122830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
122930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _TIMER_EVENT(ev, parm)		{_SEQ_NEEDBUF(8);\
123030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng				 	_seqbuf[_seqbufptr+0] = EV_TIMING; \
123130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng				 	_seqbuf[_seqbufptr+1] = (ev); \
123230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr+2] = 0;\
123330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr+3] = 0;\
123430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng				 	*(unsigned int *)&_seqbuf[_seqbufptr+4] = (parm); \
123530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_SEQ_ADVBUF(8);}
123630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
123730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_START_TIMER()		_TIMER_EVENT(TMR_START, 0)
123830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_STOP_TIMER()		_TIMER_EVENT(TMR_STOP, 0)
123930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_CONTINUE_TIMER()		_TIMER_EVENT(TMR_CONTINUE, 0)
124030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_WAIT_TIME(ticks)		_TIMER_EVENT(TMR_WAIT_ABS, ticks)
124130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_DELTA_TIME(ticks)		_TIMER_EVENT(TMR_WAIT_REL, ticks)
124230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_ECHO_BACK(key)		_TIMER_EVENT(TMR_ECHO, key)
124330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_SET_TEMPO(value)		_TIMER_EVENT(TMR_TEMPO, value)
124430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_SONGPOS(pos)		_TIMER_EVENT(TMR_SPP, pos)
124530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_TIME_SIGNATURE(sig)		_TIMER_EVENT(TMR_TIMESIG, sig)
124630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
124730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
124830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Local control events
124930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
125030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
125130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _LOCAL_EVENT(ev, parm)		{_SEQ_NEEDBUF(8);\
125230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng				 	_seqbuf[_seqbufptr+0] = EV_SEQ_LOCAL; \
125330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng				 	_seqbuf[_seqbufptr+1] = (ev); \
125430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr+2] = 0;\
125530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr+3] = 0;\
125630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng				 	*(unsigned int *)&_seqbuf[_seqbufptr+4] = (parm); \
125730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_SEQ_ADVBUF(8);}
125830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
125930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_PLAYAUDIO(devmask)		_LOCAL_EVENT(LOCL_STARTAUDIO, devmask)
126030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
126130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Events for the level 1 interface only
126230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
126330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
126430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_MIDIOUT(device, byte)	{_SEQ_NEEDBUF(4);\
126530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr] = SEQ_MIDIPUTC;\
126630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr+1] = (byte);\
126730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr+2] = (device);\
126830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_seqbuf[_seqbufptr+3] = 0;\
126930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng					_SEQ_ADVBUF(4);}
127030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
127130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
127230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Patch loading.
127330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
127430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_WRPATCH(patchx, len) \
127530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		{if (_seqbufptr) SEQ_DUMPBUF();\
127630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		 if (write(seqfd, (char*)(patchx), len)==-1) \
127730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		    perror("Write patch: /dev/sequencer");}
127830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_WRPATCH2(patchx, len) \
127930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		(SEQ_DUMPBUF(), write(seqfd, (char*)(patchx), len))
128030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
128130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#endif
128230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#endif /* _UAPISOUNDCARD_H */
1283