ALSA
This article describes the setup of a sound card with ALSA (Advanced Linux Sound Architecture).
Installation
Hardware detection
It is often found during an ALSA installation, that the kernel driver modules for soundcards have not been properly installed on the system. To check if one's system has working soundcard driver modules, run lsmod. If there are no modules with the prefix of
snd_
, consider properly installing the kernel driver module for the system's specific soundcard. A more detailed guide can be found in the Kernel Modules page.To choose the right driver, first detect the used audio controller. Use lspci for this task:
user $
lspci | grep -i audio
With the controller name determined, the needed driver can be found in the ALSA sound card matrix.
Kernel
Activate the following kernel options:
Device Drivers --->
<*> Sound card support
<*> Advanced Linux Sound Architecture --->
[*] PCI sound devices --->
Select the driver for your audio controller.
HD-Audio --->
Select a codec or enable all and let the generic parse choose the right one:
[*] Build Realtek HD-audio codec support
[*] ...
[*] Build Silicon Labs 3054 HD-modem codec support
[*] Enable generic HD-audio codec parser
[*] USB sound devices --->
Must have as some cards are presented as USB devices.
[*] USB Audio/MIDI driver
General setup --->
[*] System V IPC
The lsmod command can be helpful.
If the system has more than 8 sound outputs (Each HDMI output on a GPU will count as one), the max number of sound cards will need to be increased:
Device Drivers --->
<*> Sound card support
<*> Advanced Linux Sound Architecture --->
[*] Dynamic device file minor numbers
(32) Max number of sound cards
Kernel modules
For advanced configurations like multiple sound cards, it can be better to select all the ALSA related kernel options as modules. With them, you can use 2 files for their configuration:
- /etc/modules-load.d/alsa.conf - 1 line per module, normally only needed for virtual sound cards.
- /etc/modprobe.d/alsa.conf - for the modules options.
Example: We have a laptop with 2 hda-intel sound cards, an external USB card, we want the aloop and virmidi virtual sound cards, and we want the same card order after each reboot:
- the aloop virtual card
- the hda-intel pcm device
- the hda-intel hdmi device
- the virmidi virtual device
- the usb card
We fix the sound card order:
options snd slots=snd-aloop,snd-hda-intel,snd-hda-intel,snd-virmidi,snd-usb-audio
options snd-hda-intel index=1,2 model=1002:1637,1022:15e3
The cards index start from 0. For more details about that file, see Alsa Opensrc Org support page for multiple sound cards configuration.
To get the model strings, use lspci (or lsusb for USB cards):
root #
lspci
04:00.1 Audio device: Advanced Micro Devices, Inc. [AMD/ATI] Renoir Radeon High Definition Audio Controller
04:00.6 Audio device: Advanced Micro Devices, Inc. [AMD] Family 17h/19h HD Audio Controller
root #
lspci -s 04:00.1 -n
04:00.1 0403: 1002:1637
root #
lspci -s 04:00.6 -n
04:00.6 0403: 1022:15e3
We instruct the kernel to load the virtual sound cards:
snd-aloop
snd-virmidi
Software
Portage knows the global USE flag alsa
for enabling support for ALSA in other packages. Enabling this USE flag will pull in media-libs/alsa-lib automatically (default in x86 and amd64 desktop profiles):
root #
euse -E alsa
The euse command is part of app-portage/gentoolkit.
USE flags for media-libs/alsa-lib Advanced Linux Sound Architecture Library
alisp
|
Enable support for ALISP (ALSA LISP) interpreter for advanced features. |
debug
|
Enable extra debug codepaths, like asserts and extra output. If you want to get meaningful backtraces see https://wiki.gentoo.org/wiki/Project:Quality_Assurance/Backtraces |
doc
|
Add extra documentation (API, Javadoc, etc). It is recommended to enable per package instead of globally |
python
|
Add optional support/bindings for the Python language |
After setting this be sure to update the system so the changes take effect:
root #
emerge --ask --changed-use --deep @world
Once you have set the necessary USE flags, you may install the ALSA package. Begin the installation with an emerge command like so:
root #
emerge --ask media-libs/alsa-lib
The media-sound/alsa-utils package provides some tools for troubleshooting and testing the sound system. It is a good idea to merge the package if it is not already installed:
root #
emerge --ask media-sound/alsa-utils
Configuration
Files
- /etc/asound.conf - Global (system wide) configuration file.
- ~/.asoundrc - Local (per user) configuration file.
~/.asoundrc
This file can be optionally used so that on a per-user basis, ALSA defaults can be overridden. If the system has special hardware it is likely the card 0 and device 0 (the defaults) are not going to work.
One of the simplest changes is card and device. This is the case for me with an HDMI coming from an Nvidia card connected to an onboard Realtek ALC88* audio device.
defaults.pcm.!card 1
defaults.pcm.!device 7
If you can't seem to find the card number assigned to the device that is the sound card you intend to use, don't panic — the card number is internally a name, which you can use. If your card is listed like this...
user $
aplay -L
front:CARD=Generic,DEV=0 HD-Audio Generic, ALC282 Analog Front speakers
... then it means the ~/.asoundrc file should be like this:
defaults.pcm.!card Generic
defaults.pcm.!device 0
defaults.ctl.!card Generic
These settings disable all software mixing. To output everything at 96kHz, add
defaults.pcm.dmix.rate 96000
to the ~/.asoundrc file.When multiple sound cards are in use, the device numbers could be reordered across boots, such that using a name is advantageous.
If the correct name is unclear, a list of valid names can be easily obtained with:
user $
cat /sys/class/sound/card*/id
Here is output from a developer's system that has multiple sound cards:
user $
cat /sys/class/sound/card*/id
Q1U HDMI PCH C930e
Here we have the Q1U microphone as Q1U, the builtin HDMI as HDMI, the analog audio jacks as PCH and a webcam's builtin microphone as C930e. Any of these are valid names for the card.
Specifying numbers instead of names when multiple sound cards are used can result in device reordering across boots, which will prevent sound from working properly until the configuration file is edited to use the new number.
S/PDIF or HDMI .asoundrc
Background
Most sound cards allow passing through audio to an external consumer receiver or DAC using S/PDIF digital coaxial or optical cables. Doing so, preserves sound quality and compressed Dolby/DTS encoded material. Uncompressed Dolby/DTS or Bluray material require a HDMI connection. The more common mono or analog stereo cables cannot carry Dolby/DTS signals.
With a default installed ALSA installation, it is possible for a S/PDIF or HDMI connection to work out of the box (no .asoundrc file alterations). While only some applications, such as the web browser's Adobe Flash plugin will fail playing sound. As such, the below .asoundrc is usually required for most S/PDIF and HDMI connections. Also, any media applications open will need to be restarted for the .asoundrc files to take affect (i.e. web browsers using the Adobe Flash plugin).
Preference for connections versus media types
Basic analog
Basic analog (i.e. RCA) connections - Basic user. Quality depends on sound card DAC. Look for a sound card with a high SNR db level.
S/PDIF
S/PDIF provides good quality audio for music, videos, and DVD quality movies containing Dobly/DTS compressed signals. Most sound cards and motherboards, these days, provide some sort of S/PDIF port. Nowadays, it is more common to see S/PDIF Toslink ports on motherboards. Many computer games provide compressed Dolby/DTS signals.
S/PDIF digital coaxial
S/PDIF digital coaxial may have problems with voltage cross talk, but is more common as it only requires a simple mini jack or RCA coaxial cable.
S/PDIF optical (TOSLINK)
S/PDIF (TOSLINK) optical cable completely avoids possible electrical cross talk or interference among cables since it is fiber optic, however it is susceptible to signal degradation if the cable is bent too much. Audiophiles tend to favor this type of cable.
HDMI
HDMI (High-Definition Multimedia Interface) cable can carry compressed Dolby/DTS and uncompressed (i.e. Blu-ray) Dolby/DTS signals. The audio market has favored this connection, but still preserves S/PDIF connections. One concern being, HDMI cables are copper wire, still susceptible to electrical cross talk or interference, similar to S/PDIF Digital Coaxial connections.
HDMI optical cables are produced, but they are generally too expensive for the consumer market. If audiophiles have S/PDIF Optical ports, they will use the S/PDIF connections for other media such as music and DVD movies, while only using HDMI when needed for processing uncompressed Dolby/DTS encoded material such as Blu-ray media. Again, the basic user will likely just use HDMI, avoiding the fuss of changing configuration files.
Configuration
Find the digital output device:
user $
aplay --list-devices
Adjust the below file to use the card/device number.
pcm.!spdif {
type hw
card 0
device 1
}
pcm.!default {
type plug
slave {
pcm "spdif"
}
}
# Share a single card with multiple applications
#pcm.!default {
# type plug
# slave.pcm "dmix:CARD=0,DEVICE=1,RATE=48000"
#}
The above will not allow sound to be played from more than one sound application, or more than two sounds played at once through one sound card. In order to perform this task, the sounds are remixed with a slight degradation with sound quality. Most people listening to music, prefer not to allow this due to interruptions and decreased sound quality. However, for those that desire this, the above commented section of code will achieve this.
When playing sound files using aplay, the beginning of the playback will be clipped because the digital S/PDIF or HDMI connection is not held open and needs to be started each time a sound file is played. Notice Microsoft Windows both, holds open the receiver or DAC and remixes media on playback.
A/52, AC3, Dolby, DTS
Sound cards providing S/PDIF output can pass through lossy compressed multichannel audio. To my ears, the high bit rate compressed media has little loss in comparison to two channel CD or DVD audio. I surmise this is because we now have multichannels feeding multiple speakers. Hence, the more hardware, the equivelant or better sounding?
If a sound card states it has S/PDIF, it will likely pass through Dolby or DTS even though it does not specifically show a Dolby or DTS icon or listed within its features. This is because, when they do list Dolby or DTS, it is because they're providing software for upmixing, or providing the decoded signal through analog output.
HDMI will pass through uncompressed multichannel audio, but a video feed is interleaved as required by the HDMI specification. In comparison to DVD video and audio, I see and hear very little quality difference, if any! About the only thing I noticed between S/PDIF Toslink and HDMI, HDMI seems to amplify the signal by a few watts or 5db. (I conclude this is because of the higher bit rate?)
As such, S/PDIF is still quite popular, even today.
A S/PDIF or HDMI connection is required for passing through advanced encodings. Analog connections (RCA and minijacks) do not support any advanced encoding.
Decoding or encoding to Dolby or DTS requires a license. If you have already purchased a sound card with this multichannel support, then you likely already have a license. See this article for more information.
ALSA media-plugins/alsa-plugins package requires recompilation to include the ffmpeg USE Flag with the A/52 (pcm.a52encode) plugin.
root #
USE="ffmpeg" emerge -q media-plugins/alsa-plugins
Decode or playback
Recompile mplayer or another other favorite software player to include the ALSA libraries.
root #
USE="a52 dts" emerge -q media-video/mplayer
Add the multichannel codecs to mplayer.conf, so media attempting to be played has first been provided the option of hardware passthrough rather then down mixing.
ac=hwac3,hwdts,hwmpa,spdifac3,spdifeac3,spdifaac,spdifdts,spdifmpa,spdifthd,dts,ffaac,
You should now be able to pass through (and enjoy) almost any Dolby or DTS signal through S/PDIF to the receiver.
Encode to A/52
Upmix two channel audio to a A/52 multi-channel audio stream
To simulate A/52 encoded audio from normal one or two channel audio streams or files, ALSA can upmix using its A/52 plugin. (A/52 is also known as AC-3 or Dolby Digital encoding.)
A/52 upmixing preferred when playing computer games or watching video without Dolby/DTS encoded material, such as older Movies. Many sound card manufacturers provide their applications with a feature for software upmixing to Dolby Digital, and recommend enabling this upmixing when listening to such media, except for Music.
Upmixing to A/52 is frowned upon by audiophiles. As such, it is a user's preference to upmix all the sounds to A/52 before sending the stream to the consumer stereo receiver or DAC. Matter of fact, audiophiles prefer simple stereo, and further state stereo is still better quality than Dolby/DTS material or other audio encoded with gimmicks. Also, the consumer stereo or DAC likely possibly includes a feature for upmixing audio into five channel audio.
pcm.!default {
type plug:surroundaudio
}
ctl.!default {
type plug:surroundaudio
}
pcm.a52encode {
type a52
format S16_LE
channels 6
rate 48000
bitrate 448
}
pcm.surroundaudio a52encode
ctl.surroundaudio {
type hw
card 0
device 1
}
user $
speaker-test -Dsurroundaudio -c 6
Encode PCM 5.1 24-bit audio into a A/52 16-bit audio stream (for streaming via S/PDIF)
Also known as, encoding PCM 5.1 audio stream into a compressed Dolby Digital stream for playing over S/PDIF. No real need to use this if you're using HDMI, as HDMI can handle the bandwidth of a PCM 5.1 audio stream. S/PDIF Toslink has also supposedly been upgrade to do so also, but most hardware has yet to be upgraded to the new specifications, and some doubt it will ever happen.
For some reason, the previous .asoundrc section previously mentioned doesn't work with PCM 5.1 streams. Another issue I run into with 24 bit PCM 5.1 audio streams, they require downmixing from S24_LE to S16_LE bit format. Reason being, 24 bit is a common format for most media, however receivers can sometimes only decode 16 or 32 bit audio. Also, the S/PDIF can only handle 16 bit audio when encoding to multi-channel formats such as A/52, for the time being until S/PDIF TosLink hardware specifications are upgraded.
The following .asoundrc excerpt will encode a PCM 5.1 24 bit stream into a 16 bit A/52 stream, for streaming over S/PDIF.
#####
# Description: This will make it possible to use a52 with PulseAudio out of
# the box. It may be useful for other use cases. Just include
# this in the ~/.asoundrc file.
pcm.a52 {
@args [ CARD ]
@args.CARD {
type string
default 0
}
type plug
slave {
pcm {
type a52
card $CARD
bitrate 640 # Default 448
}
# Convert to S16 bit format, per SPDIF spec
format S16_LE # Required for current S/PDIF spec
}
}
user $
aplay -D pcm.a52 /home/me/Music/Led_Zeppelin/Celegration_Day/PCM51-24bit/*.wav
Clone audio for 2 or more devices
Sometimes you need to clone audio (example using 2 cloned screens with different inputs (first screen HDMI and second screen DVI + Analog audio)). This is a simple script that you can use as global or local configuration for clone 2 (or more) channels. You must adjust to your system the lines below commented lines. More information of the author of the script and forum discussion here.
ctl.!default {
type hw
# Set your default card
card 0
}
pcm.!default both
pcm.both {
type softvol
slave {
pcm {
type plug
slave {
pcm {
type route
slave {
pcm {
type multi
slaves.a.pcm {
type dmix
ipc_key 2589455
ipc_perm 0666
slave {
pcm {
# Add the default card - change to suit your sound card #1
type hw
card 0
device 0
}
buffer_size 4096
channels 2
}
}
slaves.b.pcm {
type dmix
ipc_key 4855689
ipc_perm 0666
slave {
pcm {
# Add the slave sound card - change to suit your sound card #2
type hw
card 1
device 7
}
buffer_size 4096
channels 2
}
}
slaves.a.channels 2
slaves.b.channels 2
bindings.0.slave a
bindings.0.channel 0
bindings.1.slave a
bindings.1.channel 1
bindings.2.slave b
bindings.2.channel 0
bindings.3.slave b
bindings.3.channel 1
}
}
ttable.0.0 1
ttable.1.1 1
ttable.0.2 1
ttable.1.3 1
}
}
}
}
control {
# Define volume control name
name PCM
# Set to the Default card
card 0
}
JACK audio connection kit
It is possible to interconnect JACK and ALSA. At that time of writing, the best solution and it look like to be the final one, is via the snd-loopback module and the jack ALSA plugin. For that, see JACK#ALSA - Bridging ALSA and JACK together. See JACK — describes the setup of a playing sound with JACK (JACK Audio Connection Kit)..
What follow is a general introduction to JACK, some parts of it can be outdated.
Jack provides an additional layer, to the already low latency ALSA drivers and applications, and further it guarantees a constant sound latency and synchronous operation of all its clients. Jack can only use one sound card at a time, and will provide separated outputs and inputs for each audio channel of the sound card. Jack further provides the ability to view, manipulate or pipe audio streams, both hardware and software streams, in a similar manner we use cables to interface different audio equipment. As example, JAMin can intercept an audio stream before exporting the stream to another audio application and/or through analog or S/PDIF outputs. The Jack user owned daemon, is usually started using qjackctl. The qjackctl utility provides many other functions including audio stream connections.
What Jack does not do, is handle A/52 encoded (AC-3 or Dolby/DTS) material on input; it is just a sound server that deal with separated channels of audio streams. And it has the capability to connect simultaneously and synchronously any output stream on any input, and any input to any output stream, that on any hardware and software audio component, and with a constant latency. This make JACK an outstanding tool for audio production and creation. The ac3jack tool can be used for encoding multiple separated audio channels to AC-3 streams.
When playing an A/52 encoded media, the player will request as many outputs from JACK than audio channels in the media. This will fail if your sound card doesn't have the requested amount of audio outputs, but will be fine otherwise. As example, you can use mplayer as usual, and configure it to output a 5.1 stream on a 7.1 output configuration, or a 7.1 stream on a 2 channels stereo output.
One solution is to configure your kernel and ALSA according to Jack installation instructions for providing low latency audio. Since ALSA is said to be already very efficient and low latency, providing very good quality playback with no additional mixing when stated within its .asoundrc file, unlike MS Windows, Jack probably isn't needed for most. The main audience of JACK is audio producers and musicians (in studio, live performances, DJ, ...). The proaudio-gentoo overlay is available with eselect-repository.
For an older solution using the zita-ajbridge, see Using an ALSA Loopback device and zita-ajbridge on the ProAudio Gentoo overlay wiki.
Using zita-ajbridge, it is also possible to add additional real sound cards into JACK. (Example needed)
Those who want to try JACK must know one thing: You will need a realtime kernel and rt operations only if you want to make a Digital Audio Workstation (DAW) with your computer, which necessitate something pulseaudio is not able to achieve: constant sound latency as low or lower than 20 msec (pulseaudio is not able to provide constant sound latency at all), and synchronous operations. JACK can also be an alternative to pulseaudio for an user that want a professional solution, see JACK#ALSA - Bridging ALSA and JACK together.
Hopefully this small brief section about Jack will give some quick insight about Jack's features, while reserving the details of Jack to a Wiki page specifically focused on Jack.
In the meantime, you can take a look at the Pro-Audio Gentoo Overlay Wiki.
Permissions
If the acl
USE flag enabled globally and a login daemon (e.g. systemd-logind or elogind) is being used (i.e the system is using a desktop profile) permissions to sound cards will be handled automatically. Permissions can be checked using getfacl:
user $
getfacl /dev/snd/controlC0 | grep larry
user:larry:rw-
A broader solution is to add the user you want to be able to access the sound card to the audio group:
root #
gpasswd -a larry audio
user $
grep audio /etc/group
audio::18:larry
You should logout and login again to make alsamixer work, otherwise running the alsamixer command will give you the error "cannot open mixer: No such file or directory"
Service
OpenRC
If using OpenRC start ALSA now using the service command:
root #
rc-service alsasound start
To have start ALSA at boot time, add it the boot runlevel using rc-update:
root #
rc-update add alsasound boot
systemd
If using systemd, ALSA state will be preserved and restored automatically across system restarts.
The status of ALSA can be checked using the systemctl command:
root #
systemctl status alsa-restore
Mixer
If you can't hear anything, the output channels may be muted. Unmute the channels with the desktop environment's mixer or with alsamixer by selecting the appropriate channels and pressing the M key to mute or unmute:
user $
alsamixer
Usage
Test speakers
If everything above is perfect, it should now be able to test the sound card and the speakers. The speaker-test command-line tool from package media-sound/alsa-utils (this should already be installed as per the previous recommendation).
user $
speaker-test -t wav -c 2
For configurations using a 5.1 surround sound system:
user $
speaker-test -t wav -c 6 -D surround51
Press Ctrl+C to interrupt the test.
Test microphone
If needed, select the audio device if no default one is provided and add the --device=hw:0,0
to the incantation of arecord, substituting the CardNumber,DeviceNumber in the integer fields.
The following will list possible devices.
user $
arecord --list-devices
You may also need to unmute the line or microphone channel. Open alsamixer and first select the sound card (i.e. F6), then press F4 to show the Capture Channels, "left/right cursor keys" to select the "Mic" channel and press Space to toggle CAPTURE the channel.
The following will record indefinitely until CTRL+C is depressed and provide a default 8000 Hz mono quality recording:
user $
arecord /tmp/test.wav
The following will provide will record for two seconds (--duration=2) using DAT 48000 Hz quality (--format=dat
) and display the curses vumeter in stereo (--vumeter=stereo
) and save to /tmp/test.wav.
user $
arecord --channels=1 --duration=2 --format=dat --vumeter=stereo /tmp/test.wav
Or optionally:
# Simple convenience wrapper to record then play back a temporary sound file.
# Usage: arecord-mic duration
function arecord-mic {
[[ $1 == *[![:digit:]]* ]] || return
typeset tmpFile
tmpFile=$(mktemp --suffix .wav) || return
typeset -a arecordOpts=(
-c 1 # number of channels
-D plughw:0,0 # device name
-d "$1" # duration
-f S32_LE # format
-r 48000 # sample rate
-V mono # VU meter type
)
arecord "${arecordOpts[@]}" -- "$tmpFile" && aplay -- "$tmpFile"
rm -f -- "$tmpFile"
}
Notice, arecord cannot record in S24_LE, and is only capable of recording using S16_LE or S32_LE formats. For the human ear, any audio resolutions greater than 24 bit (S24_LE) or 48000Hz are said to be indistinguishable to differentiate using the human ear. Reference Sampling (signal processing) Wikipedia, Audio sampling. Users should also specify channels=1, as all recordings are performed in mono/monaural when typically using the Microphone Input unless recordings are using the stereo Line Input. In order to further encourage arecord to record monaural or only one channel, using the device=plughw:0,0 is further specified. (Alleviates a common problem, microphone/mic playback only occurs on the right or left channels.)
Use mplayer or aplay to playback the saved file. I usually record in "dat" or atleast "cd" quality formats. DAT is best when benchmarking.
Tips
Try one of the many configuration options in PaulBredbury's asoundrc file.
Troubleshooting
Firefox, Chromium, and YouTube have no audio with custom .asoundrc but other apps do
Browsers are sometimes picky about ~/.asoundrc settings. If you're specifying the default audio device (likely given that most computers nowadays have an HDMI A/V output and the analog and HDMI audio outputs are viewed as two separate sound cards), try doing this specifically as follows:
defaults.pcm.card <number of your default sound card>
defaults.ctl.card <default sound card>
Since version 52, Firefox has made PulseAudio a hard requirement and dropped support for direct output to ALSA. To enable sound in these versions of Firefox enable the
pulseaudio
USE flag. See PulseAudio requirement breaks Firefox on ALSA-only systems. This limitation does not affect Firefox (version 52 only) built from sources (www-client/firefox).
Chromium is also not immune to problem. Both browsers either depend on pulseaudio to set up correct sample rate or in absence of pulseaudio set sample rate to 48000 as defacto standard in sound card world. So if you have 96000 hz sample rate, downgrade it to 48000 and sound will work once again.Sound card only available for one application
Sometimes one app essentially takes over all sound devices. This might even be for performance reasons.
Force the use of dmix instead of direct audio output (which is what most things use by default, such as Adobe Flash [which really means the browser] and Wine).
If the device is card 1 and device 7 (which is the case for Nvidia HDMI for me):
pcm.dmixed {
type asym
playback.pcm {
type dmix
ipc_key 5678293
ipc_perm 0660
ipc_gid audio
slave {
channels 2 # Make 6 or 5.1 channel
pcm {
format S16_LE # S32_LE
rate 48000 # Can also be 44100
type hw
card 1 # Your card
device 7 # Your device
subdevice 0 # Important?
}
period_size 1024
buffer_size 8192
}
bindings {
0 0
1 1
# Uncomment below if using 6 channel
# 2 2
# 3 3
# 4 4
# 5 5
}
}
capture.pcm "hw:0"
}
pcm.!default {
type plug
slave.pcm "dmixed"
}
Use of ~/.asoundrc is immediate and as long as you are not forcing the use of specific devices in any applications, they either will require a restart or will begin working immediately. One of the best tests is to run Chrome, go to YouTube, open a terminal, run mplayer with an audio or video file and see that you do not get an error about audio (such an error might be 'Device or resource busy').
Missing dialogue (sounds) with 4.0 speakers
If you're using a 4.0 sound card (like an old SB Live!) or 4.0 speakers in general, you may notice that in some games or movies the dialogues are very quiet or even missing. This is because most of those applications/movies support only either 2.0 (stereo) or 5.1 output. In order to achieve surround sound, the 5.1 audio track is used but the two excessive channels are discarded — the center channel (which usually carries dialogues) and subwoofer channel.
The above issue can be circumvented through creating a virtual device which will downmix 5.1 to 4.0, mixing the center and subwoofer channels with other audio channels.
pcm.downmix {
type route
slave {
# The sound card output to be used
pcm surround40
# Real number of output channels
channels 4
}
# ttable.A.B G
# where A - input channel
# B - output channel
# G - volume gain (1.0 = original)
# Copy channels 0-3
ttable.0.0 1
ttable.1.1 1
ttable.2.2 1
ttable.3.3 1
# Mix channel 4 (center) into front speakers, and a bit (0.3) into rear ones
ttable.4.0 1.0
ttable.4.1 1.0
ttable.4.2 0.3
ttable.4.3 0.3
# Mix channel 5 (subwoofer) mostly (0.6) into rear speakers, and a bit (0.3) into front ones
ttable.5.0 0.3
ttable.5.1 0.3
ttable.5.2 0.6
ttable.5.3 0.6
}
ctl.downmix {
type hw
card 0
}
HDMI/SPDIF 5.1 and 7.1 speaker testing
It is stated ALSA's speaker-test utility will not test more then two channel audio over HDMI or SPDIF. For this, you need to use mplayer, as quoted from ALSA's documentation.
Download either a 5.1 channel (FLAC) or 7.1 channel (FLAC) speaker test file:
Play the provided sound file; specifying the HDMI or SPDIF device, PCM file, and number of channels which will likely be either 6 (for 5.1 surround) or 8 (for 7.1 channel surround).
For testing 5.1 channel with mplayer:
user $
mplayer -channels 6 "/path/to/downloaded/flac_file.flac" -channels 6
For testing 7.1 channel:
user $
mplayer -channels 8 "/path/to/downloaded/flac_file.flac" -channels 8
To test mplayer with a none default device, pass the additional option
-ao alsa:device=hw=0.7
where the hw=
value is aligned with the appropriate device.Alternatively testing with VLC media player:
user $
cvlc /path/to/downloaded/flac_file.flac
APlay SPDIF/HDMI output has incorrect speaker channels
Now that you know how to use MPlayer to play a speaker test PCM WAV file per "HDMI/SPDIF 5.1 and 7.1 Speaker Testing" above, you now find APlay doesn't output to the speaker channels properly when using SPDIF/HDMI. With HDMI, this is likely caused by the snd_hda_intel HDMI audio module/driver which is used by other manufacturers such as NVidia HDMI aside from just Intel's HDMI hardware. As to why MPlayer does use the correct channels, MPlayer is usually under constant development and manually corrects this issue?
Another problem this solution pertains to, trying to play a 24-bit PCM 2.0 or PCM5.1 WAV files and finding APlay constantly refuses to play the stream, due to incorrect bit rate, etc.
To correct this for ALSA (APlay) with minimal alterations to the PCM streams, we'll need to remap the speaker channels within a ${HOME}/.asoundrc file. Add the following to the bottom of your ${HOME}/.asoundrc file. Also note, the below configuration is for both 5.1 and 7.1 audio, or you could further map/copy the two extra channels to your 5.1 channels incase you do not want to omit the audio from a 7.1 stream.
pcm.myHDMI {
type plug
slave {
pcm "hw:1,7"
format S32_LE
channels 6
}
ttable {
0.0= 1
1.1= 1
2.4= 1
3.5= 1
4.2= 1
5.3= 1
6.6= 1
7.7= 1
}
}
It seems that most HDMI to Stereo Receiver connections only stream 16 and 32 bit formats, skipping 24 bit. The above configuration up-mixes any PCM stream to 32 bit when using the pcm.myHDMI profile, as it is quite common to see PCM 2.0 and 5.1 24 bit audio files. It just doesn't seem right to down-mix everything to 16 bit, or use Float as the latter uses more processing power. (Users can also set an alias within their bashrc file for 16 bit or 24 bit incantations as well.)
Test the speaker routing using a surround test PCM file. (See the above previously mentioned "8 Channel Speaker Test".)
user $
aplay -D my.HDMI 8Channel.wav
Weak center channel on PCM 5.1 live music
If you have a multi-channel sound track or music with an apparently weak center channel, and the sound track is a live recording; it is possible to map the center channel to the rear channels. Note, the rear channels on live recordings usually contain only the audiance screaming with very little music.
The following incantation of mplayer specifies; your HDMI device of hw:1.7, your PCM 5.1 file, number of channels, the format (not needed if your receiver can natively handle 24 bit and in my case I need to upmix as my Yamaha HDMI receiver can only natively handle 16 or 32 bit audio), and then the mapping. Mapping as follows; specify this is a 6 channel audio stream, with 6 mappings immediately following, copy left front channel to left speaker, copy right channel to right speaker, copy center channel to left rear speaker, copy center channel to right rear speaker, copy center channel to center speaker, and finally copy the subwoofer channel to the subwoofer speaker.
user $
mplayer -ao alsa:device=hw=1.7 Music/MyAlbum/PCM51-24bit/01.MyMusic.wav -channels 6 -format s32le -af channels=6:6:0:0:1:1:4:2:4:3:4:4:5:5
See MPlayer's Channel manipulation.
Need to view more detailed information per ALSA stream?
If you need to look at an in-depth illustration of how your program is connecting to ALSA, use the /proc interface. You will need to substitute your relevant card/device details into the command below.
You should see a dump of information regarding the program and useful things like its sample rate(rate) and PID(owner_pid).
user $
cat /proc/asound/card2/pcm0p/sub0/*
access: RW_INTERLEAVED format: S16_LE subformat: STD channels: 2 rate: 44100 (44100/1) period_size: 5513 buffer_size: 22050 card: 2 device: 0 subdevice: 0 stream: PLAYBACK id: USB Audio name: USB Audio subname: subdevice #0 class: 0 subclass: 0 subdevices_count: 1 subdevices_avail: 0 state: RUNNING owner_pid : 934 trigger_time: 86393.193574796 tstamp : 86540.250594985 delay : 17714 avail : 4602 avail_max : 7379 ----- hw_ptr : 6485052 appl_ptr : 6502500 tstamp_mode: NONE period_step: 1 avail_min: 5513 start_threshold: 2147483647 stop_threshold: 22050 silence_threshold: 0 silence_size: 0 boundary: 6206523236469964800
HTML5 does not play in a browser
If there is no sound in any browser used (Firefox, SeaMonkey, Otter Browser, etc.) and ALSA generally works, there is a workaround that might solve this particular issue: try removing the /etc/asound.conf file.
root #
mv /etc/asound.conf /etc/asound.conf.old
Restart the browser and test the sound output for HTML5. It might just work now after applying this workaround.
HTML5 does not play in the Firefox browser
Some system motherboards (i.e. Asus Z87-EXPERT) cause Card 0 to be a MID device instead of a PCM device. The same driver module snd_hda_intel is used for both the MID and PCM cards on this motherboard. For some reason Firefox HTML 5 requires Card 0 of the snd_hda_intel no matter how you change it with asoundrc. You can make flash work using the asoundrc file, but HTML 5 audio is silent.
You must remap the PCM device in Linux as card 0 and remove the changes to asoundrc that were added to make Flash work. This wiki page indicates that you should compile the snd_hda_intel driver into the kernel. Using this configuration you must remap the card 0 and card 1 devices using boot parameters instead of a /etc/modprobe.d/alsa.conf file. For example the following kernel command line option will swap the MID and PCM card indicies so that the default card 0 is the PCM card:
snd-hda-intel.index=1,0
The module is named snd_hda_intel, but the boot parameter name is snd-hda-intel.
Laptops with HDMI audio output
Some laptops with an HDMI audio output will map /proc/asound/card0 as HDMI and therefore makes it default output device for applications as stated above in the Firefox section. Another way to remap is to add these two lines to /etc/modprobe.d/alsa.conf
# Set this to the correct number of cards.
options snd cards_limit=2
options snd-hda-intel index=1,0
Verify the order change by checking this command
user $
cat /proc/asound/cards
0 [PCH ]: HDA-Intel - HDA Intel PCH HDA Intel PCH at 0xf2534000 irq 45 1 [HDMI ]: HDA-Intel - HDA Intel HDMI HDA Intel HDMI at 0xf2530000 irq 46
This method only works if snd-hda-intel is compiled as a module not built-in
IPC semaphore - function not implemented
If you try to run the test procedure, and speaker-test returns an error about a function IPC semaphore not implemented, that is the option to activate in your Kernel :
General setup --->
[*] System V IPC
Headphones jack not working
Sometimes to get headset jack working, additional model information is needed for audio driver. For example, in case of Dell Latitude E7470 laptop with snd-hda-intel driver, this needs to be added to /etc/modprobe.d/alsa.conf:
options snd-hda-intel model=headset-mic
More setup information can be found in Linux kernel documentation Documentation/sound/hd-audio/models.rst.
State restoring udev/alsactl errors on boot
Due to partitioning, encryption, or having a split /usr system, these errors may appear on boot:
root #
journalctl -b | grep alsa
(udev-worker)[2594]: controlC2: Process '/usr/sbin/alsactl restore 2' failed with exit code 2. (udev-worker)[2611]: controlC0: Process '/usr/sbin/alsactl restore 0' failed with exit code 2. (udev-worker)[2579]: controlC1: Process '/usr/sbin/alsactl restore 1' failed with exit code 2.
To fix the issue, add TEST=="@sbindir@/alsactl"
to the following lines of this file like so:
TEST!="/etc/alsa/state-daemon.conf", TEST=="@sbindir@/alsactl", RUN+="/usr/sbin/alsactl restore $attr{device/number}"
TEST=="/etc/alsa/state-daemon.conf", TEST=="@sbindir@/alsactl", RUN+="/usr/sbin/alsactl nrestore $attr{device/number}"
See these references for further details and discussion.[1][2]
See also
- Power management/Soundcard — describes the setup of power management of sound devices.
- PulseAudio — a multi-platform, open source, sound server that provides a number of features on top of the low-level audio interface ALSA
- Pipewire — low-latency, graph-based, processing engine and server, for interfacing with audio and video devices.
External resources
- https://www.alsa-project.org/alsa-doc/alsa-lib/pcm_plugins.html - Official ALSA PCM (digital audio) plugin descriptions and configuration file examples.
- https://alsa.opensrc.org/MultipleCards - Alsa Opensrc Org support page for multiple sound cards configuration with examples.