跳转至内容

PC speaker

来自 ArchWiki
(重定向自 Beep)

PC speakerbeeper—是自第一台 IBM PC 以来的大多数个人电脑中内置的扬声器。该扬声器无法进行高质量的播放,仅作为发出哔哔声的简单听觉反馈方式。某些软件—例如网页浏览器、编辑器和终端—可能会发出哔哔声,用户可能希望听到也可能不希望听到。本文档旨在指导如何配置和/或完全禁用该扬声器。

在没有声卡或扬声器可用且需要简单音频通知的情况下,请参阅 #beep

机制

PC speaker 通常是连接在主板前置连接器上的物理单元。有些主板制造商根本不提供 PC speaker,而另一些则可能将 PC speaker 直接焊接到表面。笔记本电脑通常没有物理 PC speaker,但其 beeper 会路由到笔记本电脑的内置扬声器。在某些情况下,beeper 会在声卡的常规输出—即扬声器或耳机—上听到,这往往会出乎意料地响亮。

启动时,UEFI/BIOS开机自检 (POST) 过程中通常会产生一个哔哔声。较新的主板型号会省略 POST 哔哔声,以便快速启动到 操作系统。UEFI 用户界面通常允许切换 POST 哔哔声,但它无法将 PC speaker 配置为完全关闭。

系统启动到 Linux 并加载了 pcspkr 内核模块后,PC speaker 就可以被环境使用,由用户手动调用,并在一定程度上进行配置。

由于 PC speaker 直接由 CPU 控制,并且它们仅用于发出哔哔声,因此 PC speaker 不能用于播放音频文件。如果确实需要,卸载 pcspkr 模块并 安装 snd-pcsp-dkmsAUR 包可以提供基本的音频输出。

禁用 PC speaker

物理方式

移除 PC speaker 后,系统将无法产生哔哔声。这可以通过从主板上物理移除该单元(如果可能)来实现。某些制造商可能提供跳线开关来关闭它。

警告 一般不建议移除 PC speaker,因为它是一个诊断启动问题的有用工具,之后它可能会产生与故障源相关的独特哔哔声模式(请参阅您的主板手册)。一个更好的解决方案是在 UEFI 用户界面中关闭 POST 哔哔声,并按照下面的说明将 beeper 加入黑名单。如果您确实希望将其物理移除,强烈建议在此场景下将其放在一边。

全局

可以通过 卸载 pcspkrsnd_pcsp 内核模块来禁用 PC speaker

注意 这不会禁用您的整个声音系统,仅禁用 PC speaker。
提示 snd_pcsp 模块是 Linux 内核中用于 PC speaker 的驱动程序,它允许 PC speaker 充当原始声卡以产生完整的 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 speaker,您可以使用 less --quiet 启动它以静音文件结束事件的 PC speaker,或者使用 less --QUIET 完全静音。对于 man pages,启动 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 speaker,请参阅 #全局禁用

ALSA

对于大多数声卡,PC speaker 被列为一个 ALSA 通道,名称为 PC SpeakerPC BeepBeep。要静音扬声器,请使用 alsamixer(1)amixer(1),例如

$ amixer set 'PC Speaker' 0% mute

要取消静音该通道,请参阅 Advanced Linux Sound Architecture#Unmuting the channels

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 Developer Handbook 中有文档说明。

Plasma

响铃通知设置可以在 System Settings > Accessibility Options > Bell 中修改。

PulseAudio

使用 PulseAudio#X11 Bell Events 播放声音代替 PC speaker 哔哔声。

提示 PulseAudio 代理控件可能不会列出 PC speaker。如果 PC speaker 通道未在默认 ALSA 设备中列出,请尝试选择对应声卡的设备。

Xorg

$ xset -b

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

beep

beep(1) 是一个 PC speaker 哔哔声程序。 beep 在没有声卡和/或扬声器可用,且需要简单音频通知的情况下非常有用。

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

安装

安装 beep 包。

您可能还需要在 ALSA取消静音 PC speaker。

配置

beep 使用 /dev/input/by-path/platform-pcspkr-event-spkr 来控制 PC speaker,该设备属于 input 组,但上游不建议将用户添加到 input 组。要访问设备文件,必须设置正确的权限。

注意 beep 在通过 sudo、以 root 用户身份或作为 SUID root 运行时会中止。有关更多信息,请参阅 PERMISSIONS

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

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

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

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

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

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

用法

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

$ beep -f 500 -l 50 -r 2

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

另请参阅 beep(1) § Sound Volume

故障排除

HD Audio 省电模式会静音 PC speaker

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

有关更多信息,请参阅 Advanced Linux Sound Architecture/Troubleshooting#Power saving