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

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

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

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

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

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

Ответ 1

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

Если вы серьезно относитесь к этому, ближайшая вещь, с которой я столкнулся, - это официальное введение для платформы bluetooth на Android: https://source.android.com/devices/bluetooth.html

Ответ 2

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

Ниже описано, как он ломается:

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

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

Можно делать то, что вы пытаетесь сделать, но вам нужно будет включить hardware.so и bluetooth_jni.so в пакет/проект NDK/JNI, который идет с вашими приложениями, и регистрируется через вызовы из .cpp для каждой из служб Bluetooth, найденных в "Пакетах/Приложениях/Bluetooth/jni", вы затем обрабатываете регистрацию в своей библиотеке NDK "com_android_bluetooth_a2dp.cpp" и "com_android_bluetooth_avrcp.cpp", так как их правильно набранные объекты,

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

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

Надеюсь, это даст вам некоторое представление.