PC 扬声器

来自 ArchWiki

PC 扬声器 (蜂鸣器) 是自首个 IBM PC 以来,大多数个人电脑中内置的扬声器。此扬声器不具备高品质播放能力,仅用作以蜂鸣声形式提供的简单听觉反馈手段。某些软件,例如网页浏览器、编辑器和终端,可能会产生用户可能需要或不需要的蜂鸣声。本文档旨在指导用户配置和/或完全禁用扬声器。对于没有声卡或扬声器可用,但需要简单音频通知的情况,请参阅 #Beep

机制

PC 扬声器通常是一个物理单元,连接在主板的前面板连接器上。一些主板制造商根本不随主板附带 PC 扬声器,而另一些制造商可能将 PC 扬声器直接焊接在表面上。笔记本电脑通常没有物理 PC 扬声器,但蜂鸣器会路由到笔记本电脑的内置扬声器。在某些情况下,可以在声卡的常规输出(即扬声器、耳机)上听到蜂鸣声,这往往会出乎意料地响亮。

启动时,UEFI/BIOS 传统上会在开机自检 (POST) 期间生成蜂鸣声。最近的主板型号省略了 POST 蜂鸣声,转而快速启动到操作系统。UEFI 用户界面通常允许切换 POST 蜂鸣声,但无法配置完全关闭 PC 扬声器。

一旦系统启动进入 Linux 并且加载了 pcspkr 内核模块,环境就可以使用 PC 扬声器,用户可以手动调用它,并且可以在一定程度上对其进行配置。由于 PC 扬声器直接由 CPU 控制,并且它们仅用于蜂鸣,因此 PC 扬声器不能用于播放音频文件。如果确实需要这样做,卸载 pcspkr安装 snd-pcsp-dkmsAUR 可以提供基本的音频输出。

禁用 PC 扬声器

物理上

通过移除 PC 扬声器,系统将无法产生蜂鸣声。这可以通过从主板上物理移除该单元(如果可能)来实现。一些制造商可能会提供跳线帽来将其关闭。

警告: 通常不建议移除 PC 扬声器,因为它是在诊断启动问题时的有用工具,之后它可能会产生与故障来源相关的独特蜂鸣模式(请参阅您的主板手册)。更好的解决方案是在 UEFI 用户界面中关闭 POST 蜂鸣声,并将蜂鸣器列入黑名单,如下所述。但是,如果您确实希望物理移除它,强烈建议将其保留在手边以备不时之需。

全局地

可以通过卸载 pcspkrsnd_pcsp 内核模块 来禁用 PC 扬声器

注意: 这不会禁用您的整个声音系统,只会禁用 PC 扬声器。
提示: snd_pcsp 模块 是 PC 扬声器的 Linux 内核驱动程序,它允许 PC 扬声器像原始声卡一样工作,以产生完整的 PCM 音频。它显示为 ALSA 设备,并且还取代了 pcspkr 驱动程序以用于蜂鸣声。此模块在官方 Arch Linux 内核中不存在(除非您显式选择安装它,请参阅 snd-pcsp-dkmsAUR),但某些自定义内核默认包含它。
# rmmod pcspkr
# rmmod snd_pcsp

pcspkrsnd_pcsp 模块列入黑名单将阻止 udev 在启动时加载它们。创建文件

/etc/modprobe.d/nobeep.conf
blacklist pcspkr
blacklist snd_pcsp

在内核命令行上将其列入黑名单是另一种方法。只需将 module_blacklist=pcspkr,snd_pcsp 添加到您的 引导加载程序 内核行即可。

控制台

虚拟控制台

虚拟控制台 (TTY) 中,您可以使用 setterm(1) 将响铃持续时间设置为零毫秒

$ setterm --blength=0

支持 Readline 的 Shell

对于使用 Readline 库的 shell(例如 Bash),请取消注释 /etc/inputrc 中的此行(或将其添加到 ~/.inputrc

set bell-style none

Less 分页器

要在 less(1) 分页器中禁用 PC 扬声器,您可以启动它并使用 less --quiet 来静音 PC 扬声器以用于文件结尾事件,或使用 less --QUIET 完全静音。对于 帮助手册页,启动 man --pager="less --QUIET" 或设置 $MANPAGER$PAGER 环境变量

或者,您可以将以下行添加到您的 shell 配置文件

alias less='less --QUIET'
alias man='man --pager="less --QUIET"'

Arch Linux ISO

如果您想禁用 Arch Linux ISO 镜像上的初始化音调,您需要重新打包 ISO 镜像。为此,首先安装 libisoburnmtools 软件包。

从 ISO 镜像中提取 El Torito 引导镜像和 systemd-boot 配置 (loader.conf)

$ osirrox -indev archlinux-YYYY.MM.DD-x86_64.iso -extract_boot_images ./ -extract /loader/loader.conf loader.conf

使 loader.conf 可写,并从中删除 beep 选项

$ chmod +w loader.conf
$ sed '/^beep on/d' -i loader.conf

将修改后的 loader.conf 添加到 El Torito UEFI 引导镜像

$ mcopy -D oO -i eltorito_img2_uefi.img loader.conf ::/loader/

最后,使用修改后的引导镜像和 loader.conf 重新打包 ISO 镜像

$ xorriso -indev archlinux-YYYY.MM.DD-x86_64.iso \
	-outdev archlinux-YYYY.MM.DD-x86_64-silent.iso \
	-map loader.conf /loader/loader.conf \
	-boot_image any replay \
	-append_partition 2 0xef eltorito_img2_uefi.img
注意: 仅初始化音调将被禁用。启动后仍可能会播放蜂鸣声。要在启动后禁用 PC 扬声器,请参阅 #全局地

ALSA

对于大多数声卡,PC 扬声器都列为 ALSA 通道,名称为PC SpeakerPC BeepBeep。要使扬声器静音,请使用 alsamixeramixer,例如

$ amixer set 'PC Speaker' 0% mute

要取消通道静音,请参阅 高级 Linux 音频架构#取消通道静音

Cinnamon

Cinnamon 似乎播放“水滴”声音。要禁用它,请在 gsettings(1) 中设置

$ gsettings set org.cinnamon.desktop.wm.preferences audible-bell false

GNOME

使用 GSettings

$ gsettings set org.gnome.desktop.wm.preferences audible-bell false

GTK

将此行附加到 ~/.gtkrc-2.0

gtk-error-bell = 0

将相同的行添加到 $XDG_CONFIG_HOME/gtk-3.0/settings.ini 的 [Settings] 部分

[Settings]
gtk-error-bell = 0

这在 Gnome 开发者手册 中有文档记录。

Plasma

响铃通知设置可以在系统设置 > 辅助功能选项 > 响铃中修改。

PulseAudio

播放声音而不是 PC 扬声器蜂鸣声 使用 PulseAudio

提示: 如果默认 ALSA 设备未列出 PC 扬声器通道,请尝试选择与声卡对应的设备——PulseAudio 代理控件可能未列出 PC 扬声器。

Xorg

$ xset -b

您可以将此命令添加到启动文件(例如 /etc/xprofile)以使其永久生效。有关更多信息,请参阅 xprofilexset(1)

Beep

Beep 是一个高级 PC 扬声器蜂鸣程序。它适用于没有声卡和/或扬声器可用的情况,并且需要简单的音频通知。

提示: 用户可以在登录到虚拟控制台时创建简短的可听音调,有关详细信息,请参阅 Wikipedia:Bell character#Usage

安装

安装 beep 软件包。

您可能还需要在 ALSA 中取消静音 PC 扬声器。

配置

beep 使用 /dev/input/by-path/platform-pcspkr-event-spkr 来控制 PC 扬声器。对于 root 用户,无需配置。要以非 root 用户身份访问此设备文件,必须设置正确的权限。

注意: 如果 beep 通过 sudo(8) 运行,则会中止。有关更多信息,请参阅 PERMISSIONS

以下规则将允许任何登录到当前活动虚拟控制台会话的用户使用 PC 扬声器

/etc/udev/rules.d/70-pcspkr-beep.rules
ACTION=="add", SUBSYSTEM=="input", ATTRS{name}=="PC Speaker", ENV{DEVNAME}!="", TAG+="uaccess"

以前的解决方案不允许远程登录的用户(例如通过 OpenSSH)或以当前活动虚拟控制台会话中登录的用户以外的任何用户身份运行的进程使用 beep。或者,可以创建一个新的用户组,并使用相应的规则来设置设备文件的正确权限。使用此解决方案,beep 组中的任何用户都将能够控制 PC 扬声器

ACTION=="add", SUBSYSTEM=="input", ATTRS{name}=="PC Speaker", ENV{DEVNAME}!="", GROUP="beep", MODE="0620"

要强制重新加载规则和设备文件以应用新的用户权限而无需重启,请执行

# udevadm control --reload && rmmod pcspkr && modprobe pcspkr

用法

以下示例播放的声音比 beep 默认声音略高且更短——请参阅 beep(1) § 音调选项——并重复两次

# beep -f 500 -l 50 -r 2

收集使用 beep 播放各种音乐的 shell 脚本的仓库

另请参阅 beep(1) § 声音音量

故障排除

HD Audio 节能模式使 PC 扬声器静音

当 HD Audio 声卡处于节能模式时,PC 扬声器可能保持静音。显然——取决于硬件——蜂鸣声实际上是作为模拟输入馈送到声卡中的,如果声卡处于休眠状态,则会被忽略。您可以通过在一个虚拟控制台中播放音乐(以保持声卡唤醒),然后在另一个虚拟控制台中发出蜂鸣声来调试此问题。

有关更多信息,请参阅 高级 Linux 音频架构/故障排除#节能