Android-устройство в качестве приемника для профиля A2DP
По сути, сейчас я пытаюсь использовать устройство Android в качестве приемника A2DP, а при установлении соединения Android воспроизводит звук, полученный от передатчика. Я беспокоюсь, что если я использую профиль STP, это может вызвать задержку потоковой передачи. Итак, я хочу использовать A2DP, но возможно ли использовать устройство Android в качестве приемника A2DP? а как это сделать?
3 ответа
Начиная с Android L, стек BlueDriod поддерживает приемник A2DP, но по умолчанию он отключен.
Чтобы включить это, сделайте следующее:
/* Enable bluetooth av sink. */
#define BTA_AV_SINK_INCLUDED TRUE
в http://androidxref.com/5.1.1_r6/xref/external/bluetooth/bluedroid/include/bt_target.h#171. Это позволяет поддерживать приемник в стеке Bluetooth.
Также вы должны сделать это изменение:
<!-- Enable sink support. -->
<bool name="profile_supported_a2dp_sink">true</bool>
в http://androidxref.com/5.1.1_r6/xref/packages/apps/Bluetooth/res/values/config.xml#17. Это включает конкретный интерфейс.
Теперь вы можете подключить ваши устройства и начать потоковую передачу. К сожалению, вы не услышите звука, хотя вы получите пакеты. Причина в том, что для приемника A2DP нет аудио маршрута. В сообщении о фиксации этого патча https://android-review.googlesource.com/ вы можете найти пример реализации того, как это исправить.
Вот список этих изменений:
Да. Это возможно. Я сделал это в JB. Android внутренне использует стек Bluedroid от Broadcomm для Bluetooth. Ранее этот стек не поддерживал роль приемника A2DP (которую вы упомянули как приемник). Начиная с выпуска Lollipop, профиль роли 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 будет выполняться на уровне декодера bcedroid sbc.
Постройте его и прошейте на свой телефон и наслаждайтесь музыкой.
РЕДАКТИРОВАТЬ: Кроме того, вы можете внести изменения в запись A2DP SDP в стеке Bluedroid для объявления роли A2DP Sink.
Возможно, вам не удастся сделать это вручную между двумя телефонами, потому что для потоковой передачи одно устройство должно быть приемником A2DP, а другим - другим источником A2DP. Телефоны обычно являются только устройствами-источниками (источником потока, который может передавать поток на устройства-приемники), Гарнитуры или Bluetooth-динамики.