Android 设备作为 A2DP 配置文件的接收器

Android device as a receiver for A2DP profile

基本上,我现在想做的是使用 android 设备作为 A2DP 接收器,当配对建立后,android 播放从发射器接收到的声音。我担心如果我使用 STP 配置文件,可能会导致流式传输延迟。所以,我想使用 A2DP,但是可以使用 android 设备作为 A2DP 的接收器吗?以及如何去做?

是的。有可能的。我在JB做过。 Android 内部使用来自 Broadcomm 的 "Bluedroid" 堆栈用于蓝牙。以前这个堆栈不支持 A2DP 接收角色(你提到的接收者)。从 Lollipop 版本开始,A2DP Sink 角色配置文件已添加到 Bluedroid 中。 但是,framework/upper 层(应用程序)无法使用它。 您需要更改框架以启用它或 'use' 它。 您可以参考以下文件和Android源代码中的相关文件来启用它。

audio.h - put a new audio source
audio_policy.conf - put a new input source for a2dp 'inputs'
AudioManager.java
AudioPolicyManagerBase.cpp
AudioService.java
AudioSystem.java
BluetoothA2dp.java
MediaRecorder.java
A2DPStateMachine.java

等并实现它(这个文件列表并不全面,但如果你有相关领域的经验,你可以理解)。 当建立任何流连接时,您将在 a2dp 状态机中获得回调,并且您必须从那里启动一个线程以从 'new' 音频源读取解码的 PCM 字节并将其发送到您的媒体播放器。 SBC 编解码器到 PCM 解码将在 'bluedroid' sbc 解码器层完成。

构建它并将其闪存到您的 phone 并欣赏音乐。

编辑: 此外,您可能更改了 Bluedroid 堆栈中的 A2DP SDP 记录以公布 A2DP Sink 角色。

自 AndroidL 以来,BlueDriod 堆栈支持 A2DP 接收器,但默认情况下禁用。

要启用它,请执行以下操作:

/* Enable bluetooth av sink. */
#define BTA_AV_SINK_INCLUDED TRUE

/external/bluetooth/bluedroid/include/bt_target.h 中。 这会启用蓝牙堆栈中的接收器支持。

您还必须进行以下更改:

<!-- Enable sink support. -->
<bool name="profile_supported_a2dp_sink">true</bool>

/packages/apps/Bluetooth/res/values/config.xml 中。这使特定的 UI.

现在您可以配对您的设备并开始流式传输。不幸的是,虽然您会收到数据包,但您听不到任何声音。原因是 A2DP sink 没有音频路由。在此补丁的提交消息中 https://android-review.googlesource.com/#/c/98161/ 您可以找到有关如何解决此问题的示例实现。

以下是这些更改的列表:

您可能无法在两部手机之间手动执行此操作,因为要流式传输一个设备需要是 A2DP 接收器和其他 A2DP 源,手机通常只是源设备(可以流式传输到接收器的流源devices) , Sinks 是 Headsets 或 Bluetooth speakers.