soundcard.h

来自「基于组件方式开发操作系统的OSKIT源代码」· C头文件 代码 · 共 1,365 行 · 第 1/4 页

H
1,365
字号
/* * soundcard.h * * Copyright by Hannu Savolainen 1993 * Modified for the new FreeBSD sound driver by Luigi Rizzo, 1997 * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above *    copyright notice, this list of conditions and the following *    disclaimer in the documentation and/or other materials provided *    with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */#ifndef SOUNDCARD_H#define SOUNDCARD_H /*   * If you make modifications to this file, please contact me before  * distributing the modified version. There is already enough   * diversity in the world.  *  * Regards,  * Hannu Savolainen  * hannu@voxware.pp.fi  *  **********************************************************************  * PS.	The Hacker's Guide to VoxWare available from   *     nic.funet.fi:pub/OS/Linux/ALPHA/sound. The file is  *	snd-sdk-doc-0.1.ps.gz (gzipped postscript). It contains  *	some useful information about programming with VoxWare.  *	(NOTE! The pub/OS/Linux/ALPHA/ directories are hidden. You have  *	to cd inside them before the files are accessible.)  **********************************************************************  *//* * SOUND_VERSION is only used by the voxware driver. Hopefully apps * should not depend on it, but rather look at the capabilities * of the driver in the kernel! */#define SOUND_VERSION  301#define VOXWARE		/* does this have any use ? *//* * Supported card ID numbers (Should be somewhere else? We keep * them here just for compativility with the old driver, but these * constants are of little or no use). */#define SNDCARD_ADLIB          1#define SNDCARD_SB             2#define SNDCARD_PAS            3#define SNDCARD_GUS            4#define SNDCARD_MPU401         5#define SNDCARD_SB16           6#define SNDCARD_SB16MIDI       7#define SNDCARD_UART6850       8#define SNDCARD_GUS16          9#define SNDCARD_MSS            10#define SNDCARD_PSS            11#define SNDCARD_SSCAPE         12#define SNDCARD_PSS_MPU        13#define SNDCARD_PSS_MSS        14#define SNDCARD_SSCAPE_MSS     15#define SNDCARD_TRXPRO         16#define SNDCARD_TRXPRO_SB      17#define SNDCARD_TRXPRO_MPU     18#define SNDCARD_MAD16          19#define SNDCARD_MAD16_MPU      20#define SNDCARD_CS4232         21#define SNDCARD_CS4232_MPU     22#define SNDCARD_MAUI           23#define SNDCARD_PSEUDO_MSS     24#define SNDCARD_AWE32           25#define SNDCARD_NSS            26#include <sys/types.h>#ifndef _IOWR#include <sys/ioccom.h>#endif  /* !_IOWR *//* * The first part of this file contains the new FreeBSD sound ioctl * interface. Tries to minimize the number of different ioctls, and * to be reasonably general. * * 970821: some of the new calls have not been implemented yet. *//* * the following three calls extend the generic file descriptor * interface. AIONWRITE is the dual of FIONREAD, i.e. returns the max * number of bytes for a write operation to be non-blocking. * * AIOGSIZE/AIOSSIZE are used to change the behaviour of the device, * from a character device (default) to a block device. In block mode, * (not to be confused with blocking mode) the main difference for the * application is that select() will return only when a complete * block can be read/written to the device, whereas in character mode * select will return true when one byte can be exchanged. For audio * devices, character mode makes select almost useless since one byte * will always be ready by the next sample time (which is often only a * handful of microseconds away).  * Use a size of 0 or 1 to return to character mode. */#define	AIONWRITE   _IOR('A', 10, int)   /* get # bytes to write */struct snd_size {    int play_size;    int rec_size;};#define	AIOGSIZE    _IOR('A', 11, struct snd_size)/* read current blocksize */#define	AIOSSIZE    _IOWR('A', 11, struct snd_size)  /* sets blocksize *//* * The following constants define supported audio formats. The * encoding follows voxware conventions, i.e. 1 bit for each supported * format. We extend it by using bit 31 (RO) to indicate full-duplex * capability, and bit 29 (RO) to indicate that the card supports/ * needs different formats on capture & playback channels. * Bit 29 (RW) is used to indicate/ask stereo. */#   define AFMT_QUERY		0x00000000	/* Return current fmt */#   define AFMT_MU_LAW		0x00000001#   define AFMT_A_LAW		0x00000002#   define AFMT_IMA_ADPCM	0x00000004#   define AFMT_U8		0x00000008#   define AFMT_S16_LE		0x00000010	/* Little endian signed 16*/#   define AFMT_S16_BE		0x00000020	/* Big endian signed 16 */#   define AFMT_S8		0x00000040#   define AFMT_U16_LE		0x00000080	/* Little endian U16 */#   define AFMT_U16_BE		0x00000100	/* Big endian U16 */#   define AFMT_MPEG		0x00000200	/* MPEG (2) audio */#   define AFMT_STEREO		0x10000000	/* can do/want stereo	*//* * the following are really capabilities */#   define AFMT_WEIRD		0x20000000	/* weird hardware...	*/    /*     * AFMT_WEIRD reports that the hardware might need to operate     * with different formats in the playback and capture     * channels when operating in full duplex.     * As an example, SoundBlaster16 cards only support U8 in one     * direction and S16 in the other one, and applications should     * be aware of this limitation.     */#   define AFMT_FULLDUPLEX	0x80000000	/* can do full duplex	*//* * The following structure is used to get/set format and sampling rate. * While it would be better to have things such as stereo, bits per * sample, endiannes, etc split in different variables, it turns out * that formats are not that many, and not all combinations are possible. * So we followed the Voxware approach of associating one bit to each * format. */typedef struct _snd_chan_param {    u_long	play_rate;	/* sampling rate			*/    u_long	rec_rate;	/* sampling rate			*/    u_long	play_format;	/* everything describing the format	*/    u_long	rec_format;	/* everything describing the format	*/} snd_chan_param;#define	AIOGFMT    _IOR('f', 12, snd_chan_param)   /* get format */#define	AIOSFMT    _IOWR('f', 12, snd_chan_param)  /* sets format *//* * The following structure is used to get/set the mixer setting. * Up to 32 mixers are supported, each one with up to 32 channels. */typedef struct _snd_mix_param {    u_char	subdev;	/* which output				*/    u_char	line;	/* which input				*/    u_char	left,right; /* volumes, 0..255, 0 = mute	*/} snd_mix_param ;/* XXX AIOGMIX, AIOSMIX not implemented yet */#define AIOGMIX	_IOWR('A', 13, snd_mix_param)	/* return mixer status */#define AIOSMIX	_IOWR('A', 14, snd_mix_param)	/* sets mixer status   *//* * channel specifiers used in AIOSTOP and AIOSYNC */#define	AIOSYNC_PLAY	0x1	/* play chan */#define	AIOSYNC_CAPTURE	0x2	/* capture chan *//* AIOSTOP stop & flush a channel, returns the residual count */#define	AIOSTOP	_IOWR ('A', 15, int)/* alternate method used to notify the sync condition */#define	AIOSYNC_SIGNAL	0x100#define	AIOSYNC_SELECT	0x200/* what the 'pos' field refers to */#define AIOSYNC_READY	0x400#define AIOSYNC_FREE	0x800typedef struct _snd_sync_parm {    long chan ; /* play or capture channel, plus modifier */    long pos;} snd_sync_parm;#define	AIOSYNC	_IOWR ('A', 15, snd_sync_parm)	/* misc. synchronization *//* * The following is used to return device capabilities. If the structure * passed to the ioctl is zeroed, default values are returned for rate * and formats, a bitmap of available mixers is returned, and values * (inputs, different levels) for the first one are returned. * * If  formats, mixers, inputs are instantiated, then detailed info * are returned depending on the call. */typedef struct _snd_capabilities {    u_long	rate_min, rate_max;	/* min-max sampling rate */    u_long	formats;    u_long	bufsize; /* DMA buffer size */    u_long	mixers; /* bitmap of available mixers */    u_long	inputs; /* bitmap of available inputs (per mixer) */    u_short	left, right;	/* how many levels are supported */} snd_capabilities;#define AIOGCAP	_IOWR('A', 15, snd_capabilities)	/* get capabilities *//* * here is the old (Voxware) ioctl interface *//* * IOCTL Commands for /dev/sequencer */#define SNDCTL_SEQ_RESET	_IO  ('Q', 0)#define SNDCTL_SEQ_SYNC		_IO  ('Q', 1)#define SNDCTL_SYNTH_INFO	_IOWR('Q', 2, struct synth_info)#define SNDCTL_SEQ_CTRLRATE	_IOWR('Q', 3, int) /* Set/get timer res.(hz) */#define SNDCTL_SEQ_GETOUTCOUNT	_IOR ('Q', 4, int)#define SNDCTL_SEQ_GETINCOUNT	_IOR ('Q', 5, int)#define SNDCTL_SEQ_PERCMODE	_IOW ('Q', 6, int)#define SNDCTL_FM_LOAD_INSTR	_IOW ('Q', 7, struct sbi_instrument)	/* Valid for FM only */#define SNDCTL_SEQ_TESTMIDI	_IOW ('Q', 8, int)#define SNDCTL_SEQ_RESETSAMPLES	_IOW ('Q', 9, int)#define SNDCTL_SEQ_NRSYNTHS	_IOR ('Q',10, int)#define SNDCTL_SEQ_NRMIDIS	_IOR ('Q',11, int)#define SNDCTL_MIDI_INFO	_IOWR('Q',12, struct midi_info)#define SNDCTL_SEQ_THRESHOLD	_IOW ('Q',13, int)#define SNDCTL_SEQ_TRESHOLD	SNDCTL_SEQ_THRESHOLD	/* there was once a typo */#define SNDCTL_SYNTH_MEMAVL	_IOWR('Q',14, int) /* in=dev#, out=memsize */#define SNDCTL_FM_4OP_ENABLE	_IOW ('Q',15, int) /* in=dev# */#define SNDCTL_PMGR_ACCESS	_IOWR('Q',16, struct patmgr_info)#define SNDCTL_SEQ_PANIC	_IO  ('Q',17)#define SNDCTL_SEQ_OUTOFBAND	_IOW ('Q',18, struct seq_event_rec)struct seq_event_rec {	u_char arr[8];};#define SNDCTL_TMR_TIMEBASE	_IOWR('T', 1, int)#define SNDCTL_TMR_START	_IO  ('T', 2)#define SNDCTL_TMR_STOP		_IO  ('T', 3)#define SNDCTL_TMR_CONTINUE	_IO  ('T', 4)#define SNDCTL_TMR_TEMPO	_IOWR('T', 5, int)#define SNDCTL_TMR_SOURCE	_IOWR('T', 6, int)#   define TMR_INTERNAL		0x00000001#   define TMR_EXTERNAL		0x00000002#	define TMR_MODE_MIDI	0x00000010#	define TMR_MODE_FSK	0x00000020#	define TMR_MODE_CLS	0x00000040#	define TMR_MODE_SMPTE	0x00000080#define SNDCTL_TMR_METRONOME	_IOW ('T', 7, int)#define SNDCTL_TMR_SELECT	_IOW ('T', 8, int)/* *	Endian aware patch key generation algorithm. */#if defined(_AIX) || defined(AIX)#  define _PATCHKEY(id) (0xfd00|id)#else#  define _PATCHKEY(id) ((id<<8)|0xfd)#endif/* *	Sample loading mechanism for internal synthesizers (/dev/sequencer) *	The following patch_info structure has been designed to support *	Gravis UltraSound. It tries to be universal format for uploading *	sample based patches but is probably too limited. */struct patch_info {/*		u_short key;		 Use GUS_PATCH here */	short key;		 /* Use GUS_PATCH here */#define GUS_PATCH	_PATCHKEY(0x04)#define OBSOLETE_GUS_PATCH	_PATCHKEY(0x02)	short device_no;	/* Synthesizer number */	short instr_no;		/* Midi pgm# */	u_long mode;/* * The least significant byte has the same format than the GUS .PAT * files */#define WAVE_16_BITS	0x01	/* bit 0 = 8 or 16 bit wave data. */#define WAVE_UNSIGNED	0x02	/* bit 1 = Signed - Unsigned data. */#define WAVE_LOOPING	0x04	/* bit 2 = looping enabled-1. */#define WAVE_BIDIR_LOOP	0x08	/* bit 3 = Set is bidirectional looping. */#define WAVE_LOOP_BACK	0x10	/* bit 4 = Set is looping backward. */#define WAVE_SUSTAIN_ON	0x20	/* bit 5 = Turn sustaining on. (Env. pts. 3)*/#define WAVE_ENVELOPES	0x40	/* bit 6 = Enable envelopes - 1 */				/* 	(use the env_rate/env_offs fields). *//* Linux specific bits */#define WAVE_VIBRATO	0x00010000	/* The vibrato info is valid */#define WAVE_TREMOLO	0x00020000	/* The tremolo info is valid */#define WAVE_SCALE	0x00040000	/* The scaling info is valid *//* Other bits must be zeroed */	long len;	/* Size of the wave data in bytes */	long loop_start, loop_end; /* Byte offsets from the beginning *//*  * The base_freq and base_note fields are used when computing the * playback speed for a note. The base_note defines the tone frequency * which is heard if the sample is played using the base_freq as the * playback speed. * * The low_note and high_note fields define the minimum and maximum note

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?