蓝牙耳机

来自 Arch Linux 中文维基

目前存在三种蓝牙音频系统:

  • A2DP (advanced audio distribution) 提供了音乐级立体声输出(sink),通常不支持输入(source)。
    • A2DP 可以使用很多中编码格式。标准的 SBC 质量和压缩比的处理不是很好,而更好的开源替代(LDAC, AptX)被广泛使用。
    • AVRCP 在 A2DP 上层提供播放控制。
  • HFP/HSP (hands-free/headset) 体用了语音级单声道输入和输出。HFP 是基于 HSP 的,在上层工作。
  • LE Audio 是低功耗音频标准,于2020 年发布。标准编码格式是 LC3。

内核、BlueZ 5 和 PipeWire 支持上述三种配置。PulseAudio 和 ALSA等老的声音服务器仅支持 A2DP 和 HFP/HSP。尽管蓝牙的不稳定已经臭名昭著[1], 最近蓝牙软件栈已经有了很大提升,所以使用常见硬件,比如 Intel 蓝牙芯片的时候,痛苦大大减轻了。

通过 Pipewire 连接耳机[编辑 | 编辑源代码]

PipeWire 提供简单易用的蓝牙耳机配置方式,可以无缝替换 PulseAudio。PipeWire 内置了对 A2DP 的支持,可以使用 SBC/SBC-XQ、AptX、LDA 及 AAC 蓝牙音频编码,同时也支持 HFP/HSP 蓝牙音频协议。

安装软件包 pipewire-pulse (将会替代 pulseaudiopulseaudio-bluetooth)。

守护程序将会自动启动用户服务。请使用 pavucontrol 或桌面环境提供的“设置”应用程序设置 PipeWire。更多信息请查看 PipeWire#Bluetooth devices

Troubleshooting[编辑 | 编辑源代码]

本文或本章节可能需要合并到PipeWire#Troubleshooting

附注: The section on this page just links to Pipewire which has its own troubleshooting section.(在 Talk:蓝牙耳机 中讨论)

由于耳机和PipeWire之间的同步,音频音量高[编辑 | 编辑源代码]

Since version 0.3.26, PipeWire uses "hardware volume" to link the volume of the headphones with the system, making it impossible to change one without the other. On some devices, this may result in the lowest possible volume being uncomfortably loud, and volume controls becoming too coarse. Hardware volume can be disabled using either WirePlumber or Pipewire Media Session.

Using WirePlumber[编辑 | 编辑源代码]

If it doesn't exist, create the directory /etc/wireplumber/bluetooth.lua.d/ to disable hardware volume system-wide, or ~/.config/wireplumber/bluetooth.lua.d to disable it only for your user. Then, copy /usr/share/wireplumber/bluetooth.lua.d/50-bluez-config.lua to the directory you created. Edit the file, and change the line

--["bluez5.enable-hw-volume"] = true

to

["bluez5.enable-hw-volume"] = false

Restart the system or the PipeWire services for the changes to take effect.

Using Pipewire Media Session[编辑 | 编辑源代码]

If it doesn't exist, create the directory /etc/pipewire/media-session.d/ to disable hardware volume system-wide, or ~/.config/pipewire/media-session.d/ to disable it only for your user. Then, copy /usr/share/pipewire/media-session.d/bluez-monitor.conf to the directory you created. Edit the file, and add the line

bluez5.enable-hw-volume = false

Restart the system or the PipeWire services for the changes to take effect.

通过 Bluez5/PulseAudio 连接蓝牙耳机[编辑 | 编辑源代码]

本文或本章节可能需要合并到Bluetooth

附注: Significant redundancy with general setup on Bluetooth page. Should be merged there. Headset-specific info would stay on this page.(在 Talk:Bluetooth#Merging general setup from Keyboard, Mouse, Headset pages 中讨论)

安装软件包 pulseaudio-alsapulseaudio-bluetoothbluez-utils。其中 bluez-utils 提供了 bluetoothctl 工具。

注意: 在继续下一步之前,请确认蓝牙设备没有被 rfkill 占用。

通过命令行进行设置[编辑 | 编辑源代码]

启动 bluetooth.service

现在我们可以使用 bluetoothctl 命令行工具来配对、连接蓝牙。关于 bluetoothctl 的更多详细信息请查看蓝牙

运行以下命令进入 bluetooth 命令环境:

$ bluetoothctl

然后输入:

[bluetooth]# power on
[bluetooth]# agent on
[bluetooth]# default-agent
[bluetooth]# scan on

现在让你的蓝牙耳机进入配对模式,它应该很快就能被发现。如:

[NEW] Device 00:1D:43:6D:03:26 Lasmex LBT10

这里发现了一个名字是"Lasmex LBT10",对应 MAC 地址是00:1D:43:6D:03:26的设备。接下来我们使用这个MAC地址来配对:

# pair 00:1D:43:6D:03:26

配对成功后,你需要显式地连接设备。 (如果不起效,请尝试在连接蓝牙设备之前先使用 trust 命令)

# [bluetooth]# connect 00:1D:43:6D:03:26

如果出现连接错误 org.bluez.Error.Failed,先停止现存的 PulseAudio daemon 再重试:

$ pulseaudio -k
[bluetooth]# connect 00:1D:43:6D:03:26

最后,如果希望将来自动连接此设备:

[bluetooth]# trust 00:1D:43:6D:03:26

如果一切正常,可以在PulseAudio中看到一个独立的输出设备。

注意: 设备默认情况下可能是停用的。可以在pavucontrol的"Configuration"标签页里选择配置(OFF, A2DP, HFP)

现在可以通过pavucontrol的"Playback"和"Pecording"标签页重定向音频的输入、输出了。

现在可以禁用蓝牙发现新设备并退出此程序:

[bluetooth]# scan off
[bluetooth]# exit

设置自动连接[编辑 | 编辑源代码]

若要自动连接蓝牙耳机,需要启用 PulseAudio 的 switch-on-connect 模块。请添加以下几行到 /etc/pulse/default.pa

/etc/pulse/default.pa
### Automatically switch to newly-connected devices
load-module module-switch-on-connect
注意: 请确认蓝牙音频设备是被信任的。否则重新配对会失败。详细信息请查看 Bluetooth#Pairing

通过 GNOME Bluetooth 进行设置[编辑 | 编辑源代码]

注意: 由于一个现存的 bug,在 PulseAudio 9/10 下,通过如下方法无法使 A2DP Profile 启动,这可能导致声音质量劣化。#A2DP not working with PulseAudio提供了可能的解决方案。

可以使用 GNOME Bluetooth 作为一个图形化前端来简单地配置你的蓝牙耳机。

首先,确保 bluetooth.service systemd 单元正在运行。

打开 GNOME Bluetooth,开启蓝牙、扫描设备、在设备列表中选择蓝牙设备进行连接。可以在设备配置菜单中直接进入声音控制面板中。当设备已连接后,声音控制面板中将会出现一个新的播放设备。

LDAC/aptX 编码[编辑 | 编辑源代码]

PulseAudio 15.0 已经支持 LDAC/aptX 蓝牙音频编码,通过下列代码进行检查:

$ pactl list | grep a2dp_codec

常见问题及解决方案[编辑 | 编辑源代码]

注意: 有很多用户报告 A2DP/蓝牙 耳机不能正常工作。更多信息请查看 #在 HSP/HFP 和 A2DP 配置间切换

音质差/底噪/声音浑浊[编辑 | 编辑源代码]

如果音质很差,很可能是因为你的耳机没有被正确配置。 查看 #在 HSP/HFP 和 A2DP 配置间切换来解决这个问题。

If you suspect the bad sound quality is due to a poor bluetooth connection, you might compensate for it by switching to a lower bit-rate and lower audio quality codec such as SBC or aptX using pactl:

$ pactl send-message /card/bluez_card.XX_XX_XX_XX_XX_XX/bluez switch-codec '"sbc"'

where a list of available codecs can be obtained by:

$ pactl send-message /card/bluez_card.XX_XX_XX_XX_XX_XX/bluez list-codecs

已经选择音频配置,但耳机没有激活,不能重定向音频[编辑 | 编辑源代码]

音频配置的菜单项在设备还没有成功连接的时候就已经存在了,但它并不能起作用。这个菜单项似乎是在设备被发现的时候就马上创建了。

确认一下 bluetoothctl 是以 root 权限运行;然后手动连接设备。有配置选项可以避免每次都需要手动连接,但是配对和信任并不会导致自动连接。

授权失败导致配对失败[编辑 | 编辑源代码]

如果配对失败,可以尝试禁用 SSPMode:

# btmgmt ssp off

# btmgmt ssp on

运行这个命令时,可能需要关闭蓝牙。

配对成功, 但连接失败[编辑 | 编辑源代码]

可能在 bluetoothctl 里面看到下面的错误:

[bluetooth]# connect 00:1D:43:6D:03:26
Attempting to connect to 00:1D:43:6D:03:26
Failed to connect: org.bluez.Error.Failed

你可以查看 bluetooth.service单元状态或通过以下命令查看日志以进一步定位问题:

# journalctl -n 20

你可能会在日志里看到下面类似的信息:

bluetoothd[5556]: a2dp-sink profile connect failed for 00:1D:43:6D:03:26: Protocol not available

这是因为没有安装pulseaudio-bluetooth 包导致的。 如果确实没有安装,安装一下这个包,然后重启一下PulseAudio

问题也可能由权限问题引发。如果 root 用户可以连接蓝牙设备而普通用户不可,请将你的用户添加到 lp 用户组,再重启 pulseaudio。 参考:/etc/dbus-1/system.d/bluetooth.conf

如果不是因为缺失包导致的, 很可能是PulseAudio没收到消息,一般重启一下PulseAudio就可以解决问题。 注意bluetoothctl和PulseAudio不需要在相同的用户下运行,bluetooth在root环境下运行,而PulseAudio在用户环境下运行也可以很好的工作。 重启PulseAudio后,不需要重新配对,直接重连即可。

如果重启PulseAudio后,仍然不能正常工作,你需要重新加载 module-bluetooth-discover 模块。

# pactl load-module module-bluetooth-discover

你可以把同样的加载命令添加到 /etc/pulse/default.pa,让PulseAudio启动时自动加载。

如果仍然不能正常工作,或者你使用的是系统级别的PulseAudio,下面的模块也需要加载一下(同样可以把他们加到 default.pasystem.pa 里面):

module-bluetooth-policy
module-bluez5-device
module-bluez5-discover

也可能是因为 /var/lib/bluetooth/ 缺少写权限。可以通过移除再重新配对设备来使其工作,但重启后问题会再次出现。恢复写权限会修复问题:

# chmod -R u+w /var/lib/bluetooth

连接成功,但声音播放总有小杂音[编辑 | 编辑源代码]

如果蓝牙与 WiFi 设备为同一个硬件,这非常有可能发生。因为它们共享了同一个天线甚至是频段(2.4GHz)。尽管在 Windows 上它们可以共同工作,但在 Linux上不行。

一个可能的解决方案是让 WiFi 工作在 5 GHz,从而使得它们不会互相干扰。如果网卡/路由器不支持 5GHz WiFi,可以升级 WiFi 固件或驱动。这个方法对 Realtek 8723BE 配合最新版 rtl 驱动(AUR)有效。

如果难以使用以上方法,一个不那么有效的方法是在 PulseAudio 输出端优化信号元包大小与延迟时长来试图补偿信号干扰问题。需要选择合适的参数值大小,因为这有可能使得音画不同步。若要设置更改蓝牙耳机的延时(以更改到125000微秒为例):

$ pactl set-port-latency-offset <bluez_card> headset-output 125000

其中蓝牙驱动器的ID号可以通过如下命令获得:

$ pacmd list-sinks | egrep -o 'bluez_card[^>]*'

元包大小可以在配置文件 /etc/pulse/daemon.conf 中设定,重启 PulseAudio 生效。更多信息请参考 PulseAudio/Troubleshooting#Setting the default fragment number and buffer size in PulseAudio

对于某些特定的蓝牙适配器,添加 options ath9k btcoex_enable=1/etc/modprobe.d/ath9k.conf 中可能会有帮助

/etc/modprobe.d/ath9k.conf
# possibly fix for sound glitches
options ath9k btcoex_enable=1

之后重启 PulseAudio 服务。

连接成功,但无法播放声音[编辑 | 编辑源代码]

确定你在系统日志里面可以看到如下信息:

bluetoothd[5556]: Endpoint registered: sender=:1.83 path=/MediaEndpoint/A2DPSource
bluetoothd[5556]: Endpoint registered: sender=:1.83 path=/MediaEndpoint/A2DPSink

如果你可以看到类似的信息,说明蓝牙没有问题,你可以去检查PulseAudio的配置问题了。否则的话,退回来再次确认蓝牙是否已经连接成功。

此页面或章节适合移动到 PulseAudio/Troubleshooting

附注: The following seems to be general issue: [2](在 Talk:蓝牙耳机 讨论)


如果使用的是GDM, PulseAudio 的另外一个实例可能已经启动,并且“捕获”了你的蓝牙连接。这种情况可以通过屏蔽GDM用户的pulseaudio socket来解决:

# mkdir -p  /var/lib/gdm/.config/systemd/user
# ln -s /dev/null  /var/lib/gdm/.config/systemd/user/pulseaudio.sockett

重启电脑后,PulseAudio的第二个实例将不再启动。

bluez 可能会错误地认为某个蓝牙耳机不兼容 A2DP。这种情况下,首先确定蓝牙设备的标号:

$ pacmd ls

在输出中应当会有一段关于蓝牙耳机的内容,类似于:

$ pacmd ls
index: 2
        name: <bluez_card.XX_XX_XX_XX_XX_XX>
        driver: <module-bluez5-device.c>
        owner module: 27
        properties:
                device.description = "SONY MDR-100ABN"
                device.string = "XX:XX:XX:XX:XX:XX"
                device.api = "bluez"
                device.class = "sound"
                ...

若要手动更改配置文件,运行以下命令:

$ pacmd set-card-profile 2 a2dp_sink

其中 2 是通过 pacmd ls 得到的设备标号。

连接成功,声音播放正常,但播放暂停后再继续就会播放卡顿[编辑 | 编辑源代码]

如果原先声音播放正常,但蓝牙连接空闲后再恢复播放就会出现卡顿/高延迟/无声,可以尝试禁用 PulseAudio 的音源/音响空闲自动挂起功能。这是由 module-suspend-on-idle 模块控制的。

若要禁用 module-suspend-on-idle,将配置文件中的以下行注释掉:

~/.config/pulse/default.pa
### Automatically suspend sinks/sources that become idle for too long
#load-module module-suspend-on-idle

之后,重启 PulseAudio。

UUIDs has unsupported type[编辑 | 编辑源代码]

在配对的时候,你可能会在bluetoothctl看到如下信息:

[CHG] Device 00:1D:43:6D:03:26 UUIDs has unsupported type

这种情况很常见,没有影响,可以被忽略。

PC 上显示设备已经配对,但外设端无法识别 PC[编辑 | 编辑源代码]

这也许是因为设备不支持 Bluetooth LE 配对。

尝试在 /etc/bluetooth/main.conf 中设置 ControllerMode = bredr

更多信息查看此链接[3](关于 Bose QC 35)

设备连接成功,但随即断连[编辑 | 编辑源代码]

如果你的设备蓝牙连接失败或很快断连,并且在日志 (systemd/Journal) 中看到了如下内容:

bluetoothd: Unable to get connect data for Headset Voice gateway: getpeername: Transport endpoint is not connected (107)
bluetoothd: connect error: Connection refused (111)

这有可能是因为你已经在本电脑的蓝牙适配器上用其他操作系统配对了此蓝牙设备。有些设备不能处理来自同一 MAC 地址(例如:同一蓝牙适配器)的多次配对。你可以通过重新配对来修复问题:

$ bluetoothctl
[bluetooth]# devices
Device XX:XX:XX:XX:XX:XX My Device
[bluetooth]# remove XX:XX:XX:XX:XX:XX

之后,重启 bluetooth.service,开启蓝牙适配器并处于可被发现模式,重新扫描、重新配对。对于某些蓝牙管理程序,你可能需要重启电脑来从头进行设备扫描。

Apple Airpods 声音小[编辑 | 编辑源代码]

创建一个 bluetooth.servicedrop-in file,添加以下内容:

/etc/systemd/system/bluetooth.service.d/noplugin-avrc.conf
[Service]
ExecStart=
ExecStart=/usr/lib/bluetooth/bluetoothd --noplugin=avrcp

之后,重启 bluetooth.service,重新载入(reload)其配置文件,重新连接耳机。

另外,对于 Airpods Pro,请禁用空间音频功能,开启单声道模式(使用iPhone进行设置)。

Apple AirPods Pro 无法在 HSP/HFP 配置模式下工作,可以在 A2DP 配置模式下工作[编辑 | 编辑源代码]

如果 Airpods Pro 可以与 PluseAudio 正常工作,但无法兼容 HSP/HFP 配置模式(在 pavucontrolConfigurations 标签也下,通常被表明“不可用”),请尝试换用 pipewire-pulse

请注意,换用 pipewire-pulse(并重启电脑或某些 systemd service)后,HSP/HFP 应当可以使用了。但这也可能导致 A2DP 不可用(当选择为 A2DP sink 时,立即被取消选择,并选择到"OFF"模式)。遇到这个问题,请尝试删除/重命名 /var/lib/bluetooth 文件夹:

# mv /var/lib/bluetooth /var/lib/bluetooth.bak

重新配对你的蓝牙设备后,所有的配置模式理论上都应当可用了。你可以使用pavucontrolpacmd 进行选择。

HSP 问题:蓝牙音频源与播放设备都正常,但声音信号没有被在两者间正确传输[编辑 | 编辑源代码]

可能缺少某些固件或 SCO (audio protocol of HSP and HFP) 路由配置错误。

请查看[4]

BCM20702 所需固件:bcm20702a1-firmwareAUR or bcm20702b0-firmwareAUR.

Error: Failed to start discovery org.bluez.Error.InProgress[编辑 | 编辑源代码]

如果你的耳机可被发现,但由于 "Failed to start discovery org.bluez.Error.InProgress" 错误无法连接,请安装软件包 bluez-hciconfigAUR 并运行如下命令:

$ hciconfig hciX up
$ hciconfig hciX reset

其中 X 是你电脑的蓝牙适配器的标号(通常为 0)

之后应当就可以进行设备连接了。参考以下步骤:#通过命令行进行设置.

High audio volume due to synchronization between headphones and PulseAudio[编辑 | 编辑源代码]

As of PulseAudio 15, "Absolute Volume" interlocks the audio volume of your headphones with PulseAudio, making it impossible to change one without the other. On some headphones, e.g. on the Hoco W25, this may result in irritating loudness. To disable "Absolute Volume", edit /etc/pulse/default.pa and change the line

 load-module module-bluetooth-discover

to

  load-module module-bluetooth-discover avrcp_absolute_volume=false

在 HSP/HFP 和 A2DP 配置间切换[编辑 | 编辑源代码]

通过下面命令可以很容易的在两者间做切换:

$ pacmd set-card-profile card_number a2dp_sink

其中 card_number 可以通过 pacmd list-cards 命令获得。

For enabling automatic profile switching from A2DP to HSP when a recording stream appears without any role set, you can append auto_switch=2 to load-module module-bluetooth-policy in /etc/pulse/default.pa.

更多关于 PulseAudio 配置的说明请参考 PulseAudio 文档

PulseAudio 下 A2DP 不能工作[编辑 | 编辑源代码]

Socket Interface problem[编辑 | 编辑源代码]

对于 bluez 4.1+, PulseAudio 3.0+,若 PulseAudio 无更改到 A2DP 配置模式,你可以尝试禁用 Socket interface from /etc/bluetooth/audio.conf。在此文件中将行 Enable=Socket 改为 Disable=Socket

A2DP sink profile 不可用[编辑 | 编辑源代码]

当 A2DP 播放设备配置(A2DP sink profile) 不可用时,你无法将 PluseAudio 切换到 A2DP 输出,甚至 A2DP 播放设备不会被列出。可以通过 pactl 来确定是否是这种情况:

$ pactl list | grep -C2 A2DP
     Profiles:
             headset_head_unit: Headset Head Unit (HSP/HFP) (sinks: 1, sources: 1, priority: 30, available: yes)
             a2dp_sink: High Fidelity Playback (A2DP Sink) (sinks: 1, sources: 0, priority: 40, available: no)
             off: Off (sinks: 0, sources: 0, priority: 0, available: yes)
        Active Profile: headset_head_unit

无法通过 pacmd 手动设置声卡配置

$ pacmd set-card-profile bluez_card.C4_45_67_09_12_00 a2dp_sink
Failed to set card profile to 'a2dp_sink'.

对于 10.0 版本的 PulseAudio,当你通过 Bluedevil 或其他 BlueZ 前端连接蓝牙耳机时,这个问题可能会出现。

在第一次通过某些蓝牙控制器(例如0a12:0001, Cambridge Silicon Radio)与耳机配对时,这个问题同样可能出现。这些蓝牙控制器默认使用 HandsfreeHeadset - HS service,并且不允许切换到需要使用 AudioSink service 的 A2DP PulseAudio 音频播放设备。

可能的解决方案:

  • 对于某些耳机,连接成功后在蓝牙耳机段调整音量或播放/暂停音乐可能会触发 A2DP 配置,使其可用
  • 使用 bluez-utils 软件包中的 bluetoothctl 连接蓝牙耳机可能会使 A2DP 播放配置可用。fix-bt-a2dpAUR 可以在蓝牙设备连接后自动完成这一过程。详细使用方法请看[5]
[bluetooth]# connect headset_MAC_address
  • 手动切换到蓝牙的 AudioSink service 可能会使 A2DP 配置文件与 A2DP PulseAudio 播放设备可用。blueman 软件包中的 blueman-manager 可以帮你完成这一过程。你也可以使用 bluetoothctl 中注册 AudioSink service 的 UUID:
$ bluetoothctl
[bluetooth]# menu gatt
[bluetooth]# register-service 0000110b-0000-1000-8000-00805f9b34fb
[bluetooth]# quit
  • 禁用蓝牙耳机的配置文件
/etc/bluetooth/main.conf
[General]
Disable=Headset
  • 启用多配置文件模式。这可以使得蓝牙耳机同时支持 A2DP 以及 HSP/HFP
/etc/bluetooth/main.conf
[General]
MultiProfile=multiple
  • 有时以上方法都无效。你可能已经尝试过重启电脑、开关蓝牙。此时可以尝试重启 bluetooth.service
$ sudo systemctl restart bluetooth.service

Gnome with GDM[编辑 | 编辑源代码]

本文或本章节可能需要合并到#Connecting works, but I cannot play sound

附注: duplicate instructions(在 Talk:蓝牙耳机 中讨论)

The instructions below were tested on Gnome 3.24.2 and PulseAudio 10.0 however they may still be applicable and useful for other versions.

If PulseAudio fails when changing the profile to A2DP while using GNOME with GDM, you need to prevent GDM from starting its own instance of PulseAudio:

  • Prevent Pulseaudio clients from automatically starting a server if one is not running by adding the following:
/var/lib/gdm/.config/pulse/client.conf
autospawn = no
daemon-binary = /bin/true
  • Prevent systemd from starting Pulseaudio anyway with socket activation:
$ sudo -ugdm mkdir -p /var/lib/gdm/.config/systemd/user
$ sudo -ugdm ln -s /dev/null /var/lib/gdm/.config/systemd/user/pulseaudio.socket
  • Restart, and check that there is no PulseAudio process for the gdm user using:
$ pgrep -u gdm pulseaudio

Further discussion about this problem and alternative fixes can be found at [6] and [7]. Alternatively, one may try and install fix-bt-a2dpAUR.

HFP not working with PulseAudio[编辑 | 编辑源代码]

HFP-only bluetooth headsets may not be usable in the standard configuration of PulseAudio. The respective profiles occur, but they are not available:

  • bluetoothctl info output shows:
UUID: Audio Sink                (0000110b-0000-1000-8000-00805f9b34fb)
UUID: A/V Remote Control Target (0000110c-0000-1000-8000-00805f9b34fb)
UUID: A/V Remote Control        (0000110e-0000-1000-8000-00805f9b34fb)
UUID: Handsfree                 (0000111e-0000-1000-8000-00805f9b34fb)
  • pactl list of respective device shows:
...
Profiles:
      ...
      headset_head_unit: Headset Head Unit (HSP/HFP) (sinks: 1, sources: 1, priority: 30, available: no)

To solve the respective issue, update to pulseaudio (>=13) and potentially pulseaudio-modules-bt-gitAUR[损坏的链接:package not found] and bluez (>=5.5) to latest versions. Then install ofonoAUR (start and enable using systemctl) and phonesimAUR and create / activate a fake modem as described here [8]:

  • Create /etc/ofono/phonesim.conf with:
[phonesim]
Address=127.0.0.1
Driver=phonesim
Port=12345
  • Start as user:
$ phonesim -p 12345 /usr/share/phonesim/default.xml &
$ dbus-send --print-reply --system --dest=org.ofono /phonesim org.ofono.Modem.SetProperty string:"Powered" variant:boolean:true
  • Activate modem:
$ dbus-send --print-reply --system --dest=org.ofono /phonesim org.ofono.Modem.SetProperty string:"Online" variant:boolean:true
  • If you want to check the results of this, download ofono git sources ([9]) and call list-modems from the ofono/test directory. The output of the respective modem section should read like this:
...
[ /phonesim ]
  Online = 1
  Powered = 1
  Lockdown = 0
  Emergency = 0
  Manufacturer = MeeGo
  ...
  • Finally, restart pulseaudio and reconnect headset. Now, HFP should be available:
headset_head_unit: Headset Head Unit (HSP/HFP) (sinks: 1, sources: 1, priority: 30, available: yes)
注意: HFP support is not stable and may cause glitches with switching to A2DP; try reconnecting, if the needed mode is not available.

Disable auto switching headset to HSP/HFP[编辑 | 编辑源代码]

When using a bluetooth headset that supports multiple profiles, some applications switch to HSP/HFP profile automatically. If this behaviour is undesired you can disable this by appending the auto_switch=false parameter to the bluetooth-policy module:

/etc/pulse/default.pa
load-module module-bluetooth-policy auto_switch=false

Disable PipeWire HSP/HFP profile[编辑 | 编辑源代码]

Unlike PulseAudio, PipeWire does not automatically switch between A2DP and HSP/HFP in response to input events. However, rather than to enable automatically switching to the (lower audio quality) HSP/HFP profile if A2DP fails, you may prefer to disable the former altogether. To do so, create or edit a bluez configuration as shown below.

注意: HSP mode is required for built-in microphones to work [10].
/etc/wireplumber/wireplumber.conf.d/50-bluez.conf (or ~/.config/wireplumber/wireplumber.conf.d/50-bluez.conf)
monitor.bluez.rules = [
  {
    matches = [
      {
        ## This matches all bluetooth devices.
        device.name = "~bluez_card.*"
      }
    ]
    actions = {
      update-props = {
        bluez5.auto-connect = [ a2dp_sink ]
        bluez5.hw-volume = [ a2dp_sink ]
      }
    }
  }
]

monitor.bluez.properties = {
  bluez5.roles = [ a2dp_sink ]
  bluez5.hfphsp-backend = "none"
}

Alternative: A2DP duplex channel[编辑 | 编辑源代码]

FastStream, AptX LL, and "Opus 05 Pro" (a pipewire invention) have a "duplex" channel that allows for sending microphone audio back without needing to go into HSP/HFP and tolerate the sound quality degradation. PipeWire, but not PulseAudio, has support for this feature. Support is automatic upon feature detection. Interaction with existing profile switcher (WirePlumber) is unknown.

Tips and tricks[编辑 | 编辑源代码]

获取蓝牙耳机的电池电量[编辑 | 编辑源代码]

若要获取蓝牙耳机的剩余电量并将其提供给 upower,需要启动守护程序 bluetoothd 的试验性功能,方法如下:

建立一个 bluetooth.service 的替换单元文件(replacement unit file),在 ExecStart 行后添加 -E。这之后重新启动 bluetooth.service

媒体播放控制[编辑 | 编辑源代码]

媒体控制信号需要被转发给 MPRIS,并被支持 MPRIS 的媒体播放器所获取,来实现外部播放控制。详细信息请查看 MPRIS#Bluetooth

AVRCP Media controls[编辑 | 编辑源代码]

This may be desired for bluetooth headsets with overly sensitive touch controls, and AVRCP playback controls can be disabled through the inhibited sysfs file corresponding to the virtual AVRCP input device, for example /sys/devices/virtual/input/input877/inhibited. The correct virtual input can be identified via the name attribute, /sys/devices/virtual/input/input877/name, which may for example be "Soundcore Life P3 (AVRCP)". Echoing 1 to this file inhibits/disables AVRCP, and echoing 0 re-enables it. This can be changed dynamically at runtime without restarting bluetoothd or disconnecting your device.

This will be reset on device disconnect and reconnect, so it is likely desired to automatically set it via a udev rule such as:

SUBSYSTEM=="input" ATTR{name}=="Soundcore Life P3 (AVRCP)" ATTR{inhibited}="1"

If you want to be able to change this attribute as a regular user, see udev#Allowing regular users to use devices

See also[编辑 | 编辑源代码]

Using the same device on Windows and Linux without pairing the device over and over again