Как изменить стек Bluetooth Android, чтобы включить приемник A2dp

Я работаю над приложением audio recorder, которое использует Bluetooth-микрофон для записи звука на Android - устройство (Nexus 7-rooted Android 4.4.2). В настоящее время он реализован на HFP, и все работает нормально. Bluetooth-микрофон реализован с bluetooth-модулем Wt32 Bluegiga + микрофонным входом, качество звука через HFP не велико, но пока этого достаточно.

однако теперь я пытаюсь изменить профиль bluetooth на A2dp, так как есть два микрофонных входа (L / R) и WT32 поддерживает A2dp (источник). После долгих исследований я обнаружил, что stock Android не поддерживает A2dp (sink), и можно изменить стек bluetooth Android, чтобы включить A2DP (sink).

чего я не понимаю, так это как получить доступ и изменить стек bluetooth. было бы неплохо, если бы кто-то с ответом смог сломать шаги для достижения этого.

Я пробовал следовать ответу на этот вопрос: прием аудио через Bluetooth в Android, но я не могу найти соответствующий файл для изменения. На самом деле, я даже не знаю, смотрю ли я в нужную папку. Я просмотрел файл устройств через DDMS-File Explorer Android-studio.

ps, Я все еще довольно новичок в разработке приложений для Android, поэтому я, возможно, неправильно использовал некоторые терминологии, и я заранее извиняюсь за это.

3 ответов


Это на самом деле то, что я пытаюсь сделать долгое время... Причина, по которой вы не можете найти файл конфигурации, заключается в том, что Google заменил стек Bluetooth из BlueZ новым стеком, созданным Google и Broadcom. Новый стек использует другой файл конфигурации, с которым я не знаю, как возиться.

Если вы серьезно относитесь к этому, самое близкое, что я нашел, чтобы начать с официального введения для рамки bluetooth на Андроид: https://source.android.com/devices/bluetooth.html


таким образом, приведенный выше ответ не совсем правильный.

следующее, как он ломается:

HAL, уровень абстракции оборудования который снабжает фактические машины положения Bluetooth в коде c/cpp, как таковой он контролирует различные машины положения для A2dp, HFP, GATT, SPP, AVRCP, etc. сервисы. Каждая из этих служб также ссылается на файлы SMP и ATT для управления фактическим сервером Bluetooth или клиентскими базами данных, и там безопасность.

HCI, где фактическая работа выполняется. HAL на самом деле не do что угодно, он собирает сложные сообщения данных, которые отправляются по последовательному tty (либо spi, либо UART) на чип, подключенный к сети на PCBA, с помощью методов, используемых в слое HCI, который можно найти в слое "BTE" в /external/bluetooth/bluedroid/ каталоге магистрали компиляции android от AOSP 4.2.2 до current. - в настоящее время существует несколько производителей этих чипов, но в основном все они основаны на Broadcom ic упакован в двойной или тройной пакет радио, который содержит wifi, Bluetooth 4.0 Smart и Bluetooth 4.0 radio.

можно сделать то, что вы пытаетесь сделать, но вам нужно будет включить аппаратное обеспечение.Итак, и bluetooth_jni.таким образом, в пакет/проект NDK/JNI, который идет с вашими приложениями, и регистрируется через вызовы из .cpp-файлы для каждой из служб Bluetooth, найденных в "Packages / apps / Bluetooth/ jni", затем вы будете обрабатывать регистрацию в своей библиотеке NDK 'com_android_bluetooth_a2dp.cpp', и ' com_android_bluetooth_avrcp.cpp', как их соответствующим образом типизированные объекты.

другая проблема заключается в том, что вам нужно будет реализовать свой собственный стек A2DP, так как стек Android Bluedroid имеет только бит и кусок раковина роль реализована в рамках, в то время как роль A2DP имеет полную реализацию источник роль. Кроме того, в зависимости от того, что вы на самом деле собираетесь делать с Bluetooth A2DP раковиной реализация вам нужно будет реализовать AVRCP, а также-в соответствии с Bluetooth SIG (специальная группа интересов), есть требования к взаимодействию между устройствами Bluetooth, которые приведут к основным проблемам, если вы реализуете роль приемника, без AVRCP "целевое устройство дистанционного управления" и "устройство дистанционного управления", как att роль приемника команды от Bluetooth через A2DP (или любой службы/профиля Bluetooth) выполнить определенные рукопожатия во время процесса обнаружения службы, когда шлюз (соединяющееся устройство), выполняет запрос возможностей ожидается, что служба A2DP реализует возможности ввода-вывода для команд Start Stop и, возможно, пропускает/отслеживает предварительные команды.

В дополнение ко всему этому при реализации A2DP вам нужно будет выбрать, будете ли вы обрабатывать потоки PCM или потоки AAC. Если вы обрабатываете потоки AAC (или DRM защищенные потоки PCM, если на то пошло, которые что-нибудь вроде Pandora, spotify и т. д. использует), вам нужно реализовать SBC Encoder или декодер, соответствующий вашей реализации, иначе все, что у вас будет, - это куча зашифрованных данных. Кроме того, не забудьте реализовать битрейт с соответствующей скоростью для ваших устройств AudioManager реализации, некоторые телефоны используют 48,000 Гц и некоторые США 44,100 Гц, это важно, если вы хотите высокое качество звука, как правило, большинство реализаций PCM A2DP, которые используют объемный звук 7.1+ потребует 48,000 Гц, а также кодирование/декодирование AAC.

Я надеюсь, что это дает вам с какой-то инсайт.


https://android-review.googlesource.com/#/c/98161/ реализует раковину A2DP. Он работает на Nexus 5. Можешь попробовать.