我正在尝试将蓝牙耳机连接到我的RPI。我的设置如下:
- archlinux-arm, kernel: linux-raspberrypi 3.12.23-1
- bluez4 4.101-4 from AUR, build and installed
- bluez-tools 0.1.38-3
- bluez-utils 5.20 - 1
- pulseaudio 5.0 - 1
- pulseaudio-alsa 2 - 3
我扫描设备,成功配对,添加为可信并连接它:
hcitool scan
bluez-simple-agent hci0 <MAC>
bt-device --set <MAC> Trusted 1
bt-audio -c <MAC>
在此之后,设备状态如下(bt-device -i <MAC>
输出):
[00:23:7F:2A:3B:24]
Name: PLT 510
Alias: PLT 510 [rw]
Address: 00:23:7F:2A:3B:24
Icon: audio-card
Class: 0x200404
Paired: 1
Trusted: 1 [rw]
Blocked: 0 [rw]
Connected: 1
UUIDs: [Headset, Handsfree]
所以,一切似乎都很好,对吗?嗯,不完全是。
问题是当我尝试播放音频时,因为似乎PulseAudio没有识别它,也没有注册source
和sink
条目:
[root@alarmpi bluetooth]# pactl list sources short
0 alsa_output.platform-bcm2835_AUD0.0.analog-stereo.monitor module-alsa-card.c s16le 2ch 44100Hz IDLE
[root@alarmpi bluetooth]# pactl list sinks short
0 alsa_output.platform-bcm2835_AUD0.0.analog-stereo module-alsa-card.c s16le 2ch 44100Hz SUSPENDED
我检查了module-bluetooth-policy
和module-bluetooth-discover
模块是否加载。甚至试图卸载并重新加载:
pactl unload-module module-bluetooth-discover
pactl load-module module-bluetooth-discover
模块加载成功,但sources
和sinks
列表中仍未显示
我还尝试配置/etc/bluetooth/audio.conf
以启用不同的选项,如:
Enable=Source,Sink,Media,Socket
Enable=Source,Sink,Headset,Gateway,Control,Media,Socket
Enable=Source,Sink,Media
...
但它没有改变任何东西。
我完全没有主意了…为什么它不被PulseAudio识别?我错过什么了吗?我需要配置我PulseAudio一些特殊的方式吗?
与此同时,我已经设法解决了这个问题,以下是对我有效的步骤。
这里的操作系统是archlinux-arm。
安装以下包:
- bluez4 - 4.101 - 4
- bluez-tools-0.1.38-3
- bluez-utils 5.21 - 2
- libpulse - 4.0 - 6
- pulseaudio - 4.0 - 6
- pulseaudio-alsa-2-2
- alsa-utils
注意:
我已经设法让PulseAudio检测我的蓝牙耳机使用这里列出的特定包版本。一些其他的版本也可以工作,但我尝试过的大多数组合都有问题不能解决。
大多数包都可以从AUR (bluez4, bluez-tools,…)构建和安装,其他包也可以安装很容易使用pacman
。
额外准备
在我们安装了这些包版本之后,我们不希望pacman
在以后进行系统升级时更新它们。为了防止这种情况,我们在/etc/pacman.conf
中添加以下行:
IgnorePkg = libpulse pulseaudio pulseaudio-alsa bluez bluez-tools
PulseAudio无法与bluez4
一起工作,特别是在使用bluez4
4.1及更高版本和pulseaudio
3.0或更高版本时无法切换到A2DP
配置文件。这可以通过在/etc/bluetooth/audio.conf
的启用列表中提交Socket
参数来解决:
# Enable=Headset,Sink,Source,Socket
Enable=Headset,Sink,Source
如果这还不够,尝试添加额外的行:
Disable=Socket
运行是时候启用并启动bluetooth
服务了:
systemctl enable bluetooth
systemctl start bluetooth
我们可以通过hcitool
, bt-adapter
或bt-device
发现我们的设备,并连接到它。例如,使用后者:
bt-device -d
bt-device -c <MAC>
bt-device --set <MAC> Trusted 1
bt-audio -c <MAC>
第一个命令发现设备,第二个命令通过它的MAC地址连接到它。第三个将其设置为受信任,以便我们可以稍后在范围内自动连接到它。最后一个命令将其连接为音频设备。在此之后,它应该在pulseaudio
中可用。
与PulseAudio一起使用
通过pulseaudio --start
启动PA。
检查源和接收是否被正确识别:
pactl list sources short
pactl list sinks short
您应该看到列出的BT接收器和源,这意味着PA已检测到它们。请注意接收器和源旁边的ID值。使用它们将BT设置为默认的接收/源:
pacmd set-default-source <BT_SOURCE_ID>
pacmd set-default-sink <BT_SINK_ID>
您可以通过pacmd list-cards
找到BT卡id及其支持的配置文件。您可能会看到至少列出了A2DP
和HSP
配置文件。你可以像这样在它们之间切换:
# pacmd set-card-profile <card_id> <profile_name>
pacmd set-card-profile 1 a2dp
pacmd set-card-profile 1 hsp
Autoconnection
软件包bluez-tools包含名为bt-monitor的工具,该工具捕获来自bluetoothd
守护进程的D-Bus信号,并为已配对(和受信任)的检测设备启动连接。运行bt-monitor
并通过关闭和打开BT耳机进行测试。
这是一个老问题,但是我自己在寻找上面的解决方案时遇到了这个问题,所以我想我应该来这里发布一下我是如何在我的设置中对它进行排序的。
事实证明这项技术的确是不打包,或者配置为运行系统守护进程,并默认配置假设您将运行在一个会话中,最理想的是在x这对访问系统总线有直接的影响:这项技术期望一个会话DBus处理,和module-bluetooth-discover依赖于这个为了动态地加载module-buetooth-device和设置相应的接收器/来源。
所以,您需要在DBus规则中添加一个例外。本指南建议在/etc/dbus-1/system.d/pulse.conf中添加以下内容:
<!DOCTYPE busconfig PUBLIC
"-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
<policy user="root">
<allow own="org.pulseaudio.Server"/>
<allow send_destination="org.bluez"/>
<allow send_interface="org.bluez.Manager"/>
</policy>
<policy user="pulse">
<allow own="org.pulseaudio.Server"/>
<allow send_destination="org.bluez"/>
<allow send_interface="org.bluez.Manager"/>
</policy>
<policy context="default">
<deny own="org.pulseaudio.Server"/>
<deny send_destination="org.bluez"/>
<deny send_interface="org.bluez.Manager"/>
</policy>
</busconfig>
但是在我的情况下(Raspbian Wheezy),这个文件不是空的,所以YMMV。请注意,最后一部分(上下文默认值,全部拒绝)是关键的,如果缺少它,PA将无法从Dbus获得通知。
添加规则,然后:
service dbus restart
service bluetooth restart
service pulseaudio restart
和pacl应该在设备连接时列出蓝色源。好运!
ps:很抱歉,我没有一个确切的arch解决方案,但我很确定上面的应用(最初的指南是为fedora编写的…)