ALSA

This article describes the setup of a sound card with ALSA (Advanced Linux Sound Architecture).

Hardware detection
To choose the right driver, first detect the used audio controller. You can use lspci for this task:

With the controller name you can find the needed driver in the ALSA SoundCard Matrix.

Kernel
You need to activate the following kernel options:

The  command can sometimes be helpful.

Software
Portage knows the global USE flag alsa for enabling support for ALSA in other packages. Enabling this USE flag will pull in automatically (default in x86 and amd64 desktop profiles):

The  command is part of.

The USE flags of are:

After setting this you want to update your system so the changes take effect:

You also want to install, if it isn't already pulled in:

Permissions
If you have the USE flag acl enabled globally and are using ConsoleKit (i.e you're using a desktop profile) permissions to sound cards will be handled automatically. You can check the permissions using getfacl:

A broader solution is to add the user you want to be able to access the sound card to the audio group:

Service
You can now start ALSA:

To start ALSA at boot time, add it your boot runlevel:

Mixer
If you can't hear anything, the output channels may be muted. Unmute the channels with your desktop environment's mixer or with alsamixer by selecting the appropriate channels and hitting the key to mute or unmute:

Test setup
If everything above is perfect, you should now be able to test your sound card and your speakers. We will use the speaker-test command line tool from package (this should already be installed as per our previous recommendation).

If you have a 5.1 system:

Press + to interrupt the test.

Advanced Configuration

 * Power management

~/.asoundrc
This file can be optionally used so that on a per-user basis, ALSA defaults can be overridden. You might have special hardware, or card 0 and device 0 (the defaults) are not going to work for you.

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.

You can find out what devices and cards you have with:

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 HDMI connections. The more common mono or analog stereo cables cannot carry Dolby/DTS signals.

You may find your S/PDIF or HDMI connection with default installed ALSA works with no .asoundrc file alterations. While only some applications, such as the Web browser 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. (ie. Web Browser with Flash plugin)

Basic Analog
Basic Analog (ie. 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's 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 Optical (Toslink) Cable completely avoids possible electrical cross talk or interference amongst cables as it's fiber optic, but is susceptible to signal degradation if the cable is bent too much. You'll find audiophiles tend to favor Optical/Toslink.

HDMI
HDMI can carry compressed Dolby/DTS and uncompressed (ie. Blueray) 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. There are HDMI Optical cables, but 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 Bluray media. Again, the basic user will likely just use HDMI, avoiding the fuss of changing configuration files around.

Configuration
Find your digital output device.

Adjust the below file to use your card/device number.

A/52, AC3, Dolby, DTS
Soundcards providing S/PDIF output can pass through lossy compressed multichannel audio. To my hears, the high bitrate 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 soundcard 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 it's features. This is because, when they do list Dolby or DTS, it's 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 bitrate?)

As such, S/PDIF is still quite popular, even today.

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.

ALSA media-plugins/alsa-plugins package requires recompilation to include the ffmpeg USE Flag with the A/52 (pcm.a52encode) plugin.

Decode or Playback
Recompile mplayer or your other favorite software player to include the ALSA libraries.

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.

You should now be able to pass through (and enjoy) almost any Dolby or DTS signal through S/PDIF to your reciever.

Upmix Two Channel Audio to a A/52 Multi-channel Audio Stream
To similate A/52 encoded audio from normal one or two channel audio streams or files, ALSA can upmix using it's 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's user preference if you want to upmix all your sounds to A/52 before sending the stream to your 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, your consumer stereo or DAC likely possibly includes a feature for upmixing audio into five channel audio.

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 bandwith 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. (Personally, I think HDMI is evil and only gives me problems, with little benefit.)

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.

JACK Audio Connection Kit
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 equipments. As example, JAMin can intercept an audio stream before exporting the stream to anther 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 (ie. 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 producion 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 smplayer 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.

What I suggest, 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 it's .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 ac3jack package is currently hosted by the pro-audio overlay available with layman.)

It is possible to interconnect JACK and ALSA. At that time of writing, the best solution is via the snd-loopback module and zita-*2* bridge. For that, 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)

If you want to try JACK, you must know one thing: if you are happy with pulseaudio, you don't need to setup a realtime kernel for JACK. You will need rt operations only if you want to make a Digital Audio Workstation (DAW) with your computer, which necessitate something pulseaudio is not able to archive: constant sound latencies as low or lower than 20 msec (pulseaudio is not able to provide constant sound latency at all), and synchronous operations. But if you want to make a DAW, JACK is definitely the way to go, and you will never look back.

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 maintaime, you can take a look at the Pro-Audio Gentoo Overlay Wiki.

Tips
Try one of the many configuration options in PaulBredbury's asoundrc file.

Test Mic Recording
If needed, select your audio device if no default one is provided and add the "--device=hw:0,0" to your incantation of arecord, substituting your CardNumber,DeviceNumber.

The following will list possible devices.

The following will record indefinitely until CTRL-C is depressed and provide a default 8000 Hz mono quality recording.

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.

Use mplayer or aplay to playback the saved file. I usually record in "dat" or atleast "cd" quality formats. DAT is best when benchmarking..

Soundcard 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 Flash, which really means your browser, and Wine).

If your device is card 1 and device 7 (which is the case for Nvidia HDMI for me):

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.

HDMI/SPDIF 5.1 and 7.1 Speaker Testing
It's 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.

Get the Microsoft's 8 Channel Speaker Test and unzip the file. (The file creates a sub directory named "8 Channel/", with files named "8_Channel_ID.wav" and "8_Channel_ID.wma".)

Play the provided sound file; specifying your HDMI or SPDIF device, PCM file, and number of channels which will likely be either 6 or 8.

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 file. Add the following to the bottom of your 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.

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's 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".)

Add the incantation to your bashrc file as an alias.

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 incanatation 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 reciever 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.

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). 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 firefox browser
Some system motherboards (ie. 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 html5 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 html5 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: