欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Ubuntu无法通过HDMI输出声音且设置中输出设备无HDMI的解决办法

程序员文章站 2022-05-11 22:59:58
...

问题背景

Ubuntu系统经常出现没有声音的情况,大部分问题都可以在目前的中文网络上找到相对应的文章并进行解决。其中HDMI无法输出声音的问题,通常都可以通过:在“Settings-Sounds”切换输出设备、安装pavucontrol切换配置文件、运行alsamixer取消mute,这几个方法进行解决。

但是,笔者17年购入了目前所使用的Thinkpad P51(i7+M1200,联想官方声称该机型通过了ubuntu认证)并安装了Ubuntu 16.04,就遇到了通过HDMI接口外接显示器(或电视)后,无法通过显示器(或电视)端的声音设备输出声音的问题,且在尝试上述的三种解决方法时都无法找到切换为HDMI的选项,HDMI的声音输出选项仿佛在电脑中消失了。系统更新为18.04后该问题依然存在。

该问题长期悬而未决,终于近日(3年后的昨天)让笔者在Nvidia的开发者社区和freedesktop上找到了解决方法,记录在此供将来重装系统参考。

问题描述

事实上,这个问题14年就在freedesktop上被报告????,报告者用的是一台Dell XPS 15(GT 540M显卡),在Windows下正常使用,在Ubuntu下无法识别HDMI声音设备。1

17年9月再次出现在Nvidia的开发者社区????,这次报告者用的一块GTX1080显卡。同样是无法通过HDMI输出声音。2

可以通过下列三种方式来共同查看该问题的特征。

查看声卡

命令:

aplay -l

输出:

**** List of PLAYBACK Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: ALC298 Analog [ALC298 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 3: HDMI 0 [HDMI 0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 7: HDMI 1 [HDMI 1]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 8: HDMI 2 [HDMI 2]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 9: HDMI 3 [HDMI 3]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 10: HDMI 4 [HDMI 4]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

只有PCH [HDA Intel PCH]一种,找不到NVidia相关信息。

查看音频相关的pci设备

命令:

lspci | grep -i audio

输出:

00:1f.3 Audio device: Intel Corporation CM238 HD Audio Controller (rev 31)

同样找不到NVIDIA相关信息。

直接硬件访问再次查看音频相关的pci设备

命令:

sudo lspci -H1| grep -i audio

输出:

00:1f.3 Audio device: Intel Corporation CM238 HD Audio Controller (rev 31)
01:00.1 Audio device: NVIDIA Corporation Device 0fbc (rev a1)

这次有了NVIDIA相关信息了,说明并没有硬件问题。

解决方法

经笔者个人测试,方法一、二欠佳,可只看方法三。

方法一:重新扫描声卡

在freedesktop的帖子????中,报告者自己尝试了去解决这个问题。经过他的检查,发现重新扫描后可以检测到声卡。1

  • Start the system, and stop the display manager (lightdm/gdm)
  • Load the nouveau module
  • Remove the Nvidia card from the PCI bus (echo 1 > /sys/bus/pci/devices/0000:01:00.0/remove)
  • Rescan the PCI bus (echo “1” > /sys/bus/pci/rescan)

这个方法比较繁琐,不适合笔者这样的小白,而且并不能一劳永逸。

方法二:编写重扫脚本

Nvidia的开发者社区中帖子的2楼????提供了一个重扫脚本2

setpci -s 01:00.0 0x488.l=0x2000000:0x2000000
rmmod nvidia-drm nvidia-modeset nvidia
echo 1 > /sys/bus/pci/devices/0000:01:00.0/remove
echo 1 > /sys/bus/pci/devices/0000:00:01.0/rescan
modprobe nvidia-drm
xinit -- -retro

略简单,但仍然不够自动化,且电脑每次开机或从睡眠、待机中恢复时仍需要重新运行。

方法三:安装控制模块

在freedesktop的帖子的36楼????,一位叫Maik Freudenberg的大神将参考了这个解决思路写成了一个模块,并发布在了GitHub上,项目名为nvhda????。这个模块以C编写,使用方法在README.md中写的很明确了。3

笔者使用的是Ubuntu 18.04,使用过程如下。

安装模块

命令:

git clone git://github.com/hhfeuer/nvhda.git
cd nvhda
make
sudo make install

加载模块

命令:

sudo modprobe nvhda

打开HDMI声卡

命令:

sudo tee /proc/acpi/nvhda <<<ON

这时,如果再运行此前的aplay -llspci | grep -i audio应该都可以看到NVIDIA的相关信息了。在Settings-Sounds中也可以看到以HDMI为声音输出的选项了。

配置模块自动加载及声卡自动开启

此时声音已经可以通过HDMI设备输出,但每次重启后或从睡眠、待机中恢复,都需要重新加载模块、打开声卡。如想开机自启动或从睡眠、待机中恢复时仍然保持的话,仍需一些其他步骤:

自动加载模块

将模块名称nvhda贴入/etc/modules文件即可。
命令:

sudo gedit /etc/modules

贴入内容:

nvhda

自动开启声卡

大神已经也已在scripts中提供了自动开启的相关脚本,只需要将相关脚本复制进/etc/systemd/system并设置其启动就可以了。

命令:

sudo cp /scripts/nvhda-start.service /etc/systemd/system
sudo systemctl enable nvhda-start
sudo cp /scripts/nvhda-resume.service /etc/systemd/system
sudo systemctl enable nvhda-resume

查看声卡状态

命令:

cat /proc/acpi/nvhda

ON为开启,OFF为关闭

关闭HDMI声卡

如果需要关闭HDMI声卡,则命令为:

sudo tee /proc/acpi/nvhda <<<OFF

问题原因

Nvidia的开发者社区中帖子的2楼????提到,这是因为一些笔记本在启动时禁用了 GPU的PCI音频设备。2

For some reason, a lot of recent laptops are set up to boot with the GPU’s PCI audio function disabled. I haven’t done much investigation, but you can turn on the audio function and make the kernel see it by setting the appropriate PCI configuration bit and then telling the kernel to rescan the PCI bus on the PCI bridge the GPU is connected to.
Unfortunately, the kernel won’t see the audio function unless you remove the graphics function first, which temporarily breaks the console. Because of that, it works best if you write a script to do it so you don’t have to SSH into the system or try to type the commands into the console blind. Obviously, you have to stop the X server first so that you can unload the NVIDIA drivers.


  1. [NVC1] HDMI audio device only visible after rescan ↩︎ ↩︎

  2. GTX 1060 - No Audio Over Hdmi - Only Hda Intel Detected - Azalia ↩︎ ↩︎ ↩︎

  3. hhfeuer/nvhda: Linux kernel module to toggle Nvidia HDMI audio device on/off on notebooks ↩︎