Home | History | Annotate | Line # | Download | only in sys
      1 /*	$NetBSD: audioio.h,v 1.40 2022/04/07 19:33:38 andvar Exp $	*/
      2 
      3 /*
      4  * Copyright (c) 1991-1993 Regents of the University of California.
      5  * All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  * 1. Redistributions of source code must retain the above copyright
     11  *    notice, this list of conditions and the following disclaimer.
     12  * 2. Redistributions in binary form must reproduce the above copyright
     13  *    notice, this list of conditions and the following disclaimer in the
     14  *    documentation and/or other materials provided with the distribution.
     15  * 3. All advertising materials mentioning features or use of this software
     16  *    must display the following acknowledgement:
     17  *	This product includes software developed by the Computer Systems
     18  *	Engineering Group at Lawrence Berkeley Laboratory.
     19  * 4. Neither the name of the University nor of the Laboratory may be used
     20  *    to endorse or promote products derived from this software without
     21  *    specific prior written permission.
     22  *
     23  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     26  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     27  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     28  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     29  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     32  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     33  * SUCH DAMAGE.
     34  *
     35  */
     36 
     37 #ifndef _SYS_AUDIOIO_H_
     38 #define _SYS_AUDIOIO_H_
     39 
     40 #include <sys/types.h>
     41 #include <sys/ioccom.h>
     42 
     43 #ifndef _KERNEL
     44 #include <string.h>	/* Required for memset(3) prototype (AUDIO_INITINFO) */
     45 #endif /* _KERNEL */
     46 
     47 /*
     48  * Audio device
     49  */
     50 struct audio_prinfo {
     51 	u_int	sample_rate;	/* sample rate in bit/s */
     52 	u_int	channels;	/* number of channels, usually 1 or 2 */
     53 	u_int	precision;	/* number of bits/sample */
     54 	u_int	encoding;	/* data encoding (AUDIO_ENCODING_* below) */
     55 	u_int	gain;		/* volume level */
     56 	u_int	port;		/* selected I/O port */
     57 	u_int	seek;		/* BSD extension */
     58 	u_int	avail_ports;	/* available I/O ports */
     59 	u_int	buffer_size;	/* total size audio buffer */
     60 	u_int	_ispare[1];
     61 	/* Current state of device: */
     62 	u_int	samples;	/* number of samples */
     63 	u_int	eof;		/* End Of File (zero-size writes) counter */
     64 	u_char	pause;		/* non-zero if paused, zero to resume */
     65 	u_char	error;		/* non-zero if underflow/overflow occurred */
     66 	u_char	waiting;	/* non-zero if another process hangs in open */
     67 	u_char	balance;	/* stereo channel balance */
     68 	u_char	cspare[2];
     69 	u_char	open;		/* non-zero if currently open */
     70 	u_char	active;		/* non-zero if I/O is currently active */
     71 };
     72 typedef struct audio_prinfo audio_prinfo_t;
     73 
     74 struct audio_info {
     75 	struct	audio_prinfo play;	/* Info for play (output) side */
     76 	struct	audio_prinfo record;	/* Info for record (input) side */
     77 
     78 	u_int	monitor_gain;	/* input to output mix */
     79 	/* BSD extensions */
     80 	u_int	blocksize;	/* H/W read/write block size */
     81 	u_int	hiwat;		/* output high water mark */
     82 	u_int	lowat;		/* output low water mark */
     83 	u_int	_ispare1;
     84 	u_int	mode;		/* current device mode */
     85 #define AUMODE_PLAY	0x01
     86 #define AUMODE_RECORD	0x02
     87 #define AUMODE_PLAY_ALL	0x04	/* don't do real-time correction */
     88 };
     89 typedef struct audio_info audio_info_t;
     90 
     91 #define AUDIO_INITINFO(p) \
     92 	(void)memset((void *)(p), 0xff, sizeof(struct audio_info))
     93 
     94 /*
     95  * Parameter for the AUDIO_GETDEV ioctl to determine current
     96  * audio devices.
     97  */
     98 #define MAX_AUDIO_DEV_LEN       16
     99 typedef struct audio_device {
    100         char name[MAX_AUDIO_DEV_LEN];
    101         char version[MAX_AUDIO_DEV_LEN];
    102         char config[MAX_AUDIO_DEV_LEN];
    103 } audio_device_t;
    104 
    105 typedef struct audio_offset {
    106 	u_int	samples;	/* Total number of bytes transferred */
    107 	u_int	deltablks;	/* Blocks transferred since last checked */
    108 	u_int	offset;		/* Physical transfer offset in buffer */
    109 } audio_offset_t;
    110 
    111 /*
    112  * Supported audio encodings
    113  */
    114 /* Encoding ID's */
    115 #define	AUDIO_ENCODING_NONE		0 /* no encoding assigned */
    116 #define	AUDIO_ENCODING_ULAW		1 /* ITU G.711 mu-law */
    117 #define	AUDIO_ENCODING_ALAW		2 /* ITU G.711 A-law */
    118 #define	AUDIO_ENCODING_PCM16		3 /* signed linear PCM, obsolete */
    119 #define AUDIO_ENCODING_LINEAR		AUDIO_ENCODING_PCM16 /* SunOS compat */
    120 #define	AUDIO_ENCODING_PCM8		4 /* unsigned linear PCM, obsolete */
    121 #define AUDIO_ENCODING_LINEAR8		AUDIO_ENCODING_PCM8 /* SunOS compat */
    122 #define	AUDIO_ENCODING_ADPCM		5 /* adaptive differential PCM */
    123 #define AUDIO_ENCODING_SLINEAR_LE	6
    124 #define AUDIO_ENCODING_SLINEAR_BE	7
    125 #define AUDIO_ENCODING_ULINEAR_LE	8
    126 #define AUDIO_ENCODING_ULINEAR_BE	9
    127 #define AUDIO_ENCODING_SLINEAR		10
    128 #define AUDIO_ENCODING_ULINEAR		11
    129 #define AUDIO_ENCODING_MPEG_L1_STREAM	12
    130 #define AUDIO_ENCODING_MPEG_L1_PACKETS	13
    131 #define AUDIO_ENCODING_MPEG_L1_SYSTEM	14
    132 #define AUDIO_ENCODING_MPEG_L2_STREAM	15
    133 #define AUDIO_ENCODING_MPEG_L2_PACKETS	16
    134 #define AUDIO_ENCODING_MPEG_L2_SYSTEM	17
    135 #define AUDIO_ENCODING_AC3		18
    136 
    137 /* XXX Consider whether to export to userland? */
    138 #if defined(_KERNEL)
    139 #if BYTE_ORDER == LITTLE_ENDIAN
    140 #define AUDIO_ENCODING_SLINEAR_NE AUDIO_ENCODING_SLINEAR_LE
    141 #define AUDIO_ENCODING_ULINEAR_NE AUDIO_ENCODING_ULINEAR_LE
    142 #define AUDIO_ENCODING_SLINEAR_OE AUDIO_ENCODING_SLINEAR_BE
    143 #define AUDIO_ENCODING_ULINEAR_OE AUDIO_ENCODING_ULINEAR_BE
    144 #else
    145 #define AUDIO_ENCODING_SLINEAR_NE AUDIO_ENCODING_SLINEAR_BE
    146 #define AUDIO_ENCODING_ULINEAR_NE AUDIO_ENCODING_ULINEAR_BE
    147 #define AUDIO_ENCODING_SLINEAR_OE AUDIO_ENCODING_SLINEAR_LE
    148 #define AUDIO_ENCODING_ULINEAR_OE AUDIO_ENCODING_ULINEAR_LE
    149 #endif
    150 #endif /* _KERNEL */
    151 
    152 typedef struct audio_encoding {
    153 	int	index;
    154 	char	name[MAX_AUDIO_DEV_LEN];
    155 	int	encoding;
    156 	int	precision;
    157 	int	flags;
    158 #define AUDIO_ENCODINGFLAG_EMULATED 1 /* software emulation mode */
    159 } audio_encoding_t;
    160 
    161 struct audio_format {
    162 	/**
    163 	 * Device-dependent audio drivers may use this field freely.
    164 	 */
    165 	void *driver_data;
    166 
    167 	/**
    168 	 * combination of AUMODE_PLAY and AUMODE_RECORD
    169 	 */
    170 	int32_t mode;
    171 
    172 	/**
    173 	 * Encoding type.  AUDIO_ENCODING_*.
    174 	 * Don't use AUDIO_ENCODING_SLINEAR/ULINEAR/LINEAR/LINEAR8
    175 	 */
    176 	u_int encoding;
    177 
    178 	/**
    179 	 * The size of valid bits in one sample.
    180 	 * It must be <= precision.
    181 	 */
    182 	u_int validbits;
    183 
    184 	/**
    185 	 * The bit size of one sample.
    186 	 * It must be >= validbits, and is usually a multiple of 8.
    187 	 */
    188 	u_int precision;
    189 
    190 	/**
    191 	 * The number of channels.  >= 1
    192 	 */
    193 	u_int channels;
    194 
    195 	u_int channel_mask;
    196 #define	AUFMT_UNKNOWN_POSITION		0U
    197 #define	AUFMT_FRONT_LEFT		0x00001U /* USB audio compatible */
    198 #define	AUFMT_FRONT_RIGHT		0x00002U /* USB audio compatible */
    199 #define	AUFMT_FRONT_CENTER		0x00004U /* USB audio compatible */
    200 #define	AUFMT_LOW_FREQUENCY		0x00008U /* USB audio compatible */
    201 #define	AUFMT_BACK_LEFT			0x00010U /* USB audio compatible */
    202 #define	AUFMT_BACK_RIGHT		0x00020U /* USB audio compatible */
    203 #define	AUFMT_FRONT_LEFT_OF_CENTER	0x00040U /* USB audio compatible */
    204 #define	AUFMT_FRONT_RIGHT_OF_CENTER	0x00080U /* USB audio compatible */
    205 #define	AUFMT_BACK_CENTER		0x00100U /* USB audio compatible */
    206 #define	AUFMT_SIDE_LEFT			0x00200U /* USB audio compatible */
    207 #define	AUFMT_SIDE_RIGHT		0x00400U /* USB audio compatible */
    208 #define	AUFMT_TOP_CENTER		0x00800U /* USB audio compatible */
    209 #define	AUFMT_TOP_FRONT_LEFT		0x01000U
    210 #define	AUFMT_TOP_FRONT_CENTER		0x02000U
    211 #define	AUFMT_TOP_FRONT_RIGHT		0x04000U
    212 #define	AUFMT_TOP_BACK_LEFT		0x08000U
    213 #define	AUFMT_TOP_BACK_CENTER		0x10000U
    214 #define	AUFMT_TOP_BACK_RIGHT		0x20000U
    215 
    216 #define	AUFMT_MONAURAL		AUFMT_FRONT_CENTER
    217 #define	AUFMT_STEREO		(AUFMT_FRONT_LEFT | AUFMT_FRONT_RIGHT)
    218 #define	AUFMT_SURROUND4		(AUFMT_STEREO | AUFMT_BACK_LEFT \
    219 				| AUFMT_BACK_RIGHT)
    220 #define	AUFMT_DOLBY_5_1		(AUFMT_SURROUND4 | AUFMT_FRONT_CENTER \
    221 				| AUFMT_LOW_FREQUENCY)
    222 
    223 	/**
    224 	 * 0: frequency[0] is lower limit, and frequency[1] is higher limit.
    225 	 * 1-16: frequency[0] to frequency[frequency_type-1] are valid.
    226 	 */
    227 	u_int frequency_type;
    228 
    229 #define	AUFMT_MAX_FREQUENCIES	16
    230 	/**
    231 	 * sampling rates
    232 	 */
    233 	u_int frequency[AUFMT_MAX_FREQUENCIES];
    234 
    235 	/**
    236 	 * 0-3: priority.  0 is the lowest.
    237 	 * -1: hardware supports this format but driver doesn't (e.g. AC3).
    238 	 */
    239 	int priority;
    240 };
    241 
    242 typedef struct audio_format_query {
    243 	u_int	index;
    244 	struct audio_format fmt;
    245 } audio_format_query_t;
    246 
    247 /*
    248  * Balance settings.
    249  */
    250 #define	AUDIO_LEFT_BALANCE	0	/* left channel only	*/
    251 #define	AUDIO_MID_BALANCE	32	/* equal left/right channel */
    252 #define	AUDIO_RIGHT_BALANCE	64	/* right channel only	*/
    253 #define	AUDIO_BALANCE_SHIFT	3
    254 
    255 /*
    256  * Output ports
    257  */
    258 #define	AUDIO_SPEAKER		0x01	/* built-in speaker */
    259 #define	AUDIO_HEADPHONE		0x02	/* headphone jack */
    260 #define	AUDIO_LINE_OUT		0x04	/* line out	 */
    261 #define	VC_OUT			0x08	/* virt chan out */
    262 
    263 /*
    264  * Input ports
    265  */
    266 #define	AUDIO_MICROPHONE	0x01	/* microphone */
    267 #define	AUDIO_LINE_IN		0x02	/* line in	 */
    268 #define	AUDIO_CD		0x04	/* on-board CD inputs */
    269 #define	AUDIO_INTERNAL_CD_IN	AUDIO_CD	/* internal CDROM */
    270 #define	VC_IN			0x08	/* virt chan in */
    271 
    272 /*
    273  * Audio device operations
    274  */
    275 #define AUDIO_GETINFO	_IOR('A', 21, struct audio_info)
    276 #define AUDIO_SETINFO	_IOWR('A', 22, struct audio_info)
    277 #define AUDIO_DRAIN	_IO('A', 23)
    278 #define AUDIO_FLUSH	_IO('A', 24)
    279 #define AUDIO_WSEEK	_IOR('A', 25, u_long)
    280 #define AUDIO_RERROR	_IOR('A', 26, int)
    281 #define AUDIO_GETDEV	_IOR('A', 27, struct audio_device)
    282 #define AUDIO_GETENC	_IOWR('A', 28, struct audio_encoding)
    283 #define AUDIO_GETFD	_IOR('A', 29, int)
    284 #define AUDIO_SETFD	_IOWR('A', 30, int)
    285 #define AUDIO_PERROR	_IOR('A', 31, int)
    286 #define AUDIO_GETIOFFS	_IOR('A', 32, struct audio_offset)
    287 #define AUDIO_GETOOFFS	_IOR('A', 33, struct audio_offset)
    288 #define AUDIO_GETPROPS	_IOR('A', 34, int)
    289 #define  AUDIO_PROP_FULLDUPLEX	0x01
    290 #define  AUDIO_PROP_MMAP	0x02
    291 #define  AUDIO_PROP_INDEPENDENT	0x04
    292 #define  AUDIO_PROP_PLAYBACK	0x10
    293 #define  AUDIO_PROP_CAPTURE	0x20
    294 #define AUDIO_GETBUFINFO	_IOR('A', 35, struct audio_info)
    295 #define AUDIO_SETCHAN	_IOW('A', 36, int)
    296 #define AUDIO_GETCHAN	_IOR('A', 37, int)
    297 #define AUDIO_QUERYFORMAT	_IOWR('A', 38, struct audio_format_query)
    298 #define AUDIO_GETFORMAT	_IOR('A', 39, struct audio_info)
    299 #define AUDIO_SETFORMAT	_IOW('A', 40, struct audio_info)
    300 
    301 /*
    302  * Mixer device
    303  */
    304 #define AUDIO_MIN_GAIN	0
    305 #define AUDIO_MAX_GAIN	255
    306 
    307 typedef struct mixer_level {
    308 	int num_channels;
    309 	u_char level[8];	/* [num_channels] */
    310 } mixer_level_t;
    311 #define AUDIO_MIXER_LEVEL_MONO	0
    312 #define AUDIO_MIXER_LEVEL_LEFT	0
    313 #define AUDIO_MIXER_LEVEL_RIGHT	1
    314 
    315 /*
    316  * Device operations
    317  */
    318 
    319 typedef struct audio_mixer_name {
    320 	char name[MAX_AUDIO_DEV_LEN];
    321 	int msg_id;
    322 } audio_mixer_name_t;
    323 
    324 typedef struct mixer_devinfo {
    325 	int index;
    326 	audio_mixer_name_t label;
    327 	int type;
    328 #define AUDIO_MIXER_CLASS	0
    329 #define AUDIO_MIXER_ENUM	1
    330 #define AUDIO_MIXER_SET		2
    331 #define AUDIO_MIXER_VALUE	3
    332 	int mixer_class;
    333 	int next, prev;
    334 #define AUDIO_MIXER_LAST	-1
    335 	union {
    336 		struct audio_mixer_enum {
    337 			int num_mem;
    338 			struct {
    339 				audio_mixer_name_t label;
    340 				int ord;
    341 			} member[32];
    342 		} e;
    343 		struct audio_mixer_set {
    344 			int num_mem;
    345 			struct {
    346 				audio_mixer_name_t label;
    347 				int mask;
    348 			} member[32];
    349 		} s;
    350 		struct audio_mixer_value {
    351 			audio_mixer_name_t units;
    352 			int num_channels;
    353 			int delta;
    354 		} v;
    355 	} un;
    356 } mixer_devinfo_t;
    357 
    358 
    359 typedef struct mixer_ctrl {
    360 	int dev;
    361 	int type;
    362 	union {
    363 		int ord;		/* enum */
    364 		int mask;		/* set */
    365 		mixer_level_t value;	/* value */
    366 	} un;
    367 } mixer_ctrl_t;
    368 
    369 /*
    370  * Mixer operations
    371  */
    372 #define AUDIO_MIXER_READ		_IOWR('M', 0, mixer_ctrl_t)
    373 #define AUDIO_MIXER_WRITE		_IOWR('M', 1, mixer_ctrl_t)
    374 #define AUDIO_MIXER_DEVINFO		_IOWR('M', 2, mixer_devinfo_t)
    375 
    376 /*
    377  * Well known device names
    378  */
    379 #define AudioNmicrophone	"mic"
    380 #define AudioNline	"line"
    381 #define AudioNcd	"cd"
    382 #define AudioNdac	"dac"
    383 #define AudioNaux	"aux"
    384 #define AudioNrecord	"record"
    385 #define AudioNvolume	"volume"
    386 #define AudioNmonitor	"monitor"
    387 #define AudioNtreble	"treble"
    388 #define AudioNmid	"mid"
    389 #define AudioNbass	"bass"
    390 #define AudioNbassboost	"bassboost"
    391 #define AudioNspeaker	"speaker"
    392 #define AudioNheadphone	"headphones"
    393 #define AudioNoutput	"output"
    394 #define AudioNinput	"input"
    395 #define AudioNmaster	"master"
    396 #define AudioNstereo	"stereo"
    397 #define AudioNmono	"mono"
    398 #define AudioNloudness	"loudness"
    399 #define AudioNspatial	"spatial"
    400 #define AudioNsurround	"surround"
    401 #define AudioNpseudo	"pseudo"
    402 #define AudioNmute	"mute"
    403 #define AudioNenhanced	"enhanced"
    404 #define AudioNpreamp	"preamp"
    405 #define AudioNon	"on"
    406 #define AudioNoff	"off"
    407 #define AudioNmode	"mode"
    408 #define AudioNsource	"source"
    409 #define AudioNfmsynth	"fmsynth"
    410 #define AudioNwave	"wave"
    411 #define AudioNmidi	"midi"
    412 #define AudioNmixerout	"mixerout"
    413 #define AudioNswap	"swap"	/* swap left and right channels */
    414 #define AudioNagc	"agc"
    415 #define AudioNdelay	"delay"
    416 #define AudioNselect	"select" /* select destination */
    417 #define AudioNvideo     "video"
    418 #define AudioNcenter    "center"
    419 #define AudioNdepth     "depth"
    420 #define AudioNlfe       "lfe"
    421 
    422 #define AudioEmulaw		"mulaw"
    423 #define AudioEalaw		"alaw"
    424 #define AudioEadpcm		"adpcm"
    425 #define AudioEslinear		"slinear"
    426 #define AudioEslinear_le	"slinear_le"
    427 #define AudioEslinear_be	"slinear_be"
    428 #define AudioEulinear		"ulinear"
    429 #define AudioEulinear_le	"ulinear_le"
    430 #define AudioEulinear_be	"ulinear_be"
    431 #define AudioEmpeg_l1_stream	"mpeg_l1_stream"
    432 #define AudioEmpeg_l1_packets	"mpeg_l1_packets"
    433 #define AudioEmpeg_l1_system	"mpeg_l1_system"
    434 #define AudioEmpeg_l2_stream	"mpeg_l2_stream"
    435 #define AudioEmpeg_l2_packets	"mpeg_l2_packets"
    436 #define AudioEmpeg_l2_system	"mpeg_l2_system"
    437 #define AudioEac3		"ac3"
    438 
    439 #define AudioCinputs	"inputs"
    440 #define AudioCoutputs	"outputs"
    441 #define AudioCrecord	"record"
    442 #define AudioCmonitor	"monitor"
    443 #define AudioCequalization	"equalization"
    444 #define AudioCmodem	"modem"
    445 #define AudioCvirtchan	"vchan"
    446 
    447 #endif /* !_SYS_AUDIOIO_H_ */
    448