0

我正在我的嵌入式设备中将 Bluez 4.97 更新到 5.35。

对于 A2DP 连接,我们必须共享 SBC 编解码器功能。在理想情况下,功能将如图 1 所示带有 bluez 4.97 的 AVDTP 数据包。在 Bluez 4.97 代码中,我从AVDTP 层中的sbc_getcap_ind()函数获得 SBC 编解码器功能。在 sbc_getcap_ind() 中,sbc_codec_capavdtp_media_codec_capability都被初始化。所以这个功能包我可以发送回电话。

5.35中,sbc_getcap_ind()函数不可用。avdtp_media_codec_capability在 AVDTP 层的endpoint_getcap_ind()函数中设置,这符合我的预期。但是sbc_codec_cap没有初始化。所以我得到了图 2 中的 packect 带有 bluez 5.35 的 AVDTP 损坏数据包

blueZ 5.35中出现了新的包 android/hal-audio-sbc.c,在这个包中设置了 SBC 编码功能。

我的嵌入式设备是基于 RTOS 的,我与 android 无关。所以我有以下疑问:

1)为什么 blueZ 堆栈中有新的 android 包?这背后的发展理念是什么?

2)为什么 SBC 能力在android/hal-audio-sbc.c中初始化,非安卓设备如何访问 SBC 能力?

3)如何在我的嵌入式环境中使用android/hal-audio-sbc.c来获得 SBC 功能?

我想我无法解决这个问题,因为我缺少对新 5.35 架构的理解。并且没有足够的文档来理解 BlueZ 架构。我希望通过回答这些问题,我可以理解 5.35 BlueZ 包中 android 文件夹的重要性。

4

1 回答 1

0

在回答您的问题之前,我想分享几个 URL。

  1. 移植指南
  2. 管理界面

为你的问题而来,

  1. BlueZ 现在支持 android 和 Linux 平台。“android”目录只包含与android平台相关的源码,不能用于Linux环境。这背后的想法是在Linux和android之间共享共同的开发代码,并分别开发共同的功能(主要在“src”、“gdbus”和“profile”目录下)。
  2. 作为 BlueZ 4 到 BlueZ 5 迁移或主要开发的一部分,所有与音频相关的实现都从 BlueZ 中移出。现在音频应用程序负责自己实现所有内容并在 BlueZ ( doc/profile-api.txt ==> RegisterProfile() method) 中注册。BlueZ 将仅充当您的应用程序和设备之间的中介。就 Linux 而言,BlueZ 内部没有音频实现。我不确定 BlueZ 下的 Android 目录。所以非android平台需要自己实现。
  3. 如前所述,您需要为 BlueZ 实现我们自己的音频相关配置文件。我们有一个工作软件,那就是pulseaudio。您可以在 pulseaudio (pactl) 中加载模块-bluez-discover,然后 Pulse audio 负责处理音频。

还有另一种开源解决方案,bluealsa,目前正在积极开发中。使用它后,我可以看到很多音频延迟和质量下降。如果您想要完美的解决方案,请自行实施或使用 pulseaudio(没有那么多实时)。

简而言之,将应用程序从 BlueZ 4.x 迁移到 BlueZ 5.x 并不容易!

于 2017-04-10T03:57:22.193 回答