基本上,我现在要做的是使用Android设备作为A2DP接收器,当配对建立时,android播放从发射器接收的声音。我担心如果我使用STP配置文件,可能会导致流式传输延迟。所以,我想使用A2DP,但是这可能使用Android设备作为A2DP的接收器吗?怎么做?
答案 0 :(得分:15)
自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/的提交消息中,您可以找到有关如何解决此问题的示例实现。
以下是这些更改的列表:
答案 1 :(得分:4)
是。有可能的。我在JB做过。 Android内部使用Broadcomm的“Bluedroid”堆栈进行蓝牙。以前这个堆栈不支持A2DP Sink Role(你提到的接收器)。从Lollipop版本开始,Bluedroid中添加了A2DP Sink角色配置文件。 但是,它不能被框架/上层(应用程序)使用。 您需要在框架中进行更改以启用它或“使用”它。 您可以参考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字节并将其发送到您的媒体播放器。 用于PCM解码的SBC编解码器将在'bluedroid'sbb解码器层完成。
构建它并将其闪存到手机上并欣赏音乐。
编辑: 此外,您可能会对Bluedroid堆栈中的A2DP SDP记录进行更改,以宣传A2DP接收器角色。
答案 2 :(得分:2)
您可能无法在两部手机之间手动执行此操作,因为流式传输一台设备需要是A2DP接收器和其他其他A2DP源,手机通常只有源设备(可以流式传输到设备的流源) ,Sinks是耳机或蓝牙音箱。