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

Hee*_*ang 13 streaming android bluetooth audio-streaming a2dp

基本上,我想现在要做的是使用Android设备作为A2DP接收器和配对成立时,Android的播放声音是从发射机接收.我担心如果我使用STP配置文件,可能会导致流式传输延迟.所以,我想使用A2DP,但是这可能使用Android设备作为A2DP的接收器吗?怎么做?

nil*_*ilo 15

由于Android L BlueDriod堆栈支持A2DP接收器,但默认情况下禁用.

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

/* Enable bluetooth av sink. */
#define BTA_AV_SINK_INCLUDED TRUE
Run Code Online (Sandbox Code Playgroud)

/external/bluetooth/bluedroid/include/bt_target.h中.这使得蓝牙堆栈中的接收器支持成为可能.

你还必须做这个改变:

<!-- Enable sink support. -->
<bool name="profile_supported_a2dp_sink">true</bool>
Run Code Online (Sandbox Code Playgroud)

/packages/apps/Bluetooth/res/values/config.xml中.这启用了特定的UI.

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

以下是这些更改的列表:

  • 你知道在Android 6中是否启用了这个功能吗? (4认同)

the*_*ama 5

是的。有可能的。我在JB做过。Android 在内部使用来自 Broadcomm 的“Bluedroid”堆栈用于蓝牙。以前,此堆栈不支持 A2DP 接收器角色(您提到的接收器角色)。从 Lollipop 版本开始,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
Run Code Online (Sandbox Code Playgroud)

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

构建它并将其闪存到您的手机并享受音乐。

编辑:此外,您可能已更改 Bluedroid 堆栈中的 A2DP SDP 记录以宣传 A2DP 接收器角色。

  • 你能为此整理一些示例代码吗?我没有“相关领域的经验”,但我可以编译和编写应用程序。我很感激您的反馈,甚至是下午。 (2认同)