PC 扬声器
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 扬声器,系统将无法发出蜂鸣声。这可以通过从主板上物理移除该单元(如果可能)来实现。一些制造商可能会提供跳线帽来关闭它。
全局禁用
可以通过 卸载 pcspkr
和 snd_pcsp
内核模块 来禁用 PC 扬声器
snd_pcsp
模块 是 PC 扬声器的 Linux 内核驱动程序,它允许 PC 扬声器像原始声卡一样工作,以产生完整的 PCM 声音。它显示为 ALSA 设备,并且还替换了用于蜂鸣声的 pcspkr
驱动程序。此模块在官方 Arch Linux 内核中不存在(除非您明确选择安装它,请参阅 snd-pcsp-dkmsAUR),但某些自定义内核默认包含它。# rmmod pcspkr # rmmod snd_pcsp
将 pcspkr
和 snd_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 手册页,启动 man --pager="less --QUIET"
或设置 $MANPAGER
或 $PAGER
环境变量。
或者,您可以将以下行添加到您的 shell 配置文件
alias less='less --QUIET' alias man='man --pager="less --QUIET"'
Arch Linux ISO
如果您想禁用 Arch Linux ISO 上的初始曲调,您需要重新打包 ISO。为此,首先 安装 libisoburn 和 mtools 软件包。
从 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
ALSA
对于大多数声卡,PC 扬声器都列为 ALSA 通道,名称为 PC Speaker、PC Beep 或 Beep。要使扬声器静音,可以使用 alsamixer 或 amixer,例如
$ 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。
Xorg
$ xset -b
您可以将此命令添加到启动文件(例如 /etc/xprofile
)以使其永久生效。有关更多信息,请参阅 xprofile 和 xset(1)。
Beep
Beep 是一款高级 PC 扬声器蜂鸣程序。它适用于没有声卡和/或扬声器可用,但又需要简单音频通知的情况。
安装
您可能还需要在 ALSA 中 取消静音 PC 扬声器。
配置
beep 使用 /dev/input/by-path/platform-pcspkr-event-spkr
来控制 PC 扬声器。对于 root 用户,无需配置。要以非 root 用户身份访问此设备文件,必须设置正确的权限。
以下规则将允许任何登录到当前活动虚拟控制台会话的用户使用 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) § 声音音量。
故障排除
高清音频节能模式会使 PC 扬声器静音
当高清音频声卡处于节能模式时,PC 扬声器可能会保持静音。显然——取决于硬件——蜂鸣声实际上是作为模拟输入馈送到声卡中的,如果声卡处于休眠状态,则会被忽略。您可以通过在一个虚拟控制台中播放音乐(以保持声卡唤醒),然后在另一个虚拟控制台中发出蜂鸣声来调试此问题。
有关更多信息,请参阅 高级 Linux 声音架构/故障排除#节能。