1.\" $NetBSD: audio.9,v 1.27 2004/01/31 21:33:08 wiz Exp $ 2.\" 3.\" Copyright (c) 1999, 2000 The NetBSD Foundation, Inc. 4.\" All rights reserved. 5.\" 6.\" This code is derived from software contributed to The NetBSD Foundation 7.\" by Lennart Augustsson. 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 January 31, 2004 38.Dt AUDIO 9 39.Os 40.Sh NAME 41.Nm audio 42.Nd interface between low and high level audio drivers 43.Sh DESCRIPTION 44The audio device driver is divided into a high level, 45hardware independent layer, and a low level hardware 46dependent layer. 47The interface between these is the 48.Va audio_hw_if 49structure. 50.Bd -literal 51struct audio_hw_if { 52 int (*open)(void *, int); 53 void (*close)(void *); 54 int (*drain)(void *); 55 56 int (*query_encoding)(void *, struct audio_encoding *); 57 int (*set_params)(void *, int, int, 58 struct audio_params *, struct audio_params *); 59 int (*round_blocksize)(void *, int); 60 61 int (*commit_settings)(void *); 62 63 int (*init_output)(void *, void *, int); 64 int (*init_input)(void *, void *, int); 65 int (*start_output)(void *, void *, int, void (*)(void *), 66 void *); 67 int (*start_input)(void *, void *, int, void (*)(void *), 68 void *); 69 int (*halt_output)(void *); 70 int (*halt_input)(void *); 71 72 int (*speaker_ctl)(void *, int); 73#define SPKR_ON 1 74#define SPKR_OFF 0 75 76 int (*getdev)(void *, struct audio_device *); 77 int (*setfd)(void *, int); 78 79 int (*set_port)(void *, mixer_ctrl_t *); 80 int (*get_port)(void *, mixer_ctrl_t *); 81 82 int (*query_devinfo)(void *, mixer_devinfo_t *); 83 84 void *(*allocm)(void *, int, size_t, struct malloc_type *, int); 85 void (*freem)(void *, void *, struct malloc_type *); 86 size_t (*round_buffersize)(void *, int, size_t); 87 paddr_t (*mappage)(void *, void *, off_t, int); 88 89 int (*get_props)(void *); 90 91 int (*trigger_output)(void *, void *, void *, int, 92 void (*)(void *), void *, struct audio_params *); 93 int (*trigger_input)(void *, void *, void *, int, 94 void (*)(void *), void *, struct audio_params *); 95 int (*dev_ioctl)(void *, u_long, caddr_t, int, struct proc *); 96}; 97 98struct audio_params { 99 u_long sample_rate; /* sample rate */ 100 u_int encoding; /* mu-law, linear, etc */ 101 u_int precision; /* bits/sample */ 102 u_int channels; /* mono(1), stereo(2) */ 103 /* Software en/decode functions, set if SW coding required by HW */ 104 void (*sw_code)(void *, u_char *, int); 105 int factor; /* coding space change */ 106 int factor_denom; /* denominator of factor */ 107 /* 108 * The following four members represent what format is used in a 109 * hardware. If hw_sample_rate != sample_rate || hw_channels != 110 * channels, the audio framework converts data. Encoding and 111 * precision are converted in sw_code(). 112 * set_params() should set correct values to them if no conversion is 113 * needed. 114 */ 115 u_long hw_sample_rate; 116 u_int hw_encoding; 117 u_int hw_precision; 118 u_int hw_channels; 119}; 120.Ed 121.Pp 122The high level audio driver attaches to the low level driver 123when the latter calls 124.Va audio_attach_mi . 125This call should be 126.Bd -literal 127 void 128 audio_attach_mi(ahwp, hdl, dev) 129 struct audio_hw_if *ahwp; 130 void *hdl; 131 struct device *dev; 132.Ed 133.Pp 134The 135.Va audio_hw_if 136struct is as shown above. 137The 138.Va hdl 139argument is a handle to some low level data structure. 140It is sent as the first argument to all the functions 141in 142.Va audio_hw_if 143when the high level driver calls them. 144.Va dev 145is the device struct for the hardware device. 146.Pp 147The upper layer of the audio driver allocates one buffer for playing 148and one for recording. 149It handles the buffering of data from the user processes in these. 150The data is presented to the lower level in smaller chunks, called blocks. 151If there, during playback, is no data available from the user process when 152the hardware request another block a block of silence will be used instead. 153Furthermore, if the user process does not read data quickly enough during 154recording data will be thrown away. 155.Pp 156The fields of 157.Va audio_hw_if 158are described in some more detail below. 159Some fields are optional and can be set to 0 if not needed. 160.Bl -tag -width indent 161.It Dv int open(void *hdl, int flags) 162is called when the audio device is opened. 163It should initialize the hardware for I/O. 164Every successful call to 165.Va open 166is matched by a call to 167.Va close . 168Return 0 on success, otherwise an error code. 169.It Dv void close(void *hdl) 170is called when the audio device is closed. 171.It Dv int drain(void *hdl) 172optional, is called before the device is closed or when 173.Dv AUDIO_DRAIN 174is called. 175It should make sure that no samples remain in to be played that could 176be lost when 177.Va close 178is called. 179Return 0 on success, otherwise an error code. 180.It Dv int query_encoding(void *hdl, struct audio_encoding *ae) 181is used when 182.Dv AUDIO_GETENC 183is called. 184It should fill the 185.Va audio_encoding 186structure and return 0 or, if there is no encoding with the 187given number, return EINVAL. 188.It Dv int set_params(void *hdl, int setmode, int usemode, 189.Dv "struct audio_params *play, struct audio_params *rec)" 190.br 191Called to set the audio encoding mode. 192.Va setmode 193is a combination of the 194.Dv AUMODE_RECORD 195and 196.Dv AUMODE_PLAY 197flags to indicate which mode(s) are to be set. 198.Va usemode 199is also a combination of these flags, but indicates the current 200mode of the device (i.e., the value of 201.Va mode 202in the 203.Va audio_info 204struct). 205The 206.Va play 207and 208.Va rec 209structures contain the encoding parameters that should be set. 210.Pp 211If the hardware requires software assistance with some encoding 212(e.g., it might be lacking mu-law support) it should fill the 213.Va sw_code , 214.Va factor 215and 216.Va factor_denom 217fields of these structures with translation information, and 218set to hw_* fields what format the hardware actually uses. 219For example, if 220.Va play 221requests [8000Hz, mu-law, 8bit, 1ch] and the hardware supports 222not 8bit mu-law but 16bit slinear_le, the driver should set 223.Va mulaw_to_slinear16_le 224to 225.Va sw_code , 2262 to 227.Va factor , 2281 to 229.Va factor_denom , 230.Dv AUDIO_ENCODING_SLINEAR_LE 231to 232.Va hw_encoding 233and 16 to 234.Va hw_precision . 235The values of the structures may also be modified if the hardware 236cannot be set to exactly the requested mode (e.g., if the requested 237sampling rate is not supported, but one close enough is). 238.Pp 239The hardware driver can also request sampling rate conversion 240and mono-stereo conversion. 241If 242.Va set_params 243sets to 244.Va hw_sampling_rate 245a value which is different than 246.Va sampling_rate 247or sets to 248.Va hw_channels 249a value which is different than 250.Va channels , 251and set 252.Dv AUDIO_ENCODING_SLINEAR_LE 253to 254.Va hw_encoding , 255the hardware independent driver performs sampling rate and/or mono-stereo 256conversion. 257If such conversion is not needed, 258.Va set_params 259must keep 260.Va sampling_rate 261and 262.Va channels 263are the same as 264.Va hw_sampling_rate 265and 266.Va hw_channels 267respectively. 268.Pp 269Note: The order of conversion is 270.Va sw_code 271followed by sampling rate and mono-stereo in playing, 272and sampling rate and mono-stereo followed by 273.Va sw_code 274in recording. 275.Pp 276If the device does not have the 277.Dv AUDIO_PROP_INDEPENDENT 278property the same value is passed in both 279.Va play 280and 281.Va rec 282and the encoding parameters from 283.Va play 284is copied into 285.Va rec 286after the call to 287.Va set_params . 288Return 0 on success, otherwise an error code. 289.It Dv int round_blocksize(void *hdl, int bs) 290optional, is called with the block size, 291.Va bs , 292that has been computed by the upper layer. 293It should return a block size, possibly changed according to the needs 294of the hardware driver. 295.It Dv int commit_settings(void *hdl) 296optional, is called after all calls to 297.Va set_params , 298and 299.Va set_port , 300are done. 301A hardware driver that needs to get the hardware in and out of command 302mode for each change can save all the changes during previous calls and 303do them all here. 304Return 0 on success, otherwise an error code. 305.It Dv int init_output(void *hdl, void *buffer, int size) 306optional, is called before any output starts, but when the total 307.Va size 308of the output 309.Va buffer 310has been determined. 311It can be used to initialize looping DMA for hardware that needs that. 312Return 0 on success, otherwise an error code. 313.It Dv int init_input(void *hdl, void *buffer, int size) 314optional, is called before any input starts, but when the total 315.Va size 316of the input 317.Va buffer 318has been determined. 319It can be used to initialize looping DMA for hardware that needs that. 320Return 0 on success, otherwise an error code. 321.It Dv int start_output(void *hdl, void *block, int blksize, 322.Dv "void (*intr)(void*), void *intrarg)" 323.br 324is called to start the transfer of 325.Va blksize 326bytes from 327.Va block 328to the audio hardware. 329The call should return when the data transfer has been initiated 330(normally with DMA). 331When the hardware is ready to accept more samples the function 332.Va intr 333should be called with the argument 334.Va intrarg . 335Calling 336.Va intr 337will normally initiate another call to 338.Va start_output . 339Return 0 on success, otherwise an error code. 340.It Dv int start_input(void *hdl, void *block, int blksize, 341.Dv "void (*intr)(void*), void *intrarg)" 342.br 343is called to start the transfer of 344.Va blksize 345bytes to 346.Va block 347from the audio hardware. 348The call should return when the data transfer has been initiated 349(normally with DMA). 350When the hardware is ready to deliver more samples the function 351.Va intr 352should be called with the argument 353.Va intrarg . 354Calling 355.Va intr 356will normally initiate another call to 357.Va start_input . 358Return 0 on success, otherwise an error code. 359.It Dv int halt_output(void *hdl) 360is called to abort the output transfer (started by 361.Va start_output ) 362in progress. 363Return 0 on success, otherwise an error code. 364.It Dv int halt_input(void *hdl) 365is called to abort the input transfer (started by 366.Va start_input ) 367in progress. 368Return 0 on success, otherwise an error code. 369.It Dv int speaker_ctl(void *hdl, int on) 370optional, is called when a half duplex device changes between 371playing and recording. 372It can, e.g., be used to turn on 373and off the speaker. 374Return 0 on success, otherwise an error code. 375.It Dv int getdev(void *hdl, struct audio_device *ret) 376Should fill the 377.Va audio_device 378struct with relevant information about the driver. 379Return 0 on success, otherwise an error code. 380.It Dv int setfd(void *hdl, int fd) 381optional, is called when 382.Dv AUDIO_SETFD 383is used, but only if the device has AUDIO_PROP_FULLDUPLEX set. 384Return 0 on success, otherwise an error code. 385.It Dv int set_port(void *hdl, mixer_ctl_t *mc) 386is called in when 387.Dv AUDIO_MIXER_WRITE 388is used. 389It should take data from the 390.Va mixer_ctl_t 391struct at set the corresponding mixer values. 392Return 0 on success, otherwise an error code. 393.It Dv int get_port(void *hdl, mixer_ctl_t *mc) 394is called in when 395.Dv AUDIO_MIXER_READ 396is used. 397It should fill the 398.Va mixer_ctl_t 399struct. 400Return 0 on success, otherwise an error code. 401.It Dv int query_devinfo(void *hdl, mixer_devinfo_t *di) 402is called in when 403.Dv AUDIO_MIXER_DEVINFO 404is used. 405It should fill the 406.Va mixer_devinfo_t 407struct. 408Return 0 on success, otherwise an error code. 409.It Dv "void *allocm(void *hdl, int direction, size_t size, struct malloc_type *type, int flags)" 410.br 411optional, is called to allocate the device buffers. 412If not present 413.Xr malloc 9 414is used instead (with the same arguments but the first two). 415The reason for using a device dependent routine instead of 416.Xr malloc 9 417is that some buses need special allocation to do DMA. 418Returns the address of the buffer, or 0 on failure. 419.It Dv void freem(void *hdl, void *addr, struct malloc_type *type) 420optional, is called to free memory allocated by 421.Va alloc . 422If not supplied 423.Xr free 9 424is used. 425.It Dv size_t round_buffersize(void *hdl, int direction, size_t bufsize) 426optional, is called at startup to determine the audio 427buffer size. 428The upper layer supplies the suggested size in 429.Va bufsize , 430which the hardware driver can then change if needed. 431E.g., DMA on the ISA bus cannot exceed 65536 bytes. 432.It Dv "paddr_t mappage(void *hdl, void *addr, off_t offs, int prot)" 433.br 434optional, is called for 435.Xr mmap 2 . 436Should return the map value for the page at offset 437.Va offs 438from address 439.Va addr 440mapped with protection 441.Va prot . 442Returns -1 on failure, or a machine dependent opaque value 443on success. 444.It Dv int get_props(void *hdl) 445Should return the device properties; i.e., a combination of 446AUDIO_PROP_xxx. 447.It Dv int trigger_output(void *hdl, void *start, void *end, 448.Dv "int blksize, void (*intr)(void*), void *intrarg," 449.br 450.Dv "struct audio_params *param)" 451.br 452optional, is called to start the transfer of data from the circular buffer 453delimited by 454.Va start 455and 456.Va end 457to the audio hardware, parameterized as in 458.Va param . 459The call should return when the data transfer has been initiated 460(normally with DMA). 461When the hardware is finished transferring each 462.Va blksize 463sized block, the function 464.Va intr 465should be called with the argument 466.Va intrarg 467(typically from the audio hardware interrupt service routine). 468Once started the transfer may be stopped using 469.Va halt_output . 470Return 0 on success, otherwise an error code. 471.It Dv int trigger_input(void *hdl, void *start, void *end, 472.Dv "int blksize, void (*intr)(void*), void *intrarg," 473.br 474.Dv "struct audio_params *param)" 475.br 476optional, is called to start the transfer of data from the audio hardware, 477parameterized as in 478.Va param , 479to the circular buffer delimited by 480.Va start 481and 482.Va end . 483The call should return when the data transfer has been initiated 484(normally with DMA). 485When the hardware is finished transferring each 486.Va blksize 487sized block, the function 488.Va intr 489should be called with the argument 490.Va intrarg 491(typically from the audio hardware interrupt service routine). 492Once started the transfer may be stopped using 493.Va halt_input . 494Return 0 on success, otherwise an error code. 495.It Dv int dev_ioctl(void *hdl, u_long cmd, caddr_t addr, 496.br 497.Dv "int flag, struct proc *p)" 498.br 499optional, is called when an 500.Xr ioctl 2 501is not recognized by the generic audio driver. 502Return 0 on success, otherwise an error code. 503.El 504.Pp 505The 506.Va query_devinfo 507method should define certain mixer controls for 508.Dv AUDIO_SETINFO 509to be able to change the port and gain, 510and 511.Dv AUDIO_GETINFO 512to read them, as follows. 513.Pp 514If the record mixer is capable of input from more than one source, 515it should define 516.Dv AudioNsource 517in class 518.Dv AudioCrecord . 519This mixer control should be of type 520.Dv AUDIO_MIXER_ENUM 521or 522.Dv AUDIO_MIXER_SET 523and enumerate the possible input sources. 524Each of the named sources for which the recording level can be set 525should have a control in the 526.Dv AudioCrecord 527class of type 528.Dv AUDIO_MIXER_VALUE , 529except the 530.Qq mixerout 531source is special, 532and will never have its own control. 533Its selection signifies, 534rather, 535that various sources in class 536.Dv AudioCrecord 537will be combined and presented to the single recording output, 538in the same fashion that the sources of class 539.Dv AudioCinputs 540are combined and presented to the playback output(s). 541If the overall recording level can be changed, 542regardless of the input source, 543then this control should be named 544.Dv AudioNmaster 545and be of class 546.Dv AudioCrecord . 547.Pp 548Controls for various sources that affect only the playback output, 549as opposed to recording, 550should be in the 551.Dv AudioCinputs 552class. 553.Pp 554If the play 555mixer is capable of output to more than one destination, 556it should define 557.Dv AudioNselect 558in class 559.Dv AudioCoutputs . 560This mixer control should be of type 561.Dv AUDIO_MIXER_ENUM 562or 563.Dv AUDIO_MIXER_SET 564and enumerate the possible destinations. 565For each of the named destinations for which the output level can be set, 566there should be 567a control in the 568.Dv AudioCoutputs 569class of type 570.Dv AUDIO_MIXER_VALUE . 571If the overall output level can be changed, 572which is invariably the case, 573then this control should be named 574.Dv AudioNmaster 575and be of class 576.Dv AudioCoutputs . 577.Pp 578There's one additional source recognized specially by 579.Dv AUDIO_SETINFO 580and 581.Dv AUDIO_GETINFO , 582to be presented as monitor_gain, 583and that is a control named 584.Dv AudioNmonitor , 585of class 586.Dv AudioCmonitor . 587.Sh SEE ALSO 588.Xr audio 4 589.Sh HISTORY 590This 591.Nm 592interface first appeared in 593.Nx 1.3 . 594