PC 扬声器

出自 ArchWiki

PC 扬声器 (蜂鸣器) 是自首台 IBM PC 以来大多数个人电脑中内置的扬声器。此扬声器不具备高品质回放能力,仅用作以蜂鸣声形式提供的简单听觉反馈手段。某些软件,例如 Web 浏览器、编辑器和终端,可能会发出用户可能需要或不需要的蜂鸣声。本文旨在指导您配置和/或完全禁用扬声器。对于没有声卡或扬声器可用但需要简单的音频通知的情况,请参阅#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 音频架构/故障排除#省电