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

Android设备作为A2DP配置文件的接收器,android,bluetooth,streaming,audio-streaming,a2dp,Android,Bluetooth,Streaming,Audio Streaming,A2dp,基本上,我现在要做的是使用安卓设备作为A2DP接收器,当配对建立时,安卓会播放从发射机接收到的声音。我担心如果我使用STP配置文件,可能会导致流媒体延迟。所以,我想使用A2DP,但这是否可能使用android设备作为A2DP的接收器?怎么做呢 是的。这是可能的。我在JB做过。 Android内部使用Broadcomm的“Bluedroid”堆栈实现蓝牙。在此之前,该堆栈不支持A2DP接收器角色(您提到的接收器)。从棒棒糖发布开始,Bluedroid中添加了A2DP接收器角色配置文件。 但是,框架

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

是的。这是可能的。我在JB做过。 Android内部使用Broadcomm的“Bluedroid”堆栈实现蓝牙。在此之前,该堆栈不支持A2DP接收器角色(您提到的接收器)。从棒棒糖发布开始,Bluedroid中添加了A2DP接收器角色配置文件。 但是,框架/上层(应用程序)无法使用它。 您需要在框架中进行更改以启用或“使用”它。 您可以参考以下文件和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接收器角色。

由于Android L,Bluedroid堆栈确实支持A2DP接收器,但默认情况下是禁用的

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

/* Enable bluetooth av sink. */
#define BTA_AV_SINK_INCLUDED TRUE
在。 这将启用蓝牙协议栈中的接收器支持

您还必须进行以下更改:

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

真的
在。这将启用特定的UI

现在,您可以配对设备并开始流媒体。不幸的是,虽然您会收到数据包,但您将听不到任何声音。原因是A2DP接收器没有音频路由。在这个补丁的提交消息中,您可以找到一个关于如何修复这个问题的示例实现

以下是这些更改的列表:


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

您知道Android 6中是否启用了此功能吗?@nilo补丁是针对
Android Android-4.4_r1
,在Android L
base
类中(与补丁不同)。例如:在文件
platform/external/bluetooth/bluedroid/audio_a2dp_hw/audio_a2dp_hw.c
中,*输入中已经有
struct a2dp_stream_这对esp idf for ESP32 IC也是有效的,尽管我不知道是否在堆栈的更高层实现了接收器功能。可能的副本您可以为此编写一些示例代码。我没有“相关领域的经验”,但我可以编译和编写应用程序。我将感谢您的反馈,甚至是一个下午。