On a new laptop I couldn’t get the external HDMI monitor to work with the nouveau drivers, so I installed the NVIDIA drivers (version 440).
The NVIDIA drivers worked perfectly and the external monitor could be configured, but it didn’t take too long to notice that the built-in audio wasn’t working.
Audio would only play through HDMI. Disconnecting the monitor wouldn’t make the built-in audio work again.
No audio from the built-in speakers or headphones on a laptop isn’t good.
Reverting to the nouveau drivers wouldn’t fix the audio. I have to say that I have become a fan of the ZFS rollback feature on 20.04 in a flash. You can revert the system to how it was before any update that borks things. You can try different troubleshooting solutions and go back if needed. Big fan.
So, how to get the audio to work again?
First find the audio driver being used. There are several ways to find what audio driver you are using:
$ inxi -iF
[...]
Audio:
Device-1: Intel Cannon Lake PCH cAVS driver: snd_hda_intel
Device-2: NVIDIA TU106 High Definition Audio driver: snd_hda_intel
Sound Server: ALSA v: k5.4.0-28-generic
[...]
$ lshw -c multimedia
*-multimedia
description: Audio device
product: TU106 High Definition Audio Controller
vendor: NVIDIA Corporation
physical id: 0.1
bus info: pci@0000:01:00.1
version: a1
width: 32 bits
clock: 33MHz
capabilities: bus_master cap_list
configuration: driver=snd_hda_intel latency=0
resources: irq:17 memory:b4000000-b4003fff
*-multimedia
description: Audio device
product: Cannon Lake PCH cAVS
vendor: Intel Corporation
physical id: 1f.3
bus info: pci@0000:00:1f.3
version: 10
width: 64 bits
clock: 33MHz
capabilities: bus_master cap_list
configuration: driver=snd_hda_intel latency=32
resources: irq:150 memory:b4618000-b461bfff memory:b4200000-b42fffff
$ lspci -v
[...]
00:1f.3 Audio device: Intel Corporation Cannon Lake PCH cAVS (rev 10)
Subsystem: CLEVO/KAPOK Computer Cannon Lake PCH cAVS
Flags: bus master, fast devsel, latency 32, IRQ 150
Memory at b4618000 (64-bit, non-prefetchable) [size=16K]
Memory at b4200000 (64-bit, non-prefetchable) [size=1M]
Capabilities: <access denied>
Kernel driver in use: snd_hda_intel
Kernel modules: snd_hda_intel, snd_sof_pci
[...]
01:00.1 Audio device: NVIDIA Corporation TU106 High Definition Audio Controller (rev a1)
Subsystem: CLEVO/KAPOK Computer TU106 High Definition Audio Controller
Flags: bus master, fast devsel, latency 0, IRQ 17
Memory at b4000000 (32-bit, non-prefetchable) [size=16K]
Capabilities: <access denied>
Kernel driver in use: snd_hda_intel
Kernel modules: snd_hda_intel
[...]
From the above we can see that the audio driver being used is snd_hda_intel, which is quite common.
Second, find out the audio codecs in use:
$ cat /proc/asound/card0/codec*
The output after installing the NVIDIA drivers that stopped the audio from working shows a lot of UNKNOWN and N/A entries:
Codec: Realtek ALC1220
Address: 0
AFG Function Id: 0x1 (unsol 1)
Vendor Id: 0x10ec1220
Subsystem Id: 0x155896e1
Revision Id: 0x100003
No Modem Function Group found
Default PCM:
N/A
Default Amp-In caps: N/A
Default Amp-Out caps: N/A
State of AFG node 0x01:
Power: setting=UNKNOWN, actual=UNKNOWN, Error, Clock-stop-OK, Setting-reset
Invalid AFG subtree
Codec: Intel Kabylake HDMI
Address: 2
AFG Function Id: 0x1 (unsol 0)
Vendor Id: 0x8086280b
Subsystem Id: 0x80860101
Revision Id: 0x100000
No Modem Function Group found
Default PCM:
N/A
Default Amp-In caps: N/A
Default Amp-Out caps: N/A
State of AFG node 0x01:
Power: setting=UNKNOWN, actual=UNKNOWN, Error, Clock-stop-OK, Setting-reset
Invalid AFG subtree
But a normal/working output would be similar to this:
Codec: Realtek ALC1220
Address: 0
AFG Function Id: 0x1 (unsol 1)
Vendor Id: 0x10ec1220
Subsystem Id: 0x155896e1
Revision Id: 0x100003
No Modem Function Group found
Default PCM:
rates [0x5f0]: 32000 44100 48000 88200 96000 192000
bits [0xe]: 16 20 24
formats [0x1]: PCM
Default Amp-In caps: N/A
Default Amp-Out caps: N/A
State of AFG node 0x01:
Power states: D0 D1 D2 D3 D3cold CLKSTOP EPSS
Power: setting=D0, actual=D0
GPIO: io=8, o=0, i=0, unsolicited=1, wake=0
IO[0]: enable=0, dir=0, wake=0, sticky=0, data=0, unsol=0
IO[1]: enable=0, dir=0, wake=0, sticky=0, data=0, unsol=0
IO[2]: enable=0, dir=0, wake=0, sticky=0, data=0, unsol=0
IO[3]: enable=0, dir=0, wake=0, sticky=0, data=0, unsol=0
IO[4]: enable=0, dir=0, wake=0, sticky=0, data=0, unsol=0
IO[5]: enable=0, dir=0, wake=0, sticky=0, data=0, unsol=0
IO[6]: enable=0, dir=0, wake=0, sticky=0, data=0, unsol=0
IO[7]: enable=0, dir=0, wake=0, sticky=0, data=0, unsol=0
Node 0x02 [Audio Output] wcaps 0x41d: Stereo Amp-Out
Control: name="Line Out Playback Volume", index=0, device=0
[...]
From all of the above we can determine that the audio driver used is snd_hda_intel and that the codec is Realtek ALC1220.
It is very likely that your driver will be the same but the codec might vary. If using snd_hda_intel you can lookup what model variant you need searching the codec name in this list:
https://www.infradead.org/~mchehab/rst_conversion/sound/hd-audio/models.html
For the ALC1220 the model name to use seems to be dual-codecs.
Edit your ALSA configuration file:
# vim /etc/modprobe.d/alsa-base.conf
and add this to the end of the file:
# Manual entry to allow audio via headphones because NVIDIA drivers break the built-in audio
options snd-hda-intel model=clevo-p950
options snd-hda-intel probe_mask=0x1
I used the wrong model name by mistake. I meant to use dual-codecs but I used the model name just below in the list: clevo-p950. It worked and as it worked I haven’t gone back to edit it.
After updating your alsa configuration file reboot.
Just be more careful than me and choose the model name that matches your system.
After rebooting the audio from the built-in speakers and headphones were working.
You can change the output being used from your settings or using PulseAudio‘s volume control.