diff options
Diffstat (limited to 'usr/src/man/man4i/mixer.4i')
| -rw-r--r-- | usr/src/man/man4i/mixer.4i | 767 |
1 files changed, 767 insertions, 0 deletions
diff --git a/usr/src/man/man4i/mixer.4i b/usr/src/man/man4i/mixer.4i new file mode 100644 index 0000000000..6d4487796b --- /dev/null +++ b/usr/src/man/man4i/mixer.4i @@ -0,0 +1,767 @@ +.\" Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. +.\" Copyright 2019, Joyent, Inc. +.\" The contents of this file are subject to the terms of the +.\" Common Development and Distribution License (the "License"). +.\" You may not use this file except in compliance with the License. +.\" +.\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE +.\" or http://www.opensolaris.org/os/licensing. +.\" See the License for the specific language governing permissions +.\" and limitations under the License. +.\" +.\" When distributing Covered Code, include this CDDL HEADER in each +.\" file and include the License file at usr/src/OPENSOLARIS.LICENSE. +.\" If applicable, add the following below this CDDL HEADER, with the +.\" fields enclosed by brackets "[]" replaced with your own identifying +.\" information: Portions Copyright [yyyy] [name of copyright owner] +.Dd February 1, 2019 +.Dt MIXER 4I +.Os +.Sh NAME +.Nm mixer +.Nd generic mixer device interface +.Sh SYNOPSIS +.In sys/soundcard.h +.Sh DESCRIPTION +.Ss "Mixer Pseudo-Device" +The +.Pa /dev/mixer +pseudo-device is provided for two purposes: +.Bl -bullet -offset indent +.It +The first purpose is for applications that wish to learn about the list of +audio devices on the system, so that they can select (or provide for users to +select) an appropriate audio device. +The +.Pa /dev/mixer +pseudo-device +provides interfaces to enumerate all of the audio devices on the system. +.It +The second purpose is for mixer panel type applications which need to control +master settings for the audio hardware in the system, such as gain levels, +balance, port functionality, and other device features. +.El +.Pp +Ordinary audio applications should +.Em not +attempt to adjust their playback +or record volumes or other device settings using this device. +Instead, they +should use the +.Dv SNDCTL_DSP_SETPLAYVOL +and +.Dv SNDCTL_DSP_SETRECVOL +ioctls that are documented in +.Xr dsp 4I . +.Ss "Sndstat Device" +The +.Pa /dev/sndstat +device supports +.Xr read 2 , +and can be read to +retrieve human-readable information about the audio devices on the system. +Software should not attempt to interpret the contents of this device. +.Sh IOCTLS +.Ss "Information IOCTLs" +The following ioctls are intended to aid applications in identifying the audio +devices available on the system. +These ioctls can be issued against either the +pseudo-device +.Pa /dev/mixer , +or a against a file descriptor open to any +other audio device in the system. +.Pp +Applications should issue +.Dv SNDCTL_SYSINFO +first to learn what audio +devices and mixers are available on the system, and then use +.Dv SNDCTL_AUDIOINFO +or +.Dv SNDCTL_MIXERINFO +to obtain more information +about the audio devices or mixers, respectively. +.Bl -tag -width SNDCTL_AUDIOINFO +.It Dv OSS_GETVERSION +The argument is a pointer to an integer, which retrieves the version of the +.Sy OSS API +used. +The value is encoded with the major version (currently 4) +encoded in the most significant 16 bits, and a minor version encoded in the +lower 16 bits. +.It Dv SNDCTL_SYSINFO +The argument is a pointer to an +.Vt oss_sysinfo +structure, which has the following definition: +.Bd -literal -offset 2n +typedef struct oss_sysinfo { + char product[32]; /* E.g. SunOS Audio */ + char version[32]; /* E.g. 4.0a */ + int versionnum; /* See OSS_GETVERSION */ + char options[128]; /* NOT SUPPORTED */ + + int numaudios; /* # of audio/dsp devices */ + int openedaudio[8]; /* Reserved, always 0 */ + + int numsynths; /* NOT SUPPORTED, always 0 */ + int nummidis; /* NOT SUPPORTED, always 0 */ + int numtimers; /* NOT SUPPORTED, always 0 */ + int nummixers; /* # of mixer devices */ + + /* Mask of midi devices are busy */ + int openedmidi[8]; + + /* Number of sound cards in the system */ + int numcards; + + /* Number of audio engines in the system */ + int numaudioengines; + char license[16]; /* E.g. "GPL" or "CDDL" */ + char revision_info[256]; /* Reserved */ + int filler[172]; /* Reserved */ +} oss_sysinfo; +.Ed +.Pp +The important fields here are +.Fa numaudios , +which is used to determine the +number of audio devices that can be queried with +.Dv SNDCTL_AUDIOINFO , +.Fa nummixers +which provides a count of mixers on the system, and +.Fa numcards +which counts to total number of aggregate devices. +A +.Sy card +can consist of one or more audio devices and one or more mixers, although more +typically there is exactly one audio device and one mixer for each card. +.It Dv SNDCTL_AUDIOINFO +The argument is a pointer to an +.Vt oss_audioinfo +structure, which has the following structure: +.Bd -literal -offset 2n +typedef struct oss_audioinfo { + int dev; /* Device to query */ + char name[64]; /* Human readable name */ + int busy; /* reserved */ + int pid; /* reserved */ + + /* PCM_CAP_INPUT, PCM_CAP_OUTPUT */ + int caps; + int iformats; /* Supported input formats */ + int oformats; /* Supported output formats */ + int magic; /* reserved */ + char cmd[64]; /* reserved */ + int card_number; + int port_number; /* reserved */ + int mixer_dev; + + /* Obsolete field. Replaced by devnode */ + int legacy_device; + int enabled; /* reserved */ + int flags; /* reserved */ + int min_rate; /* Minimum sample rate */ + int max_rate; /* Maximum sample rate */ + int min_channels; /* Minimum number of channels */ + int max_channels; /* Maximum number of channels */ + int binding; /* reserved */ + int rate_source; /* reserved */ + char handle[32]; /* reserved */ + unsigned int nrates; /* reserved */ + unsigned int rates[20]; /* reserved */ + char song_name[64]; /* reserved */ + char label[16]; /* reserved */ + int latency; /* reserved */ + + /* Device special file name (absolute path) */ + char devnode[32]; + int next_play_engine; /* reserved */ + int next_rec_engine; /* reserved */ + int filler[184]; /* reserved */ +} oss_audioinfo; +.Ed +.Pp +In the above structure, all of the fields are reserved except the following: +.Fa dev , +.Fa name , +.Fa card_number , +.Fa mixer_dev , +.Fa caps , +.Fa min_rate , +.Fa max_rate , +.Fa min_channels , +.Fa max_channels , +and +.Fa devnode . +The reserved fields are provided for compatibility with other OSS +implementations, and available for legacy applications. +New applications should not attempt to use these fields. +.Pp +The +.Fa dev +field should be initialized by the application to the number of +the device to query. +This is a number between zero (inclusive) and value of +.Fa numaudios +(exclusive) returned by +.Dv SNDCTL_SYSINFO . +Alternatively, +when issuing the ioctl against a real mixer or +.Sy dsp +device, the special +value +.Sy -1 +can be used to indicate that the query is being made against the device opened. +If +.Sy -1 +is used, the field is overwritten with the device +number for the current device on successful return. +.Pp +No other fields are significant upon entry, but a successful return contains +details of the device. +.Pp +The +.Fa name +field is a human readable name representing the device. +Applications should not try to interpret it. +.Pp +The +.Fa card_number +field indicates the number assigned to the aggregate device. +This can be used with the +.Dv SNDCTL_CARDINFO +ioctl. +.Pp +The +.Fa mixer_dev +is the mixer device number for the mixing device associated +with the audio device. +This can be used with the +.Dv SNDCTL_MIXERINFO +ioctl. +.Pp +The +.Fa caps +field contains any of the bits +.Dv PCM_CAP_INPUT , +.Dv PCM_CAP_OUTPUT , +and +.Dv PCM_CAP_DUPLEX . +Indicating whether the device +support input, output, and whether input and output can be used simultaneously. +All other bits are reserved. +.Pp +The +.Fa min_rate +and +.Fa max_rate +fields indicate the minimum and maximum sample rates supported by the device. +Most applications should try to use the maximum supported rate for the best +audio quality and lowest system resource consumption. +.Pp +The +.Fa min_channels +and +.Fa max_channels +provide an indication of the number of channels (1 for mono, 2 for stereo, +6 for 5\&.1, etc\&.) supported by the device. +.Pp +The +.Fa devnode +field contains the actual full path to the device node for this device, such as +.Pa /dev/sound/audio810:0dsp . +Applications should open this file to access the device. +.It Dv SNDCTL_CARDINFO +The argument is a pointer to a +.Vt struct oss_card_info , +which has the following definition: +.Bd -literal -offset 2n +typedef struct oss_card_info { + int card; + char shortname[16]; + char longname[128]; + int flags; /* reserved */ + char hw_info[400]; + int intr_count; /* reserved */ + int ack_count; /* reserved */ + int filler[154]; +} oss_card_info; +.Ed +.Pp +This ioctl is used to query for information about the aggregate audio device. +.Pp +The +.Fa card +field should be initialized by the application to the number of +the card to query. +This is a number between zero +.Pq inclusive +and value of +.Fa numcards +.Pq exclusive +returned by +.Dv SNDCTL_SYSINFO . +Alternatively, +when issuing the ioctl against a real mixer or +.Sy dsp +device, the special value +.Sy -1 +can be used to indicate that the query is being made against the device opened. +If +.Sy -1 +is used, the field is overwritten with the number +for the current hardware device on successful return. +.Pp +The +.Fa shortname , +.Fa longname , +and +.Fa hw_info +contain +.Sy ASCIIZ +strings describing the device in more detail. +The +.Fa hw_info +member can contain multiple lines of detail, each line ending in a NEWLINE. +.Pp +The +.Fa flag , +.Fa intr_count , +and +.Fa ack_count +fields are not used by this implementation. +.It Dv SNDCTL_MIXERINFO +The argument is a pointer to a +.Vt struct oss_mixer_info , +which has the following definition: +.Bd -literal -offset 2n +typedef struct oss_mixerinfo { + int dev; + char id[16]; /* Reserved */ + char name[32]; + int modify_counter; + int card_number; + int port_number; /* Reserved */ + char handle[32]; /* Reserved */ + int magic; /* Reserved */ + int enabled; /* Reserved */ + int caps; /* Reserved */ + int flags; /* Reserved */ + int nrext; + int priority; + + /* Deice special file name (absolute path) */ + char devnode[32]; + int legacy_device; /* Reserved */ + int filler[245]; /* Reserved */ +} oss_mixerinfo; +.Ed +.Pp +In the above structure, all of the fields are reserved except the following: +.Fa dev , +.Fa name , +.Fa modify_counter , +.Fa card_number , +.Fa nrext , +.Fa priority , +and +.Fa devnode . +The reserved fields are provided for compatibility with other +OSS implementations, and available for legacy applications. +New applications should not attempt to use these fields. +.Pp +The +.Fa dev +field should be initialized by the application to the number of +the device to query. +This is a number between zero inclusive and value of +.Fa nummixers +(exclusive) returned by +.Dv SNDCTL_SYSINFO , +or by +.Dv SNDCTL_MIX_NRMIX . +Alternatively, when issuing the ioctl against a real mixer or +.Sy dsp +device, the special value +.Sy -1 +can be used to indicate +that the query is being made against the device opened. +If +.Sy -1 +is used, +the field is overwritten with the mixer number for the current open file on +successful return. +.Pp +No other fields are significant upon entry, but on successful return contains +details of the device. +.Pp +The +.Fa name +field is a human readable name representing the device. +Applications should not try to interpret it. +.Pp +The +.Fa modify_counter +is changed by the mixer framework each time the +settings for the various controls or extensions of the device are changed. +Applications can poll this value to learn if any other changes need to be +searched for. +.Pp +The +.Fa card_number +field is the number of the aggregate audio device this +mixer is located on. +It can be used with the +.Dv SNDCTL_CARDINFO +ioctl. +.Pp +The +.Fa nrext +field is the number of mixer extensions available on this mixer. +See the +.Dv SNDCTL_MIX_NREXT +description. +.Pp +The priority is used by the framework to assign a preference that applications +can use in choosing a device. +Higher values are preferable. +Mixers with priorities less than -1 should never be selected by default. +.Pp +The +.Fa devnode +field contains the actual full path to the device node for +the physical mixer, such as +.Pa /dev/sound/audio810:0mixer . +Applications +should open this file to access the mixer settings. +.El +.Ss "Mixer Extension IOCTLs" +The pseudo +.Pa /dev/mixer +device supports ioctls that can change the +oarious settings for the audio hardware in the system. +.Pp +Those ioctls should only be used by dedicated mixer applications or desktop +olumme controls, and not by typical ordinary audio applications such as media +players. +Ordinary applications that wish to adjust their own volume settings +should use the +.Dv SNDCTL_DSP_SETPLAYVOL +or +.Dv SNDCTL_DSP_SETRECVOL +ioctls for that purpose. +See +.Xr dsp 4I +for more information. +Ordinary +applications should never attempt to change master port selection or hardware +settings such as monitor gain settings. +.Pp +The ioctls in this section can only be used to access the mixer device that is +associated with the current file descriptor. +.Pp +Applications should not assume that a single +.Pa /dev/mixer +node is able to access any physical settings. +Instead, they should use the ioctl +.Dv SNDCTL_MIXERINFO +to determine the device path for the real mixer device, +and issue ioctls on a file descriptor opened against the corresponding +.Fa devnode +field. +.Pp +When a +.Fa dev +member is specified in each of the following ioctls, the +application should specify +.Sy -1 , +although for compatibility the mixer +allows the application to specify the mixer device number. +.Pp +.Bl -tag -width SNDCTL_MIX_ENUMINFO -compact +.It Dv SNDCTL_MIX_NRMIX +The argument is a pointer to an integer, which receives the number of mixer +devices in the system. +Each can be queried by using its number with the +.Dv SNDCTL_MIXERINFO +ioctl. +The same information is available using the +.Fa SNDCTL_SYSINFO +ioctl. +.Pp +.It Dv SNDCTL_MIX_NREXT +The argument is a pointer to an integer. +On entry, the integer should contain +the special value +.Sy -1 . +On return the argument receives the number of mixer +extensions (or mixer controls) supported by the mixer device. +More details +about each extension can be obtained by +.Fa SNDCTL_MIX_EXTINFO +ioctl. +.Pp +.It Dv SNDCTL_MIX_EXTINFO +The argument is a pointer to an +.Vt oss_mixext +structure which is defined as follows: +.Bd -literal -offset 2n +typedef struct oss_mixext { + int dev; /* Mixer device number */ + int ctrl; /* Extension number */ + int type; /* Entry type */ + int maxvalue; + int minvalue; + int flags; + char id[16]; /* Mnemonic ID (internal use) */ + int parent; /* Entry# of parent (-1 if root) */ + int dummy; /* NOT SUPPORTED */ + int timestamp; + char data[64]; /* Reserved */ + + /* Mask of allowed enum values */ + unsigned char enum_present[32]; + int control_no; /* Reserved */ + unsigned int desc; /* NOT SUPPORTED */ + char extname[32]; + int update_counter; + int filler[7]; /* Reserved */ +} oss_mixext; +.Ed +.Pp +On entry, the +.Fa dev +field should be initialized to the value +.Sy -1 , +and +the +.Fa ctrl +field should be initialized with the number of the extension +being accessed. +Between 0, inclusive, and the value returned by +.Dv SNDCTL_MIX_NREXT , +exclusive. +.Pp +Mixer extensions are organized as a logical tree, starting with a root node. +The root node always has a +.Fa ctrl +value of zero. +The structure of the tree can be determined by looking at the parent field, +which contains the extension number of the parent extension, or +.Sy -1 +if the extension is the root extension. +.Pp +The type indicates the type of extension used. +This implementation supports the following values: +.Bl -column -offset 2n "MIXT_STEREOSLIDER" "Enumerated value, 0 to maxvalue" +.It Dv MIXT_DEVROOT Ta Root node for extension tree +.It Dv MIXT_GROUP Ta Logical grouping of controls +.It Dv MXIT_ONOFF Ta Boolean value, 0 = off, 1 = on. +.It Dv MIXT_ENUM Ta Enumerated value, 0 to maxvalue. +.It Dv MIXT_MONOSLIDER Ta Monophonic slider, 0 to 255. +.It Dv MIXT_STEREOSLIDER Ta Stereophonic slider, 0 to 255 (encoded as lower two bytes in value.) +.It Dv MIXT_MARKER Ta Place holder, can ignore. +.El +.Pp +The flags field is a bit array. +This implementation makes use of the following +possible bits: +.Bl -column -offset 2n "MIXF_WRITEABLE" "Extensions value is modifiable" +.It Dv MIXF_READABLE Ta Extension's value is readable. +.It Dv MIXF_WRITEABLE Ta Extension's value is modifiable. +.It Dv MIXF_POLL Ta Extension can self-update. +.It Dv MIXF_PCMVOL Ta Extension is for master PCM playback volume. +.It Dv MIXF_MAINVOL Ta Extension is for a typical analog volume +.It Dv MIXF_RECVOL Ta Extension is for master record gain. +.It Dv MIXF_MONVOL Ta Extension is for a monitor source's gain. +.El +.Pp +The +.Fa id +field contains an +.Sy ASCIIZ +identifier for the extension. +.Pp +The timestamp field is set when the extension tree is first initialized. +Applications must use the same timestamp value when attempting to change the +values. +A change in the timestamp indicates a change a in the structure of the +extension tree. +.Pp +The +.Fa enum_present +field is a bit mask of possible enumeration values. +If a +bit is present in the +.Fa enum_present +mask, then the corresponding enumeration value is legal. +The mask is in little endian order. +.Pp +The +.Fa desc +field provides information about scoping, which can be useful as +layout hints to applications. +The following hints are available: +.Bl -column -offset 2n "MIXEXT_SCOPE_MONITOR" "No scoping hint provided." +.It Dv MIXEXT_SCOPE_MASK Ta Mask of possible scope values. +.It Dv MIXEXT_SCOPE_INPUT Ta Extension is an input control. +.It Dv MIXEXT_SCOPE_OUTPUT Ta Extension is an output control. +.It Dv MIXEXT_SCOPE_MONITOR Ta Extension relates to input monitoring. +.It Dv MIXEXT_SCOPE_OTHER Ta No scoping hint provided. +.El +.Pp +The +.Fa extname +is the full name of the extension. +.Pp +The +.Fa update_counter +is incremented each time the control's value is changed. +.Pp +.It Dv SNDCTL_MIX_ENUMINFO +The argument is a pointer to an +.Vt oss_mixer_enuminfo +structure, which is defined as follows: +.Bd -literal -offset 2n +typedef struct oss_mixer_enuminfo { + int dev; + int ctrl; + int nvalues; + int version; + short strindex[255]; + char strings[3000]; +} oss_mixer_enuminfo; +.Ed +.Pp +On entry, the +.Fa dev +field should be initialized to the value +.Sy -1 , +and +the +.Fa ctrl +field should be initialized with the number of the extension being accessed. +Between 0, inclusive, and the value returned by +.Dv SNDCTL_MIX_NREXT , +exclusive. +.Pp +On return the +.Fa nvalues +field contains the number of values, and +.Fa strindex +contains an array of indices into the strings member, each index +pointing to an +.Sy ASCIIZ +describing the enumeration value. +.Pp +.It Dv SNDCTL_MIX_READ +.It Dv SNDCTL_MIX_WRITE +The argument is a pointer to an +.Vt oss_mixer_value +structure, defined as follows: +.Bd -literal -offset 2n +typedef struct oss_mixer_value { + int dev; + int ctrl; + int value; + + /* Reserved for future use. Initialize to 0 */ + int flags; + + /* Must be set to oss_mixext.timestamp */ + int timestamp; + + /* Reserved for future use. Initialize to 0 */ + int filler[8]; +} oss_mixer_value; +.Pp +.Ed +On entry, the +.Fa dev +field should be initialized to the value +.Sy -1 , +and the +.Fa ctrl +field should be initialized with the number of the extension +being accessed. +Between 0, inclusive, and the value returned by +.Dv SNDCTL_MIX_NREXT , +exclusive. +Additionally, the timestamp member must be +initialized to the same value as was supplied in the +.Vt oss_mixext +structure +used with +.Dv SNDCTL_MIX_EXTINFO . +.Pp +For +.Dv SNDCTL_MIX_WRITE , +the application should supply the new value for the extension. +For +.Dv SNDCTL_MIX_READ , +the mixer returns the extensions current value in value. +.El +.Ss "Compatibility IOCTLs" +The following ioctls are for compatibility use only: +.Pp +.Bl -tag -offset 2n -width SNDCTL_MIX_ENUMINFO -compact +.It Dv SOUND_MIXER_READ_VOLUME +.It Dv SOUND_MIXER_READ_PCM +.It Dv SOUND_MIXER_READ_OGAIN +.It Dv SOUND_MIXER_READ_RECGAIN +.It Dv SOUND_MIXER_READ_RECLEV +.It Dv SOUND_MIXER_READ_IGAIN +.It Dv SOUND_MIXER_READ_RECSRC +.It Dv SOUND_MIXER_READ_RECMASK +.It Dv SOUND_MIXER_READ_DEVMASK +.It Dv SOUND_MIXER_READ_STEREODEVS +.It Dv SOUND_MIXER_WRITE_VOLUME +.It Dv SOUND_MIXER_WRITE_PCM +.It Dv SOUND_MIXER_WRITE_OGAIN +.It Dv SOUND_MIXER_WRITE_RECGAIN +.It Dv SOUND_MIXER_WRITE_RECLEV +.It Dv SOUND_MIXER_WRITE_IGAIN +.It Dv SOUND_MIXER_WRITE_RECSRC +.It Dv SOUND_MIXER_WRITE_RECMASK +.It Dv SOUND_MIXER_INFO +.It Dv SNDCTL_AUDIOINFO_EX +.It Dv SNDCTL_ENGINEINFO +.El +.Pp +These ioctls can affect the software volume levels associated with the calling +process. +They have no effect on the physical hardware levels or settings. +They should not be used in new applications. +.Sh FILES +.Bl -tag -width /dev/sndstat +.It Pa /dev/mixer +Symbolic link to the pseudo mixer device for the system +.It Pa /dev/sndstat +Sound status device +.El +.Sh ERRORS +An +.Xr ioctl 2 +fails if: +.Bl -tag -width EINVAL +.It Er EINVAL +The parameter changes requested in the ioctl are invalid or are not supported +by the device. +.It Er ENXIO +The device or extension referenced does not exist. +.El +.Sh ARCHITECTURE +SPARC +x86 +.Sh INTERFACE STABILITY +The information and mixer extension IOCTLs are Uncommitted. +The Compatibility IOCTLs are Obsolete Uncommitted. +The extension names are Uncommitted. +.Sh SEE ALSO +.Xr close 2 , +.Xr ioctl 2 , +.Xr open 2 , +.Xr read 2 , +.Xr dsp 4I , +.Xr attributes 7 +.Sh BUGS +The names of mixer extensions are not guaranteed to be predictable. |
