前言
本篇文章采用的是lean大的Openwrt源码进行编译
截止20220902,暂且不建议采用arch系(包括manjaro)进行编译,实测avahi部分有点问题,而且是shairplay/airplay2的依赖项。可能是arch包过新了,实测ub22编译通过。
如何编译openwrt不再累述,lede的readme写的很清楚。
因为学校把有线网口砍了,整成了全wifi6覆盖,想来想去把我那N2840的小主机整了个AX210上去,跑了个op,拿来无线桥接用。ax210是网卡蓝牙一体的,干脆就把蓝牙一起利用上吧。
虽然N2840已经连小猫咪都跑不动了,但是好歹是x86,能用
准备工作
先说下我这边用的硬件吧:
x86_64的小主机,Intel® Celeron® Processor N2840
Intel® Wi-Fi 6E AX210
小米随身音箱
然后是编译openwrt所需要勾选的:
参照官方文档部分Bluetooth in openwrt
- kmod-input-uinput
- sbc
- bluez系列,bluez-daemon,bluez-tools,bluez-utils,bluez-utils-extra
(bluez为Linux Bluetooth 栈) - dbus-utils
- kmod-6lowpan
- kmod-bluetooth_6lowpan
- dbus(bluez需要)
- kmod-usb-core
(蓝牙走usb协议,故勾选上usb部分) - kmod-usb-uhci
- kmod-usb-ohci
- kmod-usb2
- kmod-usb3
- kmod-bluetooth
- usbutils
- ibt-firmware (intel蓝牙驱动固件,wifi的话勾上iwlwifi和iwlwifi-firmware-* 系列)
- luci-app-shairplay
- luci-app-airplay2
(两个均用于airplay,保险点都带上)
(kmod均为kernel module系列,如果找不到,请善于使用“/”键搜索)
带上bluez-alsa包
bluez-alsa部分仅在x86_64上测试通过,别的平台自行测试
如标题所述,带上这玩意。
不难发现,上面的包相比官方文档中少了pulseaudio。
因为我们用的shairplay,以及airplay2均(可)采用alsa,所以没必要带上pulseaudio。
那么这玩意,lede里并没带上,我们需要手动搞一搞。
这玩意是alsa的蓝牙音频后端,它用来实现与蓝牙音频设备的连接,在alsa环境下,没这玩意音响根本连不上。
有大佬搞过openwrt的bluezalsa,但是比较旧了,我们下下来改改
打开lede源码的feeds/packages/utils
创建一个名为bluez-alsa的文件夹
在这个文件夹下打开终端
wget https://raw.githubusercontent.com/diizzyy/packages/sound-bluez-alsa/sound/bluez-alsa/Makefile
mkdir files
cd files
wget https://raw.githubusercontent.com/diizzyy/packages/sound-bluez-alsa/sound/bluez-alsa/files/bluealsa.init
这个大佬是2018年搞得,然后根据bluez-alsa源码issue里的说法是他搞了以后就不玩这玩意了,所以就没更过,所以我们得进行一些更新。
改makefile
文本打开makefile
首先是bluezalsa的版本,该换新的了
懂得人应该知道它这个url的地址下源码包根据commit来,改改commit值,hash值用sha256sum得出来放上去就完事了
那我这提供一份截止到20220903版本的
20231030更新:
PKG_VERSION:=20231024
PKG_SOURCE_URL:=https://codeload.github.com/Arkq/$(PKG_NAME)/tar.gz/72bada7?dummy=/
PKG_HASH:=5c89be7dc8105049ec89f7bf4abde568ad3a30d52bea64ad75270fea421561d8
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-72bada7
修改对应的就行
在define Package/bluez-alsa中
也就是29行
DEPENDS:=,去掉最后的@LINUX_4_14,现在都标准5.15,新的5.19时代了。
6.1时代了
然后删掉第47行的
$(INSTALL_BIN) $(PKG_BUILD_DIR)/utils/bluealsa-aplay $(1)/usr/bin/
我这边测试编译出来已经没有这个了,所以会导致报错。
然后就改完了,menuconfig里勾选上bluez-alsa即可。
开机后修改工作
编译,刷入,开机
然后开始处理后续工作
AX210的额外工作
开机后在内核日志中不难发现Bluetooth有报错,原因是找不到蓝牙的固件,ssh查看文件看了看确实没有,需要手动补上
前面带的ibt-firmware没有210要用的
根据报错信息可知,ax210需要ibt-0041-0041.ddc以及ibt-0041-0041.sfi文件,可在Index of /sources/linux-firmware/intel这里下载到,然后放到/lib/firmware/intel/下,重启即可正常读取加载。
继续,在openwrt中进行修改
-
/etc/bluetooth/下创建一个audio.conf,内容:
[General] Enable=Source
-
修改/etc/init.d/bluealsa
将原本的procd_set_param command "$PROG" -i hci0
改为
procd_set_param command "$PROG" -i hci0 -p a2dp-source
可能有人就会说了,为啥不在上面源码里就改好,还现在改。原因:bluealsa的-p参数是profile,也就是加载何种配置文件。我这边是以openwrt去连蓝牙音响,所以是a2dp-source,source端也就是发送音频流的。如果你的设备原本就是带声卡带扬声器,想拿openwrt作为蓝牙音响的,那就是a2dp-sink,sink端也就是接收音频的。
至于上面audio.conf那个source,根据参考的文章里的意思是即使干的sink端的活,但是还是填source,bluez中就是这样。
- 在/etc/dbus-1/system.d/下创建bluealsa.conf
内容:
<!-- This configuration file specifies the required security policies
for BlueALSA core daemon to work. -->
<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
<!-- ../system.conf have denied everything, so we just punch some holes -->
<policy user="root">
<allow own_prefix="org.bluealsa"/>
<allow send_destination="org.bluealsa"/>
</policy>
<policy group="audio">
<allow send_destination="org.bluealsa"/>
</policy>
</busconfig>
- 修改/etc/asound.conf
加上
defaults.bluealsa.service "org.bluealsa"
defaults.bluealsa.interface "hci0"
defaults.bluealsa.profile "a2dp"
defaults.bluealsa.delay 10000
pcm.!default {
type asym
capture.pcm cards.pcm.default
playback.pcm bluealsa
hint.description "Capture: sysdefault, Playback: BlueALSA Bluetooth
Default Audio Device"
}
ctl.!default {
type bluealsa
hint.description "Default control device (BlueALSA Bluetooth)"
}
然后建议重启系统,当然也可以
service dbus restart
service bluetoothd restart
service bluealsa restart
反正还是建议重启(
连 蓝 牙
修是修改完了,该连了
书接上文,重启完了(
ssh进去,先康康有没有蓝牙设备
hciconfig
默认是关闭状态,但是有设备,我们来操作它
bluetoothctl
power on
scan on
开始扫描蓝牙设备,把蓝牙音响进入配对模式
扫描到蓝牙音响后
scan off
关闭扫描,记录下蓝牙音响的mac地址,这里假设mac地址为XX
pair XX
trust XX
connect XX
连接成功后就会出现这个提示,如果没有bluez-alsa,这边connect是失败的,系统日志可以看到具体报错。
连上后就可以退出bluetoothctl了,输入exit退出
用alsamixer,可以看到默认设备就是蓝牙音响了
在这可调整音量,现在我们可以先拿个曲子试试(需要wav,mp3会播杂音)
正常播放,挺好
airplay设置
嘛。我本来是想用airplay2的,但是不知道为啥没声,或者说和挤牙膏那种不正常,改了半天配置也不正常。用airplay的小伙伴可以参考【LEDE】x86软路由之路-11-Shairport音乐推流(安卓+IOS)这篇文章改改试试,音频输出设备用默认就行
顺便说下这个音频输出设备,shairplay和airplay2都是找硬件的,也就是/proc/asound里的card,蓝牙的这个音响,他不会出现在alsa的内核proc接口中。即使是bluez-alsa也不会,bluealsa这个PCM设备是基于ALSA软件PCM I/O插件的。这在bluez-alsa中有说。上面的修改有让bluealsa成为默认设备
我这边shairplay是完全正常的,放一张设置图
最后就可以用mac/ios走airplay播放到蓝牙音响了
最后
嘛,折腾老半天了,查资料也没找到几个我这种需求的,倒腾一下午都快打算搞有线音响的时候搞定了。。
由于openwrt默认关蓝牙,所以重启后也要手动开,当然,自启脚本里面写上也就完事了。
实测开蓝牙后会自动连配对过的设备。
本文除去文中给出的引用连接参考部分,其他均为原创
转载请注明作者和原文链接
0 条评论