aboutsummaryrefslogtreecommitdiff
path: root/documentation/content/en/books/arch-handbook/sound/_index.po
diff options
context:
space:
mode:
Diffstat (limited to 'documentation/content/en/books/arch-handbook/sound/_index.po')
-rw-r--r--documentation/content/en/books/arch-handbook/sound/_index.po855
1 files changed, 855 insertions, 0 deletions
diff --git a/documentation/content/en/books/arch-handbook/sound/_index.po b/documentation/content/en/books/arch-handbook/sound/_index.po
new file mode 100644
index 0000000000..dfbbf4a40a
--- /dev/null
+++ b/documentation/content/en/books/arch-handbook/sound/_index.po
@@ -0,0 +1,855 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2022-02-01 09:20-0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. type: YAML Front Matter: description
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:1
+#, no-wrap
+msgid "FreeBSD Sound Subsystem"
+msgstr ""
+
+#. type: YAML Front Matter: title
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:1
+#, no-wrap
+msgid "Chapter 15. Sound Subsystem"
+msgstr ""
+
+#. type: Title =
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:13
+#, no-wrap
+msgid "Sound Subsystem"
+msgstr ""
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:51
+#, no-wrap
+msgid "Introduction"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:54
+msgid ""
+"The FreeBSD sound subsystem cleanly separates generic sound handling issues "
+"from device-specific ones. This makes it easier to add support for new "
+"hardware."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:56
+msgid ""
+"The man:pcm[4] framework is the central piece of the sound subsystem. It "
+"mainly implements the following elements:"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:58
+msgid ""
+"A system call interface (read, write, ioctls) to digitized sound and mixer "
+"functions. The ioctl command set is compatible with the legacy _OSS_ or "
+"_Voxware_ interface, allowing common multimedia applications to be ported "
+"without modification."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:59
+msgid ""
+"Common code for processing sound data (format conversions, virtual channels)."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:60
+msgid ""
+"A uniform software interface to hardware-specific audio interface modules."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:61
+msgid ""
+"Additional support for some common hardware interfaces (ac97), or shared "
+"hardware-specific code (ex: ISA DMA routines)."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:63
+msgid ""
+"The support for specific sound cards is implemented by hardware-specific "
+"drivers, which provide channel and mixer interfaces to plug into the generic "
+"[.filename]#pcm# code."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:65
+msgid ""
+"In this chapter, the term [.filename]#pcm# will refer to the central, common "
+"part of the sound driver, as opposed to the hardware-specific modules."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:67
+msgid ""
+"The prospective driver writer will of course want to start from an existing "
+"module and use the code as the ultimate reference. But, while the sound code "
+"is nice and clean, it is also mostly devoid of comments. This document tries "
+"to give an overview of the framework interface and answer some questions "
+"that may arise while adapting the existing code."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:69
+msgid ""
+"As an alternative, or in addition to starting from a working example, you "
+"can find a commented driver template at https://people.FreeBSD.org/~cg/"
+"template.c[ https://people.FreeBSD.org/~cg/template.c]"
+msgstr ""
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:71
+#, no-wrap
+msgid "Files"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:74
+msgid ""
+"All the relevant code lives in [.filename]#/usr/src/sys/dev/sound/#, except "
+"for the public ioctl interface definitions, found in [.filename]#/usr/src/"
+"sys/sys/soundcard.h#"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:76
+msgid ""
+"Under [.filename]#/usr/src/sys/dev/sound/#, the [.filename]#pcm/# directory "
+"holds the central code, while the [.filename]#pci/#, [.filename]#isa/# and [."
+"filename]#usb/# directories have the drivers for PCI and ISA boards, and for "
+"USB audio devices."
+msgstr ""
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:78
+#, no-wrap
+msgid "Probing, Attaching, etc."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:81
+msgid ""
+"Sound drivers probe and attach in almost the same way as any hardware driver "
+"module. You might want to look at the crossref:isa-driver[isa-driver,ISA] or "
+"crossref:pci[pci,PCI] specific sections of the handbook for more information."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:83
+msgid "However, sound drivers differ in some ways:"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:85
+msgid ""
+"They declare themselves as [.filename]#pcm# class devices, with a `struct "
+"snddev_info` device private structure:"
+msgstr ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:93
+#, no-wrap
+msgid ""
+" static driver_t xxx_driver = {\n"
+" \"pcm\",\n"
+" xxx_methods,\n"
+" sizeof(struct snddev_info)\n"
+" };\n"
+msgstr ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:96
+#, no-wrap
+msgid ""
+" DRIVER_MODULE(snd_xxxpci, pci, xxx_driver, pcm_devclass, 0, 0);\n"
+" MODULE_DEPEND(snd_xxxpci, snd_pcm, PCM_MINVER, PCM_PREFVER,PCM_MAXVER);\n"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:99
+msgid ""
+"Most sound drivers need to store additional private information about their "
+"device. A private data structure is usually allocated in the attach routine. "
+"Its address is passed to [.filename]#pcm# by the calls to `pcm_register()` "
+"and `mixer_init()`. [.filename]#pcm# later passes back this address as a "
+"parameter in calls to the sound driver interfaces."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:100
+msgid ""
+"The sound driver attach routine should declare its MIXER or AC97 interface "
+"to [.filename]#pcm# by calling `mixer_init()`. For a MIXER interface, this "
+"causes in turn a call to <<xxxmixer-init,`xxxmixer_init()`>>."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:101
+msgid ""
+"The sound driver attach routine declares its general CHANNEL configuration "
+"to [.filename]#pcm# by calling `pcm_register(dev, sc, nplay, nrec)`, where "
+"`sc` is the address for the device data structure, used in further calls "
+"from [.filename]#pcm#, and `nplay` and `nrec` are the number of play and "
+"record channels."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:102
+msgid ""
+"The sound driver attach routine declares each of its channel objects by "
+"calls to `pcm_addchan()`. This sets up the channel glue in [.filename]#pcm# "
+"and causes in turn a call to <<xxxchannel-init,`xxxchannel_init()`>>."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:103
+msgid ""
+"The sound driver detach routine should call `pcm_unregister()` before "
+"releasing its resources."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:105
+msgid "There are two possible methods to handle non-PnP devices:"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:107
+msgid ""
+"Use a `device_identify()` method (example: [.filename]#sound/isa/es1888.c#). "
+"The `device_identify()` method probes for the hardware at known addresses "
+"and, if it finds a supported device, creates a new pcm device which is then "
+"passed to probe/attach."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:108
+msgid ""
+"Use a custom kernel configuration with appropriate hints for pcm devices "
+"(example: [.filename]#sound/isa/mss.c#)."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:110
+msgid ""
+"[.filename]#pcm# drivers should implement `device_suspend`, `device_resume` "
+"and `device_shutdown` routines, so that power management and module "
+"unloading function correctly."
+msgstr ""
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:112
+#, no-wrap
+msgid "Interfaces"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:115
+msgid ""
+"The interface between the [.filename]#pcm# core and the sound drivers is "
+"defined in terms of <<kernel-objects,kernel objects>>."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:117
+msgid ""
+"There are two main interfaces that a sound driver will usually provide: "
+"_CHANNEL_ and either _MIXER_ or _AC97_."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:119
+msgid ""
+"The _AC97_ interface is a very small hardware access (register read/write) "
+"interface, implemented by drivers for hardware with an AC97 codec. In this "
+"case, the actual MIXER interface is provided by the shared AC97 code in [."
+"filename]#pcm#."
+msgstr ""
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:120
+#, no-wrap
+msgid "The CHANNEL Interface"
+msgstr ""
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:122
+#, no-wrap
+msgid "Common Notes for Function Parameters"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:125
+msgid ""
+"Sound drivers usually have a private data structure to describe their "
+"device, and one structure for each play and record data channel that it "
+"supports."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:127
+msgid ""
+"For all CHANNEL interface functions, the first parameter is an opaque "
+"pointer."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:129
+msgid ""
+"The second parameter is a pointer to the private channel data structure, "
+"except for `channel_init()` which has a pointer to the private device "
+"structure (and returns the channel pointer for further use by [."
+"filename]#pcm#)."
+msgstr ""
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:130
+#, no-wrap
+msgid "Overview of Data Transfer Operations"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:133
+msgid ""
+"For sound data transfers, the [.filename]#pcm# core and the sound drivers "
+"communicate through a shared memory area, described by a `struct snd_dbuf`."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:135
+msgid ""
+"`struct snd_dbuf` is private to [.filename]#pcm#, and sound drivers obtain "
+"values of interest by calls to accessor functions (`sndbuf_getxxx()`)."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:137
+msgid ""
+"The shared memory area has a size of `sndbuf_getsize()` and is divided into "
+"fixed size blocks of `sndbuf_getblksz()` bytes."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:139
+msgid ""
+"When playing, the general transfer mechanism is as follows (reverse the idea "
+"for recording):"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:141
+msgid ""
+"[.filename]#pcm# initially fills up the buffer, then calls the sound "
+"driver's <<channel-trigger,`xxxchannel_trigger()`>> function with a "
+"parameter of PCMTRIG_START."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:142
+msgid ""
+"The sound driver then arranges to repeatedly transfer the whole memory area "
+"(`sndbuf_getbuf()`, `sndbuf_getsize()`) to the device, in blocks of "
+"`sndbuf_getblksz()` bytes. It calls back the `chn_intr()`[.filename]#pcm# "
+"function for each transferred block (this will typically happen at interrupt "
+"time)."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:143
+msgid ""
+"`chn_intr()` arranges to copy new data to the area that was transferred to "
+"the device (now free), and make appropriate updates to the `snd_dbuf` "
+"structure."
+msgstr ""
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:145
+#, no-wrap
+msgid "channel_init"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:148
+msgid ""
+"`xxxchannel_init()` is called to initialize each of the play or record "
+"channels. The calls are initiated from the sound driver attach routine. (See "
+"the <<pcm-probe-and-attach,probe and attach section>>)."
+msgstr ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:160
+#, no-wrap
+msgid ""
+" static void *\n"
+" xxxchannel_init(kobj_t obj, void *data,\n"
+" struct snd_dbuf *b, struct pcm_channel *c, int dir) <.>\n"
+" {\n"
+" struct xxx_info *sc = data;\n"
+" struct xxx_chinfo *ch;\n"
+" ...\n"
+" return ch; <.>\n"
+" }\n"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:163
+msgid ""
+"`b` is the address for the channel `struct snd_dbuf`. It should be "
+"initialized in the function by calling `sndbuf_alloc()`. The buffer size to "
+"use is normally a small multiple of the 'typical' unit transfer size for "
+"your device.`c` is the [.filename]#pcm# channel control structure pointer. "
+"This is an opaque object. The function should store it in the local channel "
+"structure, to be used in later calls to [.filename]#pcm# (ie: `chn_intr(c)`)."
+"`dir` indicates the channel direction (`PCMDIR_PLAY` or `PCMDIR_REC`)."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:165
+msgid ""
+"The function should return a pointer to the private area used to control "
+"this channel. This will be passed as a parameter to other channel interface "
+"calls."
+msgstr ""
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:166
+#, no-wrap
+msgid "channel_setformat"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:169
+msgid ""
+"`xxxchannel_setformat()` should set up the hardware for the specified "
+"channel for the specified sound format."
+msgstr ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:179
+#, no-wrap
+msgid ""
+" static int\n"
+" xxxchannel_setformat(kobj_t obj, void *data, u_int32_t format) <.>\n"
+" {\n"
+" struct xxx_chinfo *ch = data;\n"
+" ...\n"
+" return 0;\n"
+" }\n"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:182
+msgid ""
+"`format` is specified as an `AFMT_XXX value` ([.filename]#soundcard.h#)."
+msgstr ""
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:183
+#, no-wrap
+msgid "channel_setspeed"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:186
+msgid ""
+"`xxxchannel_setspeed()` sets up the channel hardware for the specified "
+"sampling speed, and returns the possibly adjusted speed."
+msgstr ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:196
+#, no-wrap
+msgid ""
+" static int\n"
+" xxxchannel_setspeed(kobj_t obj, void *data, u_int32_t speed)\n"
+" {\n"
+" struct xxx_chinfo *ch = data;\n"
+" ...\n"
+" return speed;\n"
+" }\n"
+msgstr ""
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:198
+#, no-wrap
+msgid "channel_setblocksize"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:201
+msgid ""
+"`xxxchannel_setblocksize()` sets the block size, which is the size of unit "
+"transactions between [.filename]#pcm# and the sound driver, and between the "
+"sound driver and the device. Typically, this would be the number of bytes "
+"transferred before an interrupt occurs. During a transfer, the sound driver "
+"should call [.filename]#pcm#'s `chn_intr()` every time this size has been "
+"transferred."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:203
+msgid ""
+"Most sound drivers only take note of the block size here, to be used when an "
+"actual transfer will be started."
+msgstr ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:213
+#, no-wrap
+msgid ""
+" static int\n"
+" xxxchannel_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)\n"
+" {\n"
+" struct xxx_chinfo *ch = data;\n"
+" ...\n"
+" return blocksize; <.>\n"
+" }\n"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:216
+msgid ""
+"The function returns the possibly adjusted block size. In case the block "
+"size is indeed changed, `sndbuf_resize()` should be called to adjust the "
+"buffer."
+msgstr ""
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:218
+#, no-wrap
+msgid "channel_trigger"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:221
+msgid ""
+"`xxxchannel_trigger()` is called by [.filename]#pcm# to control data "
+"transfer operations in the driver."
+msgstr ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:231
+#, no-wrap
+msgid ""
+" static int\n"
+" xxxchannel_trigger(kobj_t obj, void *data, int go) <.>\n"
+" {\n"
+" struct xxx_chinfo *ch = data;\n"
+" ...\n"
+" return 0;\n"
+" }\n"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:234
+msgid "`go` defines the action for the current call. The possible values are:"
+msgstr ""
+
+#. type: delimited block = 4
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:238
+msgid ""
+"If the driver uses ISA DMA, `sndbuf_isadma()` should be called before "
+"performing actions on the device, and will take care of the DMA chip side of "
+"things."
+msgstr ""
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:240
+#, no-wrap
+msgid "channel_getptr"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:243
+msgid ""
+"`xxxchannel_getptr()` returns the current offset in the transfer buffer. "
+"This will typically be called by `chn_intr()`, and this is how [."
+"filename]#pcm# knows where it can transfer new data."
+msgstr ""
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:244
+#, no-wrap
+msgid "channel_free"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:247
+msgid ""
+"`xxxchannel_free()` is called to free up channel resources, for example when "
+"the driver is unloaded, and should be implemented if the channel data "
+"structures are dynamically allocated or if `sndbuf_alloc()` was not used for "
+"buffer allocation."
+msgstr ""
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:248
+#, no-wrap
+msgid "channel_getcaps"
+msgstr ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:257
+#, no-wrap
+msgid ""
+" struct pcmchan_caps *\n"
+" xxxchannel_getcaps(kobj_t obj, void *data)\n"
+" {\n"
+" return &xxx_caps; <.>\n"
+" }\n"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:260
+msgid ""
+"The routine returns a pointer to a (usually statically-defined) "
+"`pcmchan_caps` structure (defined in [.filename]#sound/pcm/channel.h#. The "
+"structure holds the minimum and maximum sampling frequencies, and the "
+"accepted sound formats. Look at any sound driver for an example."
+msgstr ""
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:261
+#, no-wrap
+msgid "More Functions"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:264
+msgid ""
+"`channel_reset()`, `channel_resetdone()`, and `channel_notify()` are for "
+"special purposes and should not be implemented in a driver without "
+"discussing it on the {freebsd-multimedia}."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:266
+msgid "`channel_setdir()` is deprecated."
+msgstr ""
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:267
+#, no-wrap
+msgid "The MIXER Interface"
+msgstr ""
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:270
+#, no-wrap
+msgid "mixer_init"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:273
+msgid ""
+"`xxxmixer_init()` initializes the hardware and tells [.filename]#pcm# what "
+"mixer devices are available for playing and recording"
+msgstr ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:281
+#, no-wrap
+msgid ""
+" static int\n"
+" xxxmixer_init(struct snd_mixer *m)\n"
+" {\n"
+" struct xxx_info *sc = mix_getdevinfo(m);\n"
+" u_int32_t v;\n"
+msgstr ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:283
+#, no-wrap
+msgid " [Initialize hardware]\n"
+msgstr ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:288
+#, no-wrap
+msgid ""
+" [Set appropriate bits in v for play mixers] <.>\n"
+" mix_setdevs(m, v);\n"
+" [Set appropriate bits in v for record mixers]\n"
+" mix_setrecdevs(m, v)\n"
+msgstr ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:291
+#, no-wrap
+msgid ""
+" return 0;\n"
+" }\n"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:294
+msgid ""
+"Set bits in an integer value and call `mix_setdevs()` and `mix_setrecdevs()` "
+"to tell [.filename]#pcm# what devices exist."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:296
+msgid ""
+"Mixer bits definitions can be found in [.filename]#soundcard.h# "
+"(`SOUND_MASK_XXX` values and `SOUND_MIXER_XXX` bit shifts)."
+msgstr ""
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:297
+#, no-wrap
+msgid "mixer_set"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:300
+msgid "`xxxmixer_set()` sets the volume level for one mixer device."
+msgstr ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:311
+#, no-wrap
+msgid ""
+" static int\n"
+" xxxmixer_set(struct snd_mixer *m, unsigned dev,\n"
+" unsigned left, unsigned right) <.>\n"
+" {\n"
+" struct sc_info *sc = mix_getdevinfo(m);\n"
+" [set volume level]\n"
+" return left | (right << 8); <.>\n"
+" }\n"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:314
+msgid ""
+"The device is specified as a `SOUND_MIXER_XXX` value. The volume values are "
+"specified in range [0-100]. A value of zero should mute the device."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:315
+msgid ""
+"As the hardware levels probably will not match the input scale, and some "
+"rounding will occur, the routine returns the actual level values (in range "
+"0-100) as shown."
+msgstr ""
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:316
+#, no-wrap
+msgid "mixer_setrecsrc"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:319
+msgid "`xxxmixer_setrecsrc()` sets the recording source device."
+msgstr ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:326
+#, no-wrap
+msgid ""
+" static int\n"
+" xxxmixer_setrecsrc(struct snd_mixer *m, u_int32_t src) <.>\n"
+" {\n"
+" struct xxx_info *sc = mix_getdevinfo(m);\n"
+msgstr ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:328
+#, no-wrap
+msgid " [look for non zero bit(s) in src, set up hardware]\n"
+msgstr ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:332
+#, no-wrap
+msgid ""
+" [update src to reflect actual action]\n"
+" return src; <.>\n"
+" }\n"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:335
+msgid "The desired recording devices are specified as a bit field"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:336
+msgid ""
+"The actual devices set for recording are returned. Some drivers can only set "
+"one device for recording. The function should return -1 if an error occurs."
+msgstr ""
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:337
+#, no-wrap
+msgid "mixer_uninit, mixer_reinit"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:340
+msgid ""
+"`xxxmixer_uninit()` should ensure that all sound is muted and if possible "
+"mixer hardware should be powered down."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:342
+msgid ""
+"`xxxmixer_reinit()` should ensure that the mixer hardware is powered up and "
+"any settings not controlled by `mixer_set()` or `mixer_setrecsrc()` are "
+"restored."
+msgstr ""
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:343
+#, no-wrap
+msgid "The AC97 Interface"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:346
+msgid ""
+"The _AC97_ interface is implemented by drivers with an AC97 codec. It only "
+"has three methods:"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:348
+msgid "`xxxac97_init()` returns the number of ac97 codecs found."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:349
+msgid "`ac97_read()` and `ac97_write()` read or write a specified register."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:350
+msgid ""
+"The _AC97_ interface is used by the AC97 code in [.filename]#pcm# to perform "
+"higher level operations. Look at [.filename]#sound/pci/maestro3.c# or many "
+"others under [.filename]#sound/pci/# for an example."
+msgstr ""