Default audio card in linux

There are a bunch of posts about making your audio work by default in Linux but none that just worked for me.

I had three separate problems:

  1. Getting sound
  2. Playing sound from multiple sources at the same time
  3. Audio card getting different numbers on reboot

Getting sound

Here I followed this excellent guide, here’s a summary:

Firstly identify card number and device number:

~> aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: Audio [TEAC AI-101 Audio], device 0: USB Audio [USB Audio]
Subdevices: 0/1
Subdevice #0: subdevice #0
card 1: Generic_1 [HD-Audio Generic], device 0: ALC1220 Analog [ALC1220 Analog]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: Generic_1 [HD-Audio Generic], device 1: ALC1220 Digital [ALC1220 Digital]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 2: Generic [HD-Audio Generic], device 3: HDMI 0 [HDMI 0]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 2: Generic [HD-Audio Generic], device 7: HDMI 1 [HDMI 1]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 2: Generic [HD-Audio Generic], device 8: HDMI 2 [HDMI 2]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 2: Generic [HD-Audio Generic], device 9: HDMI 3 [HDMI 3]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 2: Generic [HD-Audio Generic], device 10: HDMI 4 [HDMI 4]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 2: Generic [HD-Audio Generic], device 11: HDMI 5 [HDMI 5]
Subdevices: 1/1
Subdevice #0: subdevice #0

But to test with speaker-test we need info from the aplay -L command:

~> aplay -L
null
Discard all samples (playback) or generate zero samples (capture)
sysdefault:CARD=Audio
TEAC AI-101 Audio, USB Audio
Default Audio Device
front:CARD=Audio,DEV=0
TEAC AI-101 Audio, USB Audio
Front speakers
surround21:CARD=Audio,DEV=0
TEAC AI-101 Audio, USB Audio
2.1 Surround output to Front and Subwoofer speakers
surround40:CARD=Audio,DEV=0
TEAC AI-101 Audio, USB Audio
4.0 Surround output to Front and Rear speakers
surround41:CARD=Audio,DEV=0
TEAC AI-101 Audio, USB Audio
4.1 Surround output to Front, Rear and Subwoofer speakers
surround50:CARD=Audio,DEV=0
TEAC AI-101 Audio, USB Audio
5.0 Surround output to Front, Center and Rear speakers
surround51:CARD=Audio,DEV=0
TEAC AI-101 Audio, USB Audio
5.1 Surround output to Front, Center, Rear and Subwoofer speakers
surround71:CARD=Audio,DEV=0
TEAC AI-101 Audio, USB Audio
7.1 Surround output to Front, Center, Side, Rear and Woofer speakers
iec958:CARD=Audio,DEV=0
TEAC AI-101 Audio, USB Audio
IEC958 (S/PDIF) Digital Audio Output
...

Now we can test:

speaker-test -t sin -f 800 -Dfront:Audio -c2 # No sound for me
speaker-test -t sin -f 800 -Dsysdefault:Audio -c2 # This works!

Now we know that card 0: Audio [TEAC AI-101 Audio], device 0 is the card we want. Try this in ~/.asoundrc:

pcm.!default {
type plug
slave {
pcm "hw:0,0"
}
}
ctl.!default {
type hw
card 0
}

If we instead have for example card 1, device 2 then we use hw:1,2 and card 1.

Do speaker-test -t sin -f 800 to test or something else like youtube.

Sound from multiple sources

Directly from the same guide:

pcm.!default {
type plug
slave.pcm "dmixer"
}
pcm.dmixer {
type dmix
ipc_key 1024
slave {
pcm "hw:0,0"
period_time 0
period_size 1024
buffer_size 4096
rate 44100
}
bindings {
0 0
1 1
}
}
ctl.dmixer {
type hw
card 0
}

Make sure to use your card and device numbers.

Different card numbers after reboot

After reboot the card number changed, it changed between 0, 1 and 2.

There were various suggestions online but most didn’t work. I found one suggestion somewhere that said I could just use the card name. I randomly tried something that worked!

card 0: Audio [TEAC AI-101 Audio], device 0: USB Audio [USB Audio]

The name of the card is “Audio” and the ~/.asoundrc becomes:

pcm.!default {
type plug
slave.pcm "dmixer"
}
pcm.dmixer {
type dmix
ipc_key 1024
slave {
pcm {
type hw
card "Audio"
device 0
}
period_time 0
period_size 1024
buffer_size 4096
rate 44100
}
bindings {
0 0
1 1
}
}
ctl.dmixer {
type hw
card "Audio"
}

Much simpler than messing around with udev to get the card to always occupy the same card number, especially since I often turn on and off the amplifier.