Table of Contents

ALSA-only audio on Linux

this is a guide on how to setup ALSA to be enjoyable by itself without an audio server.

I will be showing changes to /etc/asound.conf as to effect all users (including daemons such as MPD). you can also use ~/.asoundrc for setup specific to your user.

devices

multiple commands can list available audio cards and devices.

alsactl can be used:

$ alsactl info 1
#
# Sound card
#
- card: 1                    # card number.
  id: sofhdadsp
  name: sof-hda-dsp
  longname: 
  driver_name: sof-hda-dsp
  mixer_name: Realtek ALC233
  components: 
  controls_count: 54
  pcm:
    - stream: PLAYBACK
      devices:
        - device: 1          # device number.
          id: HDA Analog (*) # name.
          name: 
          subdevices:
            - subdevice: 0
              name: subdevice #0
...

by default alsactl info will show card 0. you most likely have multiple cards.

aplay will also list sound cards and devices.

$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: HDMI [HDA ATI HDMI], device 0: HDMI 0 [HDMI 0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
...
card 1: sofhdadsp [sof-hda-dsp], device 1: HDA Analog (*) []
  Subdevices: 1/1
  Subdevice #0: subdevice #0
...

card 1 and device 1 will be used for this guide. in most places, this is specified with “hw:1,1”. the first number is the card and the second is the device.

mixing

dmix is a software mixer for audio output. it will allow multiple programs to simultaneously play sound at the same time.

in asound.conf, the following configuration could be used to create a software mixer that can be accessed by multiple users.

/etc/asound.conf
pcm.mixer {
  type dmix
  ipc_key 1024
  ipc_key_add_uid false  # remove these two lines to only allow
  ipc_perm 0666          #  one user to use the mixer at a time.
 
  slave {
    pcm "hw:1,1"         # hardware output device to use.
  }
}
 
pcm.!default plug:mixer  # set the default device to the mixer.

S/PDIF multichannel

the a52 alsa plugin can be used to output Dolby Digital 5.1 (or lower) multichannel audio through S/PDIF.

you must have the plugin installed. look in your distribution's repositories for a package similar to “alsa-plugins”. it may be in a separate package such as “alsa-plugins-a52”, as on Alpine Linux.

here is an example configuration:

/etc/asound.conf
pcm.surround {
        type a52
        slavepcm "hw:1,1"
 
        channels 6
        bitrate 1000
        rate 48000
        format S16_LE
}

equalization

alsaequal is a 10-band software equalizer in the form of an ALSA plugin.

each user has their own persistent settings, stored in ~/.alsaequal.bin. if, for example, you are running MPD as its own mpd user, you must either copy or link the alsaequal.bin file to its home directory, or manually configure it seperately.

the following configuration builds on the previous section on dmix. an asoundrc using solely alsaequal can be very simple.

/etc/asound.conf
pcm.dmix_stereo {
        type dmix
        ipc_key 1024
        ipc_key_add_uid false
        ipc_perm 0666
 
        slave {
                pcm "hw:1,1"
 
                period_time 0
                period_size 1024
                buffer_size 4096
                rate 48000
        }
        bindings {                     # channel configuration (stereo, quad, 5.1, ...).
                0 0
                1 1
        }
}
pcm.plug_eq_stereo {
        type equal
        slave.pcm "plug:dmix_stereo"
}
pcm.eq_stereo {                       # this plug is needed to make the alsaequal output suitable for use by most applications.
        type plug
        slave.pcm "plug_eq_stereo"
}
 
ctl.eq_stereo {                       # this ctl is what allows adjustment in alsamixer (or similar utilities).
        type equal
}
 
pcm.!default eq_stereo

with this configuration, the equalizer can be changed with ctl eq_stereo:

alsamixer -D eq_stereo

multichannel

here is an example of using alsaequal with a52.

/etc/asound.conf
...
 
pcm.surround {
        type a52
        slavepcm "hw:1,1"
 
        channels 6
        bitrate 1000
        rate 48000
        format S16_LE
}
pcm.plug_eq_surround {
        type equal
        channels 6                         # changes channel configuration to 5.1.
        controls ".alsaequal.surround.bin" # sets the control information file to at ~/.alsaequal.surround.bin. this must be changed if there are to be multiple alsaequals of differing channel configurations.
        slave.pcm "plug:surround"
}
pcm.eq_surround {
        type plug
        slave.pcm "plug_eq_surround"
}
 
ctl.eq_surround {
        type equal
        channels 6
        controls ".alsaequal.surround.bin"
}
 
...

the surround equalizer can be changed with ctl eq_surround using this configuration.