1 蓝牙耳机不出声

有时候,蓝牙耳机成功连接之后,播放音乐时仍然是扬声器在出声。在 KDE 系统设置里选择播放设备,只能看到 PulseAudio,不能列出具体的音频设备(内部音频或蓝牙耳机),因此也无法指定。这个时候,可以先通过命令行列出当前可用的音频设备:

$ pacmd list-sinks | grep -e 'name:' -e 'index:'
    index: 3
        name: <alsa_output.pci-0000_00_1f.3.analog-stereo>
  * index: 7
        name: <bluez_sink.xx_xx_xx_xx_xx_xx.a2dp_sink>

然后就可以根据尖括号里的设备名称强制指定音频输出设备了:

$ pacmd set-default-sink bluez_sink.xx_xx_xx_xx_xx_xx.a2dp_sink

2 本地运行 PulseAudio 服务器

有时候我们想让 chroot 环境中的应用程序也能够发声。一个简单的办法是,在宿主端启动一个 PulseAudio 服务器,让 chroot 端的 PulseAudio 作为客户端连上来。为了方便宿主端开启和关闭服务,我们在宿主端创建一个脚本,文件名叫 paserver

#!/bin/sh

usage() {
  echo 'Usage: paserver <on|off>'
  exit 1
}

case "$1" in
  on )
    pactl load-module module-native-protocol-tcp \
        auth-ip-acl=127.0.0.1 auth-anonymous=1
    ;;
  off )
    pactl unload-module module-native-protocol-tcp
    ;;
  * )
    usage
    ;;
esac

在宿主端需要启动声音服务的时候,直接运行 paserver on,用完之后,运行 paserver off 就可以了,不需要每次都杀掉 pulseaudio 重新启动。

在客户端,由于客户端启动之后一定是需要连接服务端的,因此我们不采取类似服务端的动态加载模式,直接写到 PulseAudio 的配置文件里面。在客户端创建 ~/.pulse/default.pa,写入以下内容:

load-module module-native-protocol-unix

load-module module-null-sink

load-module module-stream-restore
load-module module-rescue-streams
load-module module-always-sink

load-module module-tunnel-sink-new server=127.0.0.1 sink_name=Pulse channels=2

这样客户端启动 PulseAudio 的时候就会直接连接服务端了。

另外,在正常的桌面环境下,PulseAudio 一段时间不使用之后会退出,需要再使用的时候,客户程序会通过 dbus 来重启它。在 chroot 环境下,滇狐没研究出如何配置自动重启 PulseAudio。因此一个比较偷懒的做法是把空闲时自动退出的功能给禁用掉。创建 ~/.pulse/daemon.conf,并写入以下内容就可以了:

exit-idle-time = -1
标签:Linux PulseAudio