如何修改Android的蓝牙堆栈以启用A2dp接收器

我正在制作一个录音机应用程序,它使用蓝牙麦克风将音频录制到Android设备上(Nexus 7 – 扎根Android 4.4.2)。 它目前在HFP上实施,一切正常。 蓝牙麦克风是用Bluegiga的WT32蓝牙模块+麦克风输入实现的,通过HFP的音质不是很好,但现在已足够了。

但是,我现在正尝试将蓝牙配置文件更改为A2dp,因为有两个麦克风输入(L / R)和WT32支持A2dp(源)。 经过大量研究后,我发现Android不支持A2dp(接收器),并且可以修改Android的蓝牙堆栈以启用A2dp(接收器)。

我不明白的是如何访问和修改蓝牙堆栈。 如果有答案的人能够分解实现这一目标的步骤,那将是很好的。

我已经尝试过这个问题的答案: 在Android中通过蓝牙接收音频 ,但我似乎无法find要修改的相应文件。 实际上,我甚至不知道我是否正在查找正确的文件夹。 我通过Android-studio的DDMS-File Explorer查看了设备文件。

ps,我对Android应用程序开发还是比较新的,所以我可能误用了一些术语,并为此提前道歉。

这实际上是我想要做的很长时间……你无法find配置文件的原因是因为谷歌用BlueZ建立了一个由Google和Broadcom构建的新堆栈的蓝牙堆栈。 新堆栈使用不同的配置文件,我不知道如何修补。

如果你认真对待它,我发现最接近的是Android上的蓝牙框架官方介绍: https : //source.android.com/devices/bluetooth.html

所以上面的答案并不完全正确。

以下是它如何分解:

HAL是硬件抽象层,它以c / cpp代码实现实际的蓝牙状态机,因此它控制A2dp,HFP,GATT,SPP,AVRCP等服务的各种状态机。 这些服务中的每一个还引用SMP和ATT文件来控制实际的蓝牙服务器或客户端数据库,并具有安全性。

HCI,是实际工作的地方。 HAL实际上没有任何事情,它通过HCI层中使用的方法组装从tty串行(spi或UART)发送到PCBA上的网络间连接芯片的复杂数据消息,在AOSP 4.2.2到当前的Android编译中继的/ external / bluetooth / bluedroid /目录中的“BTE”层中find。 – 目前有几家这些芯片的制造商,但他们大多数都是基于Broadcom的ic,采用双无线或三无线电封装,包含wifi,蓝牙4.0智能和蓝牙4.0无线电。

可以执行您要执行的操作,但您需要将hardware.so和bluetooth_jni.so包含到与您的应用程序一起使用的NDK / JNI程序包/项目中,并通过.cpp文件中的调用进行注册对于“Packages / apps / Bluetooth / jni”中的每个蓝牙服务,您将在NDK库中处理“com_android_bluetooth_a2dp.cpp”和“com_android_bluetooth_avrcp.cpp”中的注册,作为其适当types的对象。

另一个问题是,您需要实现自己的自定义A2DP堆栈,因为Android Bluedroid堆栈只在框架中实现了Sink角色的位和部分,而A2DP角色具有角色的完整实现。 此外,根据您实际打算如何处理蓝牙A2DP接收器实施,您还需要实施AVRCP – 根据Bluetooth SIG(特殊兴趣小组),蓝牙设备之间存在互连要求,这将导致重大问题如果您实现接收器角色,没有AVRCP“远程控制目标设备”和“远程控制控制设备”,则作为接收器角色来自蓝牙通过A2DP(或任何蓝牙服务/配置文件)的ATT命令在服务发现过程中执行某些握手,当相关网关(连接设备)执行function请求,A2DP服务应该实现Start Stop命令的I / Ofunction,并可能跳过/跟踪advance命令。

除此之外,在实施A2DP时,您需要选择是否要处理PCM流或AAC流。 如果您正在处理AAC流(或DRM保护的PCM流,就像Pandora,spotify等所使用的那样),您需要实现适合您实现的SBC编码器或解码器,否则您将拥有的只是一堆加密数据。 此外,请确保以适当的速度为您的设备实现比特率AudioManager实现,一些手机使用48,000hZ,一些我们使用44,100hZ,如果您想要高质量音频,这一点非常重要,因为大多数PCM A2DP实施通常使用环绕声7.1 +将需要48,000hZ以及AAC编码/解码。

我希望这能为您提供一些见解。

https://android-review.googlesource.com/#/c/98161/实施A2DP Sink。 它适用于Nexus 5.你可以尝试一下。