Android bluetooth audio fix

Модифицируем Bluetooth-стек для улучшения звука на наушниках без кодеков AAC, aptX и LDAC

Некоторые пользователи беспроводных наушников отмечают низкое качество звука и недостаток высоких частот при использовании стандартного Bluetooth-кодека SBC, который поддерживают все аудиоустройства. Частой рекомендацией для улучшения звука является покупка устройств и наушников с поддержкой кодеков aptX и LDAC. Эти кодеки требуют лицензионных отчислений, поэтому устройства с их поддержкой стоят дороже.

Оказывается, низкое качество SBC обусловлено искусственными ограничениями Bluetooth-стеков и настроек наушников, и это ограничение можно обойти на любых существующих устройствах, путём программных изменений смартфона или компьютера.

Кодек SBC

У кодека SBC есть множество разных параметров, которые согласуются на этапе установки соединения. Среди них:

  • Количество и тип каналов: Joint Stereo, Stereo, Dual Channel, Mono;
  • Количество частотных полос: 4 или 8;
  • Количество блоков в пакете: 4, 8, 12, 16;
  • Алгоритм распределения битов при квантовании: Loudness, SNR;
  • Максимальное и минимальное значение пула битов, используемых при квантовании (bitpool): обычно, от 2 до 53.

Декодирующее устройство обязано поддерживать любое сочетание этих параметров. Кодирующее устройство может реализовывать не все.
Существующие Bluetooth-стеки, как правило, согласуют следующий профиль: Joint Stereo, 8 полос, 16 блоков, Loudness, bitpool 2..53. Этот профиль кодирует 44.1 кГц аудио с битрейтом 328 кбит/с.
Параметр bitpool напрямую влияет на битрейт в рамках одного профиля: чем он выше, тем выше битрейт, а следовательно и качество.
Однако параметр bitpool не привязан к конкретному профилю; влияние на битрейт также в значительной степени оказывает и другие параметры: тип каналов, количество частотных полос, количество блоков. Поднять битрейт можно косвенно, путем согласования нестандартных профилей, без изменения bitpool.

Формула подсчета битрейта SBC

Например, режим Dual Channel кодирует каналы раздельно, используя весь bitpool для каждого из каналов. Заставив устройство использовать Dual Channel вместо Joint Stereo, мы получим почти удвоенный битрейт при том же максимальном значении bitpool: 617 кбит/с.
По моему мнению, использование не привязанного к профилю значения bitpool на этапе согласования — недоработка стандарта A2DP, которая и привела к искусственному ограничению качества SBC. Разумней было бы согласовывать bitrate, а не bitpool.

Такие фиксированные значения Bitpool и Bitrate берут свое начало из таблицы с рекомендованными к использованию значениями для высококачественного аудио. Но рекомендация — не повод ограничиваться этими значениями.

Спецификация A2DP v1.2, которая была активна с 2007 по 2015 год, предписывает всем декодирующим устройствам корректно работать с битрейтами до 512 кбит/с:

The decoder of the SNK shall support all possible bitpool values that do not result in excess of the maximum bit rate. This profile limits the available maximum bit rate to 320kb/s for mono, and 512kb/s for two-channel modes.

В новой версии спецификации ограничение по битрейту отсутствует. Предполагается, что современные наушники, выпущенные после 2015 года и поддерживающие EDR, могут поддерживать битрейты до ≈730 кбит/с.

По какой-то причине, у проверенных мной Bluetooth-стеков Linux (PulseAudio), Android, Blackberry и macOS есть искусственные ограничения максимального значения параметра bitpool, который напрямую влияет на максимальный битрейт. Но это — не самая большая проблема, почти все наушники тоже ограничивают максимальное значение bitpool числом 53.
Как я уже успел убедиться, большинство устройств отлично работает на модифицированном Bluetooth-стеке с битрейтом в 551 кбит/с, без прерываний и треска. Но такой битрейт никогда не будет согласован в обычных условиях, на обычных Bluetooth-стеках.

Модифицируем Bluetooth-стек

В любом Bluetooth-стеке, который совместим со стандартом A2DP, есть поддержка режима Dual Channel, но активировать её из интерфейса не представляется возможным.

Давайте добавим переключатель в интерфейс! Я сделал патчи для Android 8.1 и Android 9, которые добавляют полноценную поддержку Dual Channel в стек, добавляют режим в меню переключения режима в инструменты разработчика, и обрабатывают SBC с поддержкой Dual Channel так, будто это дополнительный кодек, вроде aptX, AAC или LDAC (Android называет это HD Audio), добавляя галочку в настройки Bluetooth-устройства. Вот как это выглядит:

При активации галочки, Bluetooth-аудио начинает передаваться с битрейтом 551 кбит/с, если наушники поддерживают соединение на скорости 3 мбит/с, или 452 кбит/с, если наушники поддерживают только 2 мбит/с.

Данный патч включён в следующие альтернативные прошивки:

  • LineageOS
  • Resurrection Remix
  • crDroid
Читайте также:  Синхронизация смарт часов с телефоном андроид самсунг

Откуда взялись 551 и 452 кбит/с?

Технология разделения эфира в Bluetooth предназначена для эффективной передачи больших пакетов фиксированного размера. Передача данных происходит слотами, самое большое количество слотов, отправляемых за одну передачу — 5. Также есть режимы передачи, использующие 1 или 3 слот, но не 2 или 4. В 5 слотах можно передать до 679 байт на скорости соединения 2 мбит/с и до 1021 байт на скорости 3 мбит/с, а в 3 — 367 и 552 байта соответственно.

Если мы хотим передать меньше данных, чем 679 или 1021 байт, но больше, чем 367 или 552 байта, то передача всё равно займет 5 слотов, а данные будет передаваться за такое же время, что уменьшает эффективность передачи.

SBC в режиме Dual Channel, на 44100 Гц-аудио с параметрами Bitpool 38, 16 блоков во фрейме, 8 частотных диапазонов, кодирует аудио во фреймы размером 164 байт, с битрейтом 452 кбит\с.
Аудио должно быть инкапсулировано в протоколы передачи L2CAP и AVDTP, которые забирают 16 байт от полезной аудионагрузки.

Таким образом, в одну Bluetooth-передачу с 5 слотами удаётся вместить 4 аудиофрейма:

Мы вместили 11.7 мс аудиоданных в отправляемый пакет, который будет передан за 3.75 мс, и у нас осталось 6 неиспользованных байт в посылке.
Если чуть поднять bitpool, 4 аудиофрейма уже не удастся упаковать в одну посылку. Придётся отправлять по 3 фрейма за раз, что снижает эффективность передачи, уменьшает количество передаваемого аудио за одну посылку, и быстрее приведёт к заиканиям аудио при плохих радиоусловиях.

Таким же образом был подобран битрейт 551 кбит/с для EDR 3 мбит/с: с Bitpool 47, 16 блоками во фрейме, 8 частотными диапазонами получается размер фрейма 200 байт, при битрейте 551 кбит/с. В одну посылку вмещается 5 фреймов или 14.6 мс музыки.

Алгоритм расчёта всех параметров SBC достаточно сложный, можно легко запутаться, если считать вручную, поэтому я сделал интерактивный калькулятор в помощь интересующимся: btcodecs.valdikss.org.ru/sbc-bitrate-calculator

Зачем всё это нужно?

Вопреки расхожему мнению о качестве звука кодека aptX, на некоторых файлах он может давать результаты хуже, чем SBC со стандартным битрейтом в 328 кбит/с.

SBC динамически выделяет биты квантования для частотных полос, действуя по принципу «от нижних к верхним». Если весь битрейт использовался на нижние и средние частоты, верхние частоты «обрежутся» (вместо них будет тишина).
aptX квантует частотные полосы одним и тем же количеством бит постоянно, из-за чего у него постоянный битрейт: 352 кбит/с для 44.1 кГц, 384 кбит/с для 48 кГц, и он не может «перенести биты» на те частоты, которые больше всего в них нуждаются. В отличие от SBC, aptX не будет «обрезать» частоты, а будет добавлять в них шумы квантования, уменьшая динамический диапазон аудио, и иногда привносить характерные потрескивания. SBC же «съедает детали» — отбрасывает наиболее тихие участки.
В среднем, по сравнению с SBC 328k, aptX вносит меньше искажений в музыку с широким частотным диапазоном, но на музыке с узким диапазоном частот и широким динамическим диапазоном SBC 328k иногда выигрывает.

Рассмотрим частный случай. Спектрограмма записи игры на фортепиано:

Основная энергия лежит в частотах от 0 до 4 кГц, и продолжается до 10 кГц.
Спектрограмма файла, сжатого в aptX, выглядит следующим образом:

А так выглядит SBC 328k.

Видно, что SBC 328k периодически полностью отключал диапазон выше 16 кГц, и расходовал весь доступный битрейт на диапазоны ниже этого значения. Однако, aptX внес больше искажений в слышимый человеческим ухом спектр частот, что можно видеть на вычтенной оригинальной спектрограмме из спектрограммы aptX (чем ярче, тем больше искажений):

В то время как SBC 328k меньше испортил сигнал в диапазоне от 0 до 10 кГц, а остальное — обрезал:

Битрейта 485k SBC хватило, чтобы сохранить весь диапазон частот, без отключения полос.

SBC 485k на этой композиции значительно опережает aptX в диапазоне 0-15 кГц, и с меньшей, но все же заметной разницей — в 15-22 кГц (чем темнее, тем меньше искажений):

Переключившись на высокобитрейтный SBC, вы получите звук, зачастую превосходящий aptX, на любых наушниках. На наушниках, поддерживающих подключение EDR 3 мбит/с, битрейт 551 кбит/с даёт звук, сравнимый с aptX HD.

А можно ещё больше?

В патче для Android также имеется опция для ещё большего повышения битрейта для устройств EDR 2 мбит/с. Можно повысить битрейт с 452 кбит/с до 595 кбит/с, ценой уменьшения стабильности передачи в сложных радиоусловиях.
Достаточно установить переменную persist.bluetooth.sbc_hd_higher_bitrate в значение 1:

Патч на экстремальный битрейт пока принят только в LineageOS 15.1, но не в 16.0.

Совместимость с устройствами

SBC Dual Channel поддерживается практически всеми наушниками, колонками и автомобильными головными устройствами. Это немудрено — стандарт предписывает его поддержку в любых декодирующих устройствах. Есть небольшое количество устройств, на которых этот режим вызывает проблемы, но это — единичные экземпляры.
Более подробно с совместимыми устройствами можно ознакомиться на 4pda или xda-developers.

Читайте также:  Madout 2 системные требования андроид

Сравнение различий звука

Я сделал веб-сервис, кодирующий аудио в SBC (а также aptX и aptX HD) в реальном времени, прямо в браузере. С помощью него вы сможете сравнивать звук различных профилей SBC и другие кодеки, без фактической передачи аудио по Bluetooth, на любых проводных наушниках, колонках, и вашей любимой музыке, а также изменять параметры кодирования прямо во время воспроизведения аудио.
btcodecs.valdikss.org.ru/sbc-encoder

Связь с разработчиками Android

Я писал многим разработчикам Bluetooth-стека из Google, с просьбой рассмотреть включение патчей в основную ветку Android — AOSP, но не получил ни одного ответа. Мои патчи в системе работы с патчами Gerrit для Android также остались без комментариев со стороны кого-либо причастного.
Я был бы рад, если бы мне посодействовали в связи с разработчиками из Google и внедрении SBC HD в Android. Патчcет в gerrit уже устарел (это одна из ранних ревизий), и я его обновлю, если разработчиков заинтересуют мои изменения (мне непросто его обновлять, у меня нет совместимых с Android Q устройств).

Источник

Почему не работает Bluetooth на Андроиде

С появлением высокоскоростного интернета необходимость в использовании Bluetooth отпала. Такой способ передачи файлов считался безнадежно устаревшим. Но когда на рынке появились «умные» гаджеты – часы, наушники, фитнес-трекеры, автомобильные магнитолы, поддерживающие беспроводное подключение, старая технология вновь стала популярной. Но что делать, если вдруг оказалось, что не работает Блютуз на Андроиде? Как оказалось, проблему легко устранить, главное определить причину неисправности радиомодуля.

Не работает Bluetooth на Андроиде

Технология Блютуз появилась на рынке в 1968 году, и сразу обрела популярность среди производителей многофункциональных устройств. Этот способ передачи информации стал альтернативой инфракрасному порту, который использовался до этого. Сегодня технологией Bluetooth пользуется каждый второй владелец мобильных гаджетов, объясняя это высокой скоростью передачи данных и экономным потреблением энергоресурсов. Поэтому выход из строя радиомодуля становится серьезной помехой. Не стоит отчаиваться, ведь существует масса способов исправить ситуацию.

Включаем и выключаем Блютуз

Если Bluetooth перестал передавать файлы или пишет, что нет сопряжения, рекомендуется посмотреть его статус в настройках Андроида и выполнить повторное подключение радиомодуля.

  1. Открыть «Настройки»;
  2. Перейти в раздел «Беспроводные сети» («Подключения»);
  3. Найти строку «Bluetooth» и установить переключатель в положение «Включено» (переместить вправо);
  4. Модуль запустит поиск доступных для подключения устройств;
  5. Чтобы установить соединение, на втором устройстве также нужно активировать опцию.

Для успешного сопряжения в настройках второго телефона нужно выбрать статус «Отображать для других устройств». Если синхронизация была установлена ранее, в списке доступных устройств будет фигурировать наименование девайса. После активации модуля, соединение будет выполнено автоматически.

Требуется перезагрузка устройства

Еще один способ быстро устранить сбой в работе модуля Bluetooth – перезагрузить смартфон. Как выполнить «Restart»?

  1. Коснуться кнопки отключения питания;
  2. Выбрать опцию «Перезагрузка».

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

Программная ошибка

Иногда радиомодуль перестает нормально работать после установки очередного приложения. Оно может вызывать конфликт в ПО телефона или управлять включением беспроводной связи. Чтобы обнаружить его и удалить, следует перезагрузить телефон в безопасном режиме. Сделать это можно так:

  • Нажав на кнопку питания устройства, открыть «Меню выключения»;
  • Коснуться длинным тапом значка «Выключение»;
  • В появившемся окне подтвердить перевод смартфона в «Безопасный режим».

Далее нужно попытаться включить Блютуз на Андроиде. Если опция заработала, значит, причина кроется в программе, которая была инсталлирована в числе последних. Удалить ее можно несколькими способами:

  • с домашнего экрана;
  • через раздел «Настройки» — «Приложения»;
  • с помощью сторонних утилит.

Обновление операционной системы

Для реализации этого способа понадобится следовать такому алгоритму:

  • Через системное меню открыть «Настройки»;
  • Прокрутив экран вниз, найти раздел «О телефоне» («Об устройстве»);
  • Нажать на «Версия» (в нашем случае на Xiaomi);
  • Перейти во вкладку «Обновление системы»;
  • Начнется поиск обновлений. После его завершения на экране появится уведомление с предложением обновить систему до последней версии либо с надписью «Обновления не найдены».

Выполнение процедуры возможно только при подключении к Интернету. В этом случае целесообразно использовать WiFi, во избежание расхода мобильного трафика.

Использование приложений для принудительного включения

Если на смартфоне модуль Блютуз вышел из строя, проблему с подключением можно решить с помощью специальных приложений, позволяющих управлять беспроводной технологией. Все они доступны для скачивания в Play Маркете. Наиболее актуальными на сегодняшний день являются следующие программы.

Bluetooth Visibly Fix

После того, как будет выполнена инсталляция, понадобится выполнить следующее:

  1. Запустить приложение и предоставить все запрашиваемые разрешения;
  2. Установить галку напротив первого пункта «Visible to All» (видимый для всех);
  3. Зайти в «Настройки» и изменить доступные параметры «под себя».

Программа позволяет изменить состояние видимости:

  • при успешном сопряжении с устройством;
  • после отключения устройства;
  • для мультисканирования через интерфейс приложений.

В настройках можно ограничить видимость для выбранных устройств, а также убрать системные уведомления.

Читайте также:  Main activity class android

Bluetooth Auto Connect

Еще одно приложение, позволяющее решить проблему с Блютуз-подключением. Оно позволяет контролировать приоритет и профили подключения, жестко контролируя процесс, чтобы исключить вмешательство операционной системы Android. Работать с программой не менее просто, чем с предыдущей, единственный ее недостаток – отсутствие русифицированной версии. И если не работает Блютуз на Андроиде, как вариант, можно использовать эту программу.

После запуска программы на экране появляется меню настроек. В нем понадобится изменить параметры нескольких пунктов:

  1. «Set Last Device». Если поставить галку, то после активации режима смартфон будет автоматически подключаться к последнему устройству;
  2. «Profiles». Здесь можно выбрать тип соединения. Например, для быстрого сопряжения с гарнитурой стоит установить галки в стоках «Media Audio (A2DP)» и «Call Auto (HSP)»;
  3. «Devices». В данном разделе можно выбрать оборудования для быстрого сопряжения.

Оставшиеся настройки изменять не рекомендуется. После завершения этого этапа будет автоматически подключаться к выбранным устройствам при каждой активации режима Bluetooth.

Проверка на вирусы

Наличие вирусов или вредоносного ПО препятствует запуску системных приложений, а также активации некоторых функций. Если в работе Bluetooth возникли сбои, целесообразно проверить гаджет на вирусы. Самый простой способ – проверка мобильными программами-антивирусами. Они позволяют выявлять и удалять приложения с вредоносным кодом, а также сообщать об имеющихся уязвимостях, нежелательных файлах или действиях.

Инструкция для проверки:

  1. Скачать и установить антивирусное приложение. Для этого перейти в магазин Play Маркет и ввести в поисковой строке «антивирус»;
  2. Запустить программу, а затем провести сканирование угроз. Для этого потребуется обновить сигнатуры (базу данных);
  3. При необходимости можно изменить параметры для расширенной проверки системы. Это увеличит время сканирования, но позволит выявить все угрозы, существующие на устройстве.

Дождаться окончания проверки, и в случае обнаружения вирусов принять решение о дальнейших действиях: вылечить, поместить в карантин, удалить.

Очистка кэша

Если восстановить работу беспроводной связи до сих пор не удалось, можно попробовать очистить кэш-память. Для этого нужно:

  1. Запустить «Настройки»;
  2. Открыть раздел «Приложения»;
  3. Коснувшись значка меню (три вертикальные точки в правом верхнем углу экрана) выбрать опцию «Показать системные приложения»;
  4. Из списка выбрать программу «Bluetooth»;
  5. На следующей странице перейти на вкладку «Память» («Хранилище»);
  6. Нажать на клавишу «Очистить кэш».

Перезагрузить устройство и повторно выполнить сопряжение с другим устройством.

Сменить устройство, к которому подключаетесь

Исправить проблему с сопряжением по Блютуз можно путем удаления устройства из списка доступных, и его повторного поиска. Для этого нужно:

  1. Открыть «Настройки»;
  2. Перейти в раздел «Подключения»;
  3. Выбрать Bluetooth и активировать соединение;
  4. Подождать, пока смартфон найдет доступные для подключения устройства;
  5. В списке найти имя гаджета и коснуться значка шестеренки;
  6. В разделе настроек выбрать опцию «Отменить сопряжение» (или «Разорвать пару»).

После этого устройство будет готово к «первому сопряжению».

Удаление папки с MAC-адресом

Восстановить работоспособность модуля беспроводной связи можно, удалив папки с MAC-адресами либо очистив Cache и Dalvik Cache. Операция становится доступной в том случае, если у пользователя имеются Root-права или на телефоне установлено кастомное Recovery. В таких прошивках неисправность возникает гораздо чаще, чем на стандартном Android. Чтобы удалить папку с MAC-адресом, нужно перейти в каталог /data/misc/bluedroid.

Сбросить до заводских настроек

Последним вариантом устранения проблемы в работе Bluetooth является сброс настроек до заводских параметров. Полное форматирование выполняют, когда другие способы оказались малоэффективными или не помогли достичь желаемого результата. Метод является радикальным, поскольку полностью удаляет информацию, хранящуюся в памяти телефона: контакты, фотографии, документы, заметки, СМС-сообщения. Поэтому прежде чем запускать процесс, необходимо создать резервную копию, записать логины, пароли от аккаунта Google.

Для возврата аппарата в предпродажное состояние целесообразно воспользоваться меню Android.

  • Открыть «Настройки», используя любой удобный способ (рабочий стол, меню, панель быстрого доступа);
  • Перейти в раздел «Восстановление и сброс»;
  • Прокрутив экран вниз, выбрать опцию «Сброс настроек» (в зависимости от модели устройства название может отличаться);
  • Система выдаст предупреждение, что во время выполнения операции все пользовательские данные: личная информация, приложения и программы, настройки, будут удалены;
  • Нажатием кнопки « Сбросить все» подтвердить очистку смартфона.

После окончания операции устройство будет соответствовать виду, который оно имело на момент покупки.

Обратиться в сервисный центр

Если ни один из предложенных методов не помог восстановить работу беспроводной связи Блютуз на Android, причина неисправности, скорее всего, кроется в поломке самого модуля. Поскольку устранить дефект своими силами не удастся, необходимо обратиться в сервисный центр. Мастер аккуратно распаяет контакты поврежденного блока, а на его место установит новый модуль. После этого он активирует Блютуз в настройках и проверит работоспособность беспроводной связи.

Помощь сотрудников сервисного центра окажется кстати, если для восстановления работы беспроводной связи требуется перепрошить устройство, а собственных знаний для выполнения операции недостаточно.

Если на Android-устройстве перестал работать радиомодуль Bluetooth, не стоит впадать в панику. Существует много способов исправить ситуацию, главное отыскать причину и устранить ее, используя предложенные в данной статье рекомендации.

Источник

Оцените статью