首页 文章

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

提问于
浏览
15

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

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

What I don't understand is how does one access and modify the bluetooth stack. 如果有答案的人能够分解实现这一目标的步骤,那就太好了 .

我已经尝试过这个问题的答案了:Receive audio via Bluetooth in Android,但我甚至不知道我是否通过Android-studio的DDMS-File Explorer查看了设备文件 .

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

4 回答

  • 15

    这实际上是我想要做的很长时间......你无法找到配置文件的原因是因为谷歌用Blue和Google构建的新堆栈取代了BlueZ的蓝牙堆栈 . 新堆栈使用不同的配置文件,我不知道如何修补 .

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

  • 13

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

    以下是它如何分解:

    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"层中找到 . - 目前有几家这些芯片的制造商,但他们大多数都是基于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”中的注册,作为其适当类型的对象 .

    另一个问题是,您需要实现自己的自定义A2DP堆栈,因为Android Bluedroid堆栈仅在框架中实现了Sink角色的位's and piece',而A2DP角色具有源角色的完整实现 . 此外,根据您实际打算如何处理蓝牙A2DP接收器实现,您还需要实施AVRCP - 根据蓝牙SIG(特殊兴趣小组),蓝牙设备之间存在互连要求,这将导致重大问题如果您实现接收器角色,没有AVRCP "remote control target device"和"remote control control device",则作为接收器角色来自蓝牙A2DP(或任何蓝牙服务/配置文件)的ATT命令在服务发现过程中执行某些握手,当关联的网关(连接设备)执行时功能请求A2DP服务应该实现Start Stop命令的i / o功能,并可能跳过/跟踪advance命令 .

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

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

  • 2

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

  • 7

    随着时间的推移,Android操作系统发生了很多变化 .

    从Android O(Android 8. *)开始,Google会部分支持接收器配置文件 . 如果在配置文件中启用,音频接收器将很容易工作 . 看起来BT的更高层是在框架中完成的一种实现,它是以App的形式,即 packages/app/Bluetooth (有一些错误但仍然有效) . 但是所有的配置文件都不是通过HAL接口在框架下层完成的,这是btif框架(例如 btif_rc.cpp 等,你可以看看Android源代码),它可以替代Google的旧版Bluez堆栈 .

    正如我所说,BT接收器部分实现并处于正在进行中状态 . 如果作为接收器配置文件启用,则诸如音频的BT接收器将很容易工作,但并非所有诸如AVRCP都不起作用 . 目前,我看到了AOSP代码的问题,从远程设备到Android的传入流量工作但从Android到远程设备的传出流量不起作用(AVRCP配置文件工作),因为远程设备对象未在堆栈中维护所以来自app / Bluetooth的JNI调用在 btif_*.cpp 文件中使用null设备失败 . 例如,发送传递命令不起作用 .

    因此,我们可能会看到未来的蓝牙接收器配置文件 .

    如果您想了解更多信息,请查看AOSP,

    • 服务地点 packages/app/Bluetooth/

    • HAL在 system/bt/btif/

相关问题