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



基本上,我现在要做的是将安卓设备用作 A2DP 接收器,当建立配对时,安卓会播放从发射器接收的声音。我担心如果我使用 STP 配置文件,可能会导致流媒体延迟。所以,我想使用A2DP,但这可以使用安卓设备作为A2DP的接收器吗?怎么做?

由于Android L,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 接收器没有音频路由。在此修补程序 https://android-review.googlesource.com/#/c/98161/的提交消息中,您可以找到有关如何解决此问题的示例实现。

以下是这些更改的列表:

  • https://android-review.googlesource.com/#/c/97832/
  • https://android-review.googlesource.com/#/c/97853/
  • https://android-review.googlesource.com/#/c/97833/
  • https://android-review.googlesource.com/#/c/98130/
  • https://android-review.googlesource.com/#/c/98131/

是的。这是可能的。我已经在JB中做到了。Android内部使用来自Broadcomm的"Bluedroid"堆栈进行蓝牙。以前,此堆栈不支持 A2DP 接收器角色(您提到的接收器)。从棒棒糖版本开始,A2DP Sink角色配置文件已在Bluedroid中添加。但是,它不能被框架/上层(应用程序)使用。您需要在框架中进行更改以启用或"使用"它。您可以参考以下文件和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 状态机中获得回调,从那里您必须启动一个线程以从"新"音频源读取解码的 PCM 字节并将其发送到媒体播放器。SBC编解码器到PCM解码将在"bluedroid"sbc解码器层完成。

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

编辑:此外,您可能在 Bluedroid 堆栈中的 A2DP SDP 记录中进行了更改,以通告 A2DP 接收器角色。

您可能无法在 2 部手机之间手动执行此操作,因为要流式传输一个设备需要是 A2DP 接收器和其他 A2DP 源,电话通常只是源设备(可以流式传输到接收器设备的流源),接收器是耳机或蓝牙扬声器。

最新更新