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 + -
显示快捷键?