所以上面的答案并不完全正确。
以下是它的分解方式:
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角色的一小部分,而 A2DP 角色具有Source的完整实现角色。此外,根据您对蓝牙 A2DP 接收器实施的实际意图,您还需要实施 AVRCP - 根据蓝牙 SIG(特殊兴趣组),蓝牙设备之间存在互连要求,这将导致重大问题如果您实现接收器角色,没有 AVRCP“远程控制目标设备”和“远程控制控制设备”,作为接收器角色,来自 A2DP 上的蓝牙(或任何蓝牙服务/配置文件)的 ATT 命令在服务发现过程中执行某些握手,当关联的网关(连接设备),执行功能请求,A2DP 服务有望实现启动停止命令的 i/o 功能,并可能跳过/跟踪前进命令。
除此之外,在实现 A2DP 时,您需要选择是处理 PCM 流还是 AAC 流。如果您正在处理 AAC 流(或 DRM 保护的 PCM 流,像 Pandora、spotify 等使用的任何东西),您需要实现适合您实现的 SBC 编码器或解码器,否则您将拥有的只是一堆的加密数据。此外,请确保以适合您设备 AudioManager 实现的速度实现比特率,有些手机使用 48,000hZ,有些使用 44,100hZ,如果您想要高质量音频,这很重要,因为通常大多数使用环绕声 7.1 的 PCM A2DP 实现+ 将需要 48,000hZ 以及 AAC 编码/解码。
我希望这可以为您提供一些见解。