4

我正在尝试将蓝牙耳机连接到我的 RPI。我的设置如下:

  • archlinux-arm,内核:linux-raspberrypi 3.12.23-1
  • 来自AUR的bluez4 4.101-4 ,构建并安装
  • bluez 工具 0.1.38-3
  • bluez-utils 5.20-1
  • 脉冲音频 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 似乎无法识别它并且没有注册sourcesink条目:

[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-policymodule-bluetooth-discover模块是否已加载。甚至尝试卸载并再次加载:

pactl unload-module module-bluetooth-discover
pactl load-module module-bluetooth-discover

成功加载模块,但仍然没有显示在sourcesnorsinks列表中。

我还尝试配置/etc/bluetooth/audio.conf以启用不同的选项,例如:

Enable=Source,Sink,Media,Socket
Enable=Source,Sink,Headset,Gateway,Control,Media,Socket
Enable=Source,Sink,Media
...

但它没有改变任何东西。

我完全没有想法......为什么PulseAudio无法识别它?有什么我错过的吗?我需要以一些特殊的方式配置I PulseAudio吗?

4

2 回答 2

4

与此同时,我已经设法解决了这个问题,以下是对我有用的步骤。
有问题的操作系统是archlinux-arm

安装

安装以下软件包:

  • bluez4-4.101-4
  • bluez-tools-0.1.38-3
  • bluez-utils 5.21-2
  • libpulse-4.0-6
  • 脉冲音频-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 无法使用 存在问题,尤其是在使用4.1 及更高版本和 3.0 或更高版本时bluez4无法切换到A2DP配置文件。这可以通过省略启用列表中的参数来解决:bluez4pulseaudioSocket/etc/bluetooth/audio.conf

# Enable=Headset,Sink,Source,Socket
Enable=Headset,Sink,Source

如果这还不够,请尝试添加额外的一行:

Disable=Socket

跑步

是时候启用和启动bluetooth服务了:

systemctl enable bluetooth
systemctl start bluetooth

我们可以通过hcitoolbt-adapter或发现我们的设备bt-device并连接到它。例如,使用后者:

bt-device -d
bt-device -c <MAC>
bt-device --set <MAC> Trusted 1
bt-audio -c <MAC>

第一个命令发现设备,秒通过其 MAC 地址连接到它。第三个将其设置为受信任,因此我们可以稍后在范围内自动连接到它。最后一个命令将其作为音频设备连接。在此之后,它应该可以在pulseaudio.

与 PulseAudio 一起使用

通过 启动 PA pulseaudio --start
检查源和汇是否被正确识别:

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>

您可以使用 找到 BT 卡 ID 及其支持的配置文件pacmd list-cards。您可能至少会看到那里列出的配置文件A2DPHSP您可以像这样在它们之间切换:

# pacmd set-card-profile <card_id> <profile_name>
pacmd set-card-profile 1 a2dp
pacmd set-card-profile 1 hsp

自动连接

软件包bluez-tools包含名为bt-monitor的工具,该工具从守护程序捕获 D-Bus 信号bluetoothd并为检测到的已配对(和受信任)设备启动连接。bt-monitor通过关闭和打开 BT 耳机来运行和测试。

于 2014-12-15T10:32:32.180 回答
2

老问题,但我自己在寻找上述问题的解决方案时遇到了这个问题,所以我想我会来这里并发布我如何在我的设置中对其进行整理。

事实证明,Pulseaudio确实没有打包或配置为作为系统守护程序运行,并且默认配置假定您将在会话中运行,最好在 X 下运行。这对访问系统总线有直接影响:Pulseaudio 期望session 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

pactl 应该在设备连接时列出一个 bluez 源。祝你好运!

ps:很抱歉我没有确切的arch解决方案,但我很确定以上适用(原始指南是为fedora编写的......)

于 2014-11-18T07:49:57.993 回答