17

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

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

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

我试过按照这个问题的答案: Receive audio via Bluetooth in Android,但我似乎找不到要修改的适当文件。实际上,我什至不知道我是否正在寻找正确的文件夹。我通过 Android-studio 的 DDMS-File Explorer 查看了设备文件。

ps,我对 Android 应用程序开发还很陌生,所以我可能误用了一些术语,为此我提前道歉。

4

4 回答 4

17

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

以下是它的分解方式:

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 编码/解码。

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

于 2014-08-25T18:59:31.917 回答
13

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

于 2014-08-28T09:32:05.320 回答
7

这其实是我很久以来一直在尝试做的... 找不到配置文件的原因是因为 Google 用 Google 和 Broadcom 构建的新堆栈替换了 BlueZ 的蓝牙堆栈。新堆栈使用不同的配置文件,我不知道如何修改。

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

于 2014-01-20T21:13:07.477 回答
2

随着时间的推移,Android OS 发生了很多变化。

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

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

因此,我们可能会看到蓝牙接收器配置文件在未来工作。

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

  1. 服务于packages/app/Bluetooth/
  2. HAL 在system/bt/btif/
于 2018-11-26T10:15:56.337 回答