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