xref: /netbsd-src/share/man/man4/audio.4 (revision 8b0f9554ff8762542c4defc4f70e1eb76fb508fa)
1.\"	$NetBSD: audio.4,v 1.67 2007/06/13 00:00:23 wiz Exp $
2.\"
3.\" Copyright (c) 1996 The NetBSD Foundation, Inc.
4.\" All rights reserved.
5.\"
6.\" This code is derived from software contributed to The NetBSD Foundation
7.\" by John T. Kohl.
8.\"
9.\" Redistribution and use in source and binary forms, with or without
10.\" modification, are permitted provided that the following conditions
11.\" are met:
12.\" 1. Redistributions of source code must retain the above copyright
13.\"    notice, this list of conditions and the following disclaimer.
14.\" 2. Redistributions in binary form must reproduce the above copyright
15.\"    notice, this list of conditions and the following disclaimer in the
16.\"    documentation and/or other materials provided with the distribution.
17.\" 3. All advertising materials mentioning features or use of this software
18.\"    must display the following acknowledgement:
19.\"        This product includes software developed by the NetBSD
20.\"        Foundation, Inc. and its contributors.
21.\" 4. Neither the name of The NetBSD Foundation nor the names of its
22.\"    contributors may be used to endorse or promote products derived
23.\"    from this software without specific prior written permission.
24.\"
25.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
26.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
27.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28.\" PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
29.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35.\" POSSIBILITY OF SUCH DAMAGE.
36.\"
37.Dd June 11, 2007
38.Dt AUDIO 4
39.Os
40.Sh NAME
41.Nm audio
42.Nd device-independent audio driver layer
43.Sh SYNOPSIS
44.In sys/audioio.h
45.Sh DESCRIPTION
46The
47.Nm
48driver provides support for various audio peripherals.
49It provides a uniform programming interface layer above different
50underlying audio hardware drivers.
51The audio layer provides full-duplex operation if the
52underlying hardware configuration supports it.
53.Pp
54There are four device files available for audio operation:
55.Pa /dev/audio ,
56.Pa /dev/sound ,
57.Pa /dev/audioctl ,
58and
59.Pa /dev/mixer .
60.Pp
61.Pa /dev/audio
62and
63.Pa /dev/sound
64are used for recording or playback of digital samples.
65.Pp
66.Pa /dev/mixer
67is used to manipulate volume, recording source, or other audio mixer
68functions.
69.Pp
70.Pa /dev/audioctl
71accepts the same
72.Xr ioctl 2
73operations as
74.Pa /dev/sound ,
75but no other operations.
76.Pp
77In contrast to
78.Pa /dev/sound
79which has the exclusive open property
80.Pa /dev/audioctl
81can be opened at any time and can be used to manipulate the audio device
82while it is in use.
83.Sh SAMPLING DEVICES
84When
85.Pa /dev/audio
86is opened, it automatically directs the underlying driver to manipulate
87monaural 8-bit mu-law samples.
88In addition, if it is opened read-only
89(write-only) the device is set to half-duplex record (play) mode with
90recording (playing) unpaused and playing (recording) paused.
91When
92.Pa /dev/sound
93is opened, it maintains the previous audio sample mode and
94record/playback mode.
95In all other respects
96.Pa /dev/audio
97and
98.Pa /dev/sound
99are identical.
100.Pp
101Only one process may hold open a sampling device at a given time
102(although file descriptors may be shared between processes once the
103first open completes).
104.Pp
105On a half-duplex device, writes while recording is in progress will be
106immediately discarded.
107Similarly, reads while playback is in progress
108will be filled with silence but delayed to return at the current
109sampling rate.
110If both playback and recording are requested on a half-duplex
111device, playback mode takes precedence and recordings will get silence.
112.Pp
113On a full-duplex device, reads and writes may operate
114concurrently without interference.
115If a full-duplex capable audio device is opened for both reading and writing
116it will start in half-duplex play mode; full-duplex mode has to be set
117explicitly.
118.Pp
119On either type of device, if the playback mode is paused then silence is
120played instead of the provided samples, and if recording is paused then
121the process blocks in
122.Xr read 2
123until recording is unpaused.
124.Pp
125If a writing process does not call
126.Xr write 2
127frequently enough to provide samples at the pace the hardware
128consumes them silence is inserted.
129If the
130.Dv AUMODE_PLAY_ALL
131mode is not set the writing process must
132provide enough data via
133subsequent write calls to
134.Dq catch up
135in time to the current audio
136block before any more process-provided samples will be played.
137If a reading process does not call
138.Xr read 2
139frequently enough, it will simply miss samples.
140.Pp
141The audio device is normally accessed with
142.Xr read 2
143or
144.Xr write 2
145calls, but it can also be mapped into user memory with
146.Xr mmap 2
147(when supported by the device).
148Once the device has been mapped it can no longer be accessed
149by read or write; all access is by reading and writing to
150the mapped memory.
151The device appears as a block of memory
152of size
153.Va buffersize
154(as available via
155.Dv AUDIO_GETINFO
156or
157.Dv AUDIO_GETBUFINFO ) .
158The device driver will continuously move data from this buffer
159from/to the audio hardware, wrapping around at the end of the buffer.
160To find out where the hardware is currently accessing data in the buffer the
161.Dv AUDIO_GETIOFFS
162and
163.Dv AUDIO_GETOOFFS
164calls can be used.
165The playing and recording buffers are distinct and must be
166mapped separately if both are to be used.
167Only encodings that are not emulated (i.e. where
168.Dv AUDIO_ENCODINGFLAG_EMULATED
169is not set) work properly for a mapped device.
170.Pp
171The audio device, like most devices, can be used in
172.Va select ,
173can be set in non-blocking mode and can be set (with a
174.Dv FIOASYNC
175ioctl) to send a
176.Dv SIGIO
177when I/O is possible.
178The mixer device can be set to generate a
179.Dv SIGIO
180whenever a mixer value is changed.
181.Pp
182The following
183.Xr ioctl 2
184commands are supported on the sample devices:
185.Pp
186.Bl -tag -width indent
187.It Dv AUDIO_FLUSH
188This command stops all playback and recording, clears all queued
189buffers, resets error counters, and restarts recording and playback as
190appropriate for the current sampling mode.
191.It Dv AUDIO_RERROR (int)
192This command fetches the count of dropped input samples into its integer
193argument.
194There is no information regarding when in the sample stream
195they were dropped.
196.It Dv AUDIO_WSEEK (int)
197This command fetches the count of samples that are queued ahead of the
198first sample in the most recent sample block written into its integer argument.
199.It Dv AUDIO_DRAIN
200This command suspends the calling process until all queued playback
201samples have been played by the hardware.
202.It Dv AUDIO_GETDEV (audio_device_t)
203This command fetches the current hardware device information into the
204audio_device_t argument.
205.Bd -literal
206typedef struct audio_device {
207        char name[MAX_AUDIO_DEV_LEN];
208        char version[MAX_AUDIO_DEV_LEN];
209        char config[MAX_AUDIO_DEV_LEN];
210} audio_device_t;
211.Ed
212.It Dv AUDIO_GETFD (int)
213The command returns the current setting of the full duplex mode.
214.It Dv AUDIO_GETENC (audio_encoding_t)
215This command is used iteratively to fetch sample encoding names and
216format_ids into the input/output audio_encoding_t argument.
217.Bd -literal
218typedef struct audio_encoding {
219	int index;      /* input: nth encoding */
220	char name[MAX_AUDIO_DEV_LEN]; /* name of encoding */
221	int encoding;   /* value for encoding parameter */
222	int precision;  /* value for precision parameter */
223	int flags;
224#define AUDIO_ENCODINGFLAG_EMULATED 1 /* software emulation mode */
225} audio_encoding_t;
226.Ed
227.Pp
228To query
229all the supported encodings, start with an index field of 0 and
230continue with successive encodings (1, 2, ...) until the command returns
231an error.
232.It Dv AUDIO_SETFD (int)
233This command sets the device into full-duplex operation if its integer
234argument has a non-zero value, or into half-duplex operation if it
235contains a zero value.
236If the device does not support full-duplex
237operation, attempting to set full-duplex mode returns an error.
238.It Dv AUDIO_GETPROPS (int)
239This command gets a bit set of hardware properties.
240If the hardware
241has a certain property the corresponding bit is set, otherwise it is not.
242The properties can have the following values:
243.Pp
244.Bl -tag -width AUDIO_PROP_INDEPENDENT -compact
245.It Dv AUDIO_PROP_FULLDUPLEX
246the device admits full duplex operation.
247.It Dv AUDIO_PROP_MMAP
248the device can be used with
249.Xr mmap 2 .
250.It Dv AUDIO_PROP_INDEPENDENT
251the device can set the playing and recording encoding parameters
252independently.
253.El
254.It Dv AUDIO_GETIOFFS (audio_offset_t)
255.It Dv AUDIO_GETOOFFS (audio_offset_t)
256This command fetches the current offset in the input(output) buffer where
257the audio hardware's DMA engine will be putting(getting) data.
258It mostly useful when the device
259buffer is available in user space via the
260.Xr mmap 2
261call.
262The information is returned in the audio_offset structure.
263.Bd -literal
264typedef struct audio_offset {
265	u_int	samples;   /* Total number of bytes transferred */
266	u_int	deltablks; /* Blocks transferred since last checked */
267	u_int	offset;    /* Physical transfer offset in buffer */
268} audio_offset_t;
269.Ed
270.It Dv AUDIO_GETINFO (audio_info_t)
271.It Dv AUDIO_GETBUFINFO (audio_info_t)
272.It Dv AUDIO_SETINFO (audio_info_t)
273Get or set audio information as encoded in the audio_info structure.
274.Bd -literal
275typedef struct audio_info {
276	struct	audio_prinfo play;   /* info for play (output) side */
277	struct	audio_prinfo record; /* info for record (input) side */
278        u_int	monitor_gain;			/* input to output mix */
279	/* BSD extensions */
280	u_int	blocksize;	/* H/W read/write block size */
281	u_int	hiwat;		/* output high water mark */
282	u_int	lowat;		/* output low water mark */
283	u_int	_ispare1;
284	u_int	mode;		/* current device mode */
285#define AUMODE_PLAY	0x01
286#define AUMODE_RECORD	0x02
287#define AUMODE_PLAY_ALL 0x04	/* do not do real-time correction */
288} audio_info_t;
289.Ed
290.Pp
291When setting the current state with
292.Dv AUDIO_SETINFO ,
293the audio_info structure should first be initialized with
294.Dv AUDIO_INITINFO Po \*[Am]info Pc
295and then the particular values to be changed should be set.
296This allows the audio driver to only set those things that you wish
297to change and eliminates the need to query the device with
298.Dv AUDIO_GETINFO
299or
300.Dv AUDIO_GETBUFINFO
301first.
302.Pp
303The
304.Va mode
305field should be set to
306.Dv AUMODE_PLAY ,
307.Dv AUMODE_RECORD ,
308.Dv AUMODE_PLAY_ALL ,
309or a bitwise OR combination of the three.
310Only full-duplex audio devices support
311simultaneous record and playback.
312.Pp
313.Va hiwat
314and
315.Va lowat
316are used to control write behavior.
317Writes to the audio devices will queue up blocks until the high-water
318mark is reached, at which point any more write calls will block
319until the queue is drained to the low-water mark.
320.Va hiwat
321and
322.Va lowat
323set those high- and low-water marks (in audio blocks).
324The default for
325.Va hiwat
326is the maximum value and for
327.Va lowat
32875 % of
329.Va hiwat .
330.Pp
331.Va blocksize
332sets the current audio blocksize.
333The generic audio driver layer and the hardware driver have the
334opportunity to adjust this block size to get it within
335implementation-required limits.
336Upon return from an
337.Dv AUDIO_SETINFO
338call, the actual blocksize set is returned in this field.
339Normally the
340.Va blocksize
341is calculated to correspond to 50ms of sound and it is recalculated
342when the encoding parameter changes, but if the
343.Va blocksize
344is set explicitly this value becomes sticky, i.e., it remains
345even when the encoding is changed.
346The stickiness can be cleared by reopening the device or setting the
347.Va blocksize
348to 0.
349.Bd -literal
350struct audio_prinfo {
351	u_int	sample_rate;	/* sample rate in samples/s */
352	u_int	channels;	/* number of channels, usually 1 or 2 */
353	u_int	precision;	/* number of bits/sample */
354	u_int	encoding;	/* data encoding (AUDIO_ENCODING_* below) */
355	u_int	gain;		/* volume level */
356	u_int	port;		/* selected I/O port */
357	u_long	seek;		/* BSD extension */
358	u_int	avail_ports;	/* available I/O ports */
359	u_int	buffer_size;	/* total size audio buffer */
360	u_int	_ispare[1];
361	/* Current state of device: */
362	u_int	samples;	/* number of samples */
363	u_int	eof;		/* End Of File (zero-size writes) counter */
364	u_char	pause;		/* non-zero if paused, zero to resume */
365	u_char	error;		/* non-zero if underflow/overflow occurred */
366	u_char	waiting;	/* non-zero if another process hangs in open */
367	u_char	balance;	/* stereo channel balance */
368	u_char	cspare[2];
369	u_char	open;		/* non-zero if currently open */
370	u_char	active;		/* non-zero if I/O is currently active */
371};
372.Ed
373.Pp
374Note:  many hardware audio drivers require identical playback and
375recording sample rates, sample encodings, and channel counts.
376The playing information is always set last and will prevail on such hardware.
377If the hardware can handle different settings the
378.Dv AUDIO_PROP_INDEPENDENT
379property is set.
380.Pp
381The encoding parameter can have the following values:
382.Pp
383.Bl -tag -width AUDIO_ENCODING_SLINEAR_BE -compact
384.It Dv AUDIO_ENCODING_ULAW
385mu-law encoding, 8 bits/sample
386.It Dv AUDIO_ENCODING_ALAW
387A-law encoding, 8 bits/sample
388.It Dv AUDIO_ENCODING_SLINEAR
389two's complement signed linear encoding with the platform byte order
390.It Dv AUDIO_ENCODING_ULINEAR
391unsigned linear encoding with the platform byte order
392.It Dv AUDIO_ENCODING_ADPCM
393ADPCM encoding, 8 bits/sample
394.It Dv AUDIO_ENCODING_SLINEAR_LE
395two's complement signed linear encoding with little endian byte order
396.It Dv AUDIO_ENCODING_SLINEAR_BE
397two's complement signed linear encoding with big endian byte order
398.It Dv AUDIO_ENCODING_ULINEAR_LE
399unsigned linear encoding with little endian byte order
400.It Dv AUDIO_ENCODING_ULINEAR_BE
401unsigned linear encoding with big endian byte order
402.El
403.Pp
404The
405.Va gain ,
406.Va port
407and
408.Va balance
409settings provide simple shortcuts to the richer mixer
410interface described below and are not obtained by
411.Dv AUDIO_GETBUFINFO .
412The gain should be in the range
413.Bq Dv AUDIO_MIN_GAIN , Dv AUDIO_MAX_GAIN
414and the balance in the range
415.Bq Dv AUDIO_LEFT_BALANCE , Dv AUDIO_RIGHT_BALANCE
416with the normal setting at
417.Dv AUDIO_MID_BALANCE .
418.Pp
419The input port should be a combination of:
420.Pp
421.Bl -tag -width AUDIO_MICROPHONE -compact
422.It Dv AUDIO_MICROPHONE
423to select microphone input.
424.It Dv AUDIO_LINE_IN
425to select line input.
426.It Dv AUDIO_CD
427to select CD input.
428.El
429.Pp
430The output port should be a combination of:
431.Pp
432.Bl -tag -width AUDIO_HEADPHONE -compact
433.It Dv AUDIO_SPEAKER
434to select speaker output.
435.It Dv AUDIO_HEADPHONE
436to select headphone output.
437.It Dv AUDIO_LINE_OUT
438to select line output.
439.El
440.Pp
441The available ports can be found in
442.Va avail_ports
443.Dv ( AUDIO_GETBUFINFO
444only).
445.Pp
446.Va buffer_size
447is the total size of the audio buffer.
448The buffer size divided by the
449.Va blocksize
450gives the maximum value for
451.Va hiwat .
452Currently the
453.Va buffer_size
454can only be read and not set.
455.Pp
456The
457.Va seek
458and
459.Va samples
460fields are only used by
461.Dv AUDIO_GETINFO
462and
463.Dv AUDIO_GETBUFINFO .
464.Va seek
465represents the count of
466samples pending;
467.Va samples
468represents the total number of bytes recorded or played, less those
469that were dropped due to inadequate consumption/production rates.
470.Pp
471.Va pause
472returns the current pause/unpause state for recording or playback.
473For
474.Dv AUDIO_SETINFO ,
475if the pause value is specified it will either pause
476or unpause the particular direction.
477.El
478.Sh MIXER DEVICE
479The mixer device,
480.Pa /dev/mixer ,
481may be manipulated with
482.Xr ioctl 2
483but does not support
484.Xr read 2
485or
486.Xr write 2 .
487It supports the following
488.Xr ioctl 2
489commands:
490.Bl -tag -width indent
491.It Dv AUDIO_GETDEV (audio_device_t)
492This command is the same as described above for the sampling devices.
493.It Dv AUDIO_MIXER_READ (mixer_ctrl_t)
494.It Dv AUDIO_MIXER_WRITE (mixer_ctrl_t)
495These commands read the current mixer state or set new mixer state for
496the specified device
497.Va dev .
498.Va type
499identifies which type of value is supplied in the
500.Va mixer_ctrl_t
501argument.
502.Bd -literal
503#define AUDIO_MIXER_CLASS  0
504#define AUDIO_MIXER_ENUM   1
505#define AUDIO_MIXER_SET    2
506#define AUDIO_MIXER_VALUE  3
507typedef struct mixer_ctrl {
508	int dev;			/* input: nth device */
509	int type;
510	union {
511		int ord;		/* enum */
512		int mask;		/* set */
513		mixer_level_t value;	/* value */
514	} un;
515} mixer_ctrl_t;
516
517#define AUDIO_MIN_GAIN  0
518#define AUDIO_MAX_GAIN  255
519typedef struct mixer_level {
520        int num_channels;
521        u_char level[8];               /* [num_channels] */
522} mixer_level_t;
523#define AUDIO_MIXER_LEVEL_MONO  0
524#define AUDIO_MIXER_LEVEL_LEFT  0
525#define AUDIO_MIXER_LEVEL_RIGHT 1
526.Ed
527.Pp
528For a mixer value, the
529.Va value
530field specifies both the number of channels and the values for each
531channel.
532If the channel count does not match the current channel count, the
533attempt to change the setting may fail (depending on the hardware
534device driver implementation).
535For an enumeration value, the
536.Va ord
537field should be set to one of the possible values as returned by a prior
538.Dv AUDIO_MIXER_DEVINFO
539command.
540The type
541.Dv AUDIO_MIXER_CLASS
542is only used for classifying particular mixer device
543types and is not used for
544.Dv AUDIO_MIXER_READ
545or
546.Dv AUDIO_MIXER_WRITE .
547.It Dv AUDIO_MIXER_DEVINFO (mixer_devinfo_t)
548This command is used iteratively to fetch audio mixer device information
549into the input/output mixer_devinfo_t argument.
550To query all the supported devices, start with an index field of
5510 and continue with successive devices (1, 2, ...) until the
552command returns an error.
553.Bd -literal
554typedef struct mixer_devinfo {
555	int index;		/* input: nth mixer device */
556	audio_mixer_name_t label;
557	int type;
558	int mixer_class;
559	int next, prev;
560#define AUDIO_MIXER_LAST	-1
561	union {
562		struct audio_mixer_enum {
563			int num_mem;
564			struct {
565				audio_mixer_name_t label;
566				int ord;
567			} member[32];
568		} e;
569		struct audio_mixer_set {
570			int num_mem;
571			struct {
572				audio_mixer_name_t label;
573				int mask;
574			} member[32];
575		} s;
576		struct audio_mixer_value {
577			audio_mixer_name_t units;
578			int num_channels;
579			int delta;
580		} v;
581	} un;
582} mixer_devinfo_t;
583.Ed
584.Pp
585The
586.Va label
587field identifies the name of this particular mixer control.
588The
589.Va index
590field may be used as the
591.Va dev
592field in
593.Dv AUDIO_MIXER_READ
594and
595.Dv AUDIO_MIXER_WRITE
596commands.
597The
598.Va type
599field identifies the type of this mixer control.
600Enumeration types are typically used for on/off style controls (e.g. a
601mute control) or for input/output device selection (e.g. select
602recording input source from CD, line in, or microphone).
603Set types are similar to enumeration types but any combination
604of the mask bits can be used.
605.Pp
606The
607.Va mixer_class
608field identifies what class of control this is.
609The
610.Pq arbitrary
611value set by the hardware driver may be determined by examining the
612.Va mixer_class
613field of the class itself,
614a mixer of type
615.Dv AUDIO_MIXER_CLASS .
616For example, a mixer controlling the input gain on the line in circuit
617would have a
618.Va mixer_class
619that matches an input class device with the name
620.Dq inputs
621.Dv ( AudioCinputs ) ,
622and would have a
623.Va label
624of
625.Dq line
626.Dv ( AudioNline ) .
627Mixer controls which control audio circuitry for a particular audio
628source (e.g. line-in, CD in, DAC output) are collected under the input class,
629while those which control all audio sources (e.g. master volume,
630equalization controls) are under the output class.
631Hardware devices capable of recording typically also have a record class,
632for controls that only affect recording,
633and also a monitor class.
634.Pp
635The
636.Va next
637and
638.Va prev
639may be used by the hardware device driver to provide hints for the next
640and previous devices in a related set (for example, the line in level
641control would have the line in mute as its
642.Dq next
643value).
644If there is no relevant next or previous value,
645.Dv AUDIO_MIXER_LAST
646is specified.
647.Pp
648For
649.Dv AUDIO_MIXER_ENUM
650mixer control types,
651the enumeration values and their corresponding names are filled in.
652For example, a mute control would return appropriate values paired with
653.Dv AudioNon
654and
655.Dv AudioNoff .
656For
657.Dv AUDIO_MIXER_VALUE
658and
659.Dv AUDIO_MIXER_SET
660mixer control types, the channel count is
661returned; the units name specifies what the level controls (typical
662values are
663.Dv AudioNvolume ,
664.Dv AudioNtreble ,
665.Dv AudioNbass ) .
666.\" For AUDIO_MIXER_SET mixer control types, what is what?
667.El
668.Pp
669By convention, all the mixer devices can be distinguished from other
670mixer controls because they use a name from one of the
671.Dv AudioC*
672string values.
673.Sh FILES
674.Bl -tag -width /dev/audioctl -compact
675.It Pa /dev/audio
676.It Pa /dev/audioctl
677.It Pa /dev/sound
678.It Pa /dev/mixer
679.El
680.Sh SEE ALSO
681.Xr audioctl 1 ,
682.Xr mixerctl 1 ,
683.Xr ioctl 2 ,
684.Xr ossaudio 3 ,
685.Xr midi 4 ,
686.Xr radio 4
687.Ss ISA bus
688.Xr aria 4 ,
689.Xr ess 4 ,
690.Xr gus 4 ,
691.Xr guspnp 4 ,
692.Xr pas 4 ,
693.Xr sb 4 ,
694.Xr wss 4 ,
695.Xr ym 4
696.Ss PCI bus
697.Xr auacer 4 ,
698.Xr auich 4 ,
699.Xr auixp 4 ,
700.Xr autri 4 ,
701.Xr auvia 4 ,
702.Xr azalia 4 ,
703.Xr clcs 4 ,
704.Xr clct 4 ,
705.Xr cmpci 4 ,
706.Xr eap 4 ,
707.Xr emuxki 4 ,
708.Xr esa 4 ,
709.Xr esm 4 ,
710.Xr eso 4 ,
711.Xr fms 4 ,
712.Xr neo 4 ,
713.Xr sv 4 ,
714.Xr yds 4
715.Ss PCMCIA
716.Xr esl 4
717.Ss TURBOchannel
718.Xr bba 4
719.Ss USB
720.Xr uaudio 4
721.Sh BUGS
722If the device is used in
723.Xr mmap 2
724it is currently always mapped for writing (playing) due to
725VM system weirdness.
726