Как модифицировать Bluetooth-стеки на Android для повышения качества звука Bluetooth —

Предупреждение: это очень продвинутое руководство, которое включает в себя изменение ваших стеков Bluetooth на Android — полностью прочитайте это руководство и следуйте всем инструкциям в точности так, как указано.

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

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

Низкое качество звука кодека SBC Bluetooth вызвано искусственными ограничениями всех текущих стеков Bluetooth и конфигурацией наушников, и это ограничение можно обойти на любых существующих устройствах.

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

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

В этом конце этого руководства приведен список предварительно пропатченных стеков Bluetooth для многих популярных устройств Android — они могут быть прошиты при восстановлении, как и любой другой прошиваемый .zip — если ни одно из устройств не принадлежит вам, у вас будет следовать руководству по изменению стеков Bluetooth на Android.

Краткая техническая информация о кодеке SBC

SBC имеет множество различных параметров, которые согласовываются на этапе настройки соединения:

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

Декодер должен поддерживать любую комбинацию этих параметров. Кодировщик может реализовать только часть из них.

Существующие стеки Bluetooth обычно согласовывают следующий профиль: Joint Stereo, 8 диапазонов, 16 блоков, Loudness, bitpool 2..53. Этот профиль кодирует аудио 44,1 кГц с битрейтом 328 кбит / с.

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

Однако параметр bitpool не привязан к конкретному профилю. На битрейт также существенно влияют другие параметры: тип аудиоканала, количество полос частот, количество аудиоблоков. Вы можете косвенно увеличить битрейт, согласовав нестандартные профили, не изменяя пул битов.

Например, Dual Channel кодирует каналы отдельно, используя весь битовый пул для каждого канала. Принудительное использование устройства вместо двухканального вместо совместного стерео даст нам почти удвоенный битрейт при том же максимальном пуле битов, 617 кбит / с.

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

Эти фиксированные значения Bitpool и Bitrate происходят из рекомендованных значений для высококачественного звука. Но рекомендация не является оправданием для ограничения профиля этими значениями.

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

Декодер SNK должен поддерживать все возможные значения битового пула, которые не приводят к превышению максимальной битовой скорости. Этот профиль ограничивает доступную максимальную скорость передачи данных до 320 кбит / с для монофонического режима и 512 кбит / с для двухканальных режимов.

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

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

Большинство устройств работают нормально в модифицированном стеке Bluetooth с битрейтом 507 кбит / с, без прерываний и потрескивания. Но при нормальных условиях такой битрейт никогда не будет согласован со стандартными стеками Bluetooth.

*** Требуется для тестирования с использованием руководств ниже: bluetooth-dualchannel-test-ubuntu-18.04.1-desktop-amd64.iso.torrent

Как проверить на ПК

Тест на совместимость наушников с высоким битрейтом SBC проще всего выполнить на ПК с адаптером Bluetooth. Я подготовил образ Ubuntu с измененным стеком Bluetooth, который можно запускать как на виртуальной машине (подключив адаптер Bluetooth в качестве устройства USB к виртуальной машине, он также работает с адаптерами, встроенными в ноутбуки), или загрузившись с флешка. В этом изображении используется следующий профиль: двухканальный, 8 полос, 16 блоков, громкость, пул бит 2,41, 44,1 кГц, что обеспечивает битрейт 485 кбит / с.

Бег в ВМ

  • Загрузите пакет расширений Virtualbox и Virtualbox: https://www.virtualbox.org/wiki/Downloads;
  • Установите Virtualbox, запустите его;
  • Установите пакет расширений, используя Файл → Настройки → Расширения;
  • Создайте новую виртуальную машину: Linux, Ubuntu (64-битная), 1024 RAM. Не создавайте HDD.
  • Перейдите к настройкам виртуальной машины, в разделе «Хранилище» выберите «Контроллер»: IDE, «Пусто», нажмите значок CD → Выбрать файл виртуального оптического диска;
  • Выберите загруженный bluetooth-dualchannel-test-ubuntu-18.04.1-desktop-amd64.iso;
  • Сохранить и закрыть окно настроек, запустить виртуальную машину;
  • Щелкните правой кнопкой мыши значок USB-кабеля в правом нижнем углу, выберите адаптер Bluetooth;

Работает на ПК

Образ поддерживает загрузку BIOS / CSM и UEFI.

  • Запишите образ на флэш-накопитель USB, используя Etcher: https://etcher.io/. Эта операция удалит все существующие файлы на USB-накопителе.
  • Выключить компьютер;
  • Вставьте USB-накопитель, включите компьютер и нажмите кнопку порядка загрузки (обычно Esc или F12);
  • Выберите флешку.

Выполнение теста

  • (необязательно, но рекомендуется) Дважды щелкните скрипт «Btsnoop Dump» на рабочем столе. Будет запущен захват данных Bluetooth для последующего анализа. Не закрывайте окно терминала.
  • Переключите наушники в режим сопряжения;
  • Нажмите на стрелку в правом верхнем углу, выберите значок Bluetooth → Настройки Bluetooth;
  • Выберите наушники, дождитесь завершения сопряжения и закройте окно;
  • Установите громкость Ubuntu примерно на 2/3. Также уменьшите громкость с помощью кнопок гарнитуры, так как она может быть очень громкой после сопряжения.
  • Откройте папку «музыка», запустите «testrecord1.flac»;
  • (необязательно, но рекомендуется) Закройте проигрыватель, закройте окно терминала. Это остановит сбор данных.
  • (необязательно, но рекомендуется) Откройте браузер Firefox, загрузите дамп данных (btsnoop_hci.btsnoop на рабочем столе) на https://btcodecs.valdikss.org.ru/

Вы можете слушать другую музыку в музыкальной папке или загружать свою;

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

Как проверить на устройстве Android

Для тестирования со смартфона или планшета Android необходимо использовать модифицированный стек Bluetooth, для которого требуются права суперпользователя.

Как захватить дамп данных Bluetooth на Android

  1. Выключить Bluetooth;
  2. В настройках разработчика включите переключатель «Включить журнал отслеживания Bluetooth HCI»;
  3. Включите Bluetooth, подключитесь к гарнитуре с помощью меню Bluetooth (это важно! Не разрешайте автоматическое подключение!);
  4. Воспроизвести короткий аудио-образец;
  5. Откройте настройки разработчика, отключите переключатель «Включить Bluetooth HCI snoop log»;
  6. Должны быть созданы /storage/emulated/0/btsnoop_hci.log или /data/misc/bluetooth/logs/btsnoop_hci.log. Если он отсутствует, откройте /etc/bluetooth/bt_stack.conf в текстовом редакторе и просмотрите путь в опции BtSnoopFileName.

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

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

Устройства, поддерживающие SBC не менее 512 кбит / с

  • 1MORE iBFree
  • JBL Everest 310
  • JBL Everest 700
  • Skullcandy HESH 3
  • Sony WI-C400
  • Sony MDR-1ABT
  • Sony MDR-ZX770BT
  • Sony MDR-XB650BT
  • Sony MDR-XB950B1
  • Sony SBH50
  • Bluedio T4s (Bitpool max 39. Реагирует на отсутствие поддержки Dual Channel, но работает при форсировании, 462 кбит / с. Не соответствует спецификации A2DP.)
  • Bluedio T5 (Реагирует на то, что не поддерживает двухканальный режим, но работает, если принудительно. Не соответствует спецификации A2DP.)
  • Bluedio T6 (Реагирует на то, что не поддерживает двухканальный режим, но работает при форсировании. Не соответствует спецификации A2DP. Принять чип Max 97220.)
  • Marshall Major II Bluetooth
  • Overdrive RealForce D1
  • Edifier W830BT
  • DEXP BT-250
  • Logitech BT адаптер
  • Штатная магнитола для Noname (микросхема CSR8645)
  • Штатная магнитола для Sony DSX-A400BT

Устройства, поддерживающие SBC выше 512 кбит / с

  • JBL Everest 310 (617-660 кбит / с)
  • Sony WI-C400 (576 кбит / с)
  • Sony MDR-ZX770BT (617-660 кбит / с)
  • Marshall Major II Bluetooth (617-660 кбит / с)
  • Overdrive RealForce D1 (730 кбит / с, двухканальный, 4 поддиапазона)

Устройства, которые не работают с более высокими битрейтами или двухканальными

  1. Harper HB-202 (потрескивание; чип Beken BK3256)
  2. Sony Ericsson MW600 (высокочастотные искажения, потрескивания; устройство с 2009 года)

Почему это важно: SBC 328k и 485k против aptX

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

SBC динамически распределяет биты квантования для полос частот, действуя «снизу вверх». Если весь битрейт использовался для низких и средних частот, верхние частоты «отключаются» (заглушаются).

aptX постоянно квантовает полосы частот с одинаковым количеством битов, что делает его кодеком с постоянной скоростью передачи битов: 352 кбит / с для 44,1 кГц, 384 кбит / с для 48 кГц. Он не может «передавать биты» на частоты, которые в них больше всего нужны. В отличие от SBC, aptX не «обрезает» частоты, но добавляет к ним шум квантования, уменьшая динамический диапазон звука, а иногда и создавая трещины. SBC, напротив, «ест детали» — отбрасывает самые тихие места.

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

Давайте рассмотрим особый случай, запись пианино. Вот спектрограмма:


Большая часть энергии лежит на частотах 0-4 кГц и длится до 10 кГц.
Спектрограмма файла aptX file выглядит так:

Вот SBC 328k:

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


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

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

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

Переключившись на высокоскоростной SBC, вы получите звук, превосходящий aptX, в большинстве случаев на любых наушниках.

  • original_and_aptx.zip
  • sbc.zip

Как изменить Bluetooth стеки на Android 5 — 7

Эти модификации должны применяться к стоковым стекам Android Bluetooth Bluedroid (Android 5) и Fluoride (Android 6-7). Стек, модифицированный Qualcomm, не поддерживается.

Замените Joint Stereo на Dual Channel в стандартной конфигурации SBC

андроид / платформа / внешний / Bluetooth / bluedroid / btif / ш / bta_av_co.c: 99

Код:

                const tA2D_SBC_CIE btif_av_sbc_default_config =
{
BTIF_AV_SBC_DEFAULT_SAMP_FREQ, / * samp_freq * /
A2D_SBC_IE_CH_MD_JOINT, / * ch_mode * /
A2D_SBC_IE_BLOCKS_16, / * block_len * /
A2D_SBC_IE_SUBBAND_8, / * num_subbands * /
A2D_SBC_IE_ALLOC_MD_L, / * alloc_mthd * /
BTA_AV_CO_SBC_MAX_BITPOOL, / * max_bitpool * /
A2D_SBC_IE_MIN_BITPOOL / * min_bitpool * /
};

Замените A2D_SBC_IE_CH_MD_JOINT на A2D_SBC_IE_CH_MD_DUAL.

Увеличьте приоритет двойного канала

андроид / платформа / внешний / Bluetooth / bluedroid / btif / ш / bta_av_co.c: 41

Код:

    если (src_cap.ch_mode  A2D_SBC_IE_CH_MD_JOINT)
pref_cap.ch_mode = A2D_SBC_IE_CH_MD_JOINT;
еще, если (src_cap.ch_mode  A2D_SBC_IE_CH_MD_STEREO)
pref_cap.ch_mode = A2D_SBC_IE_CH_MD_STEREO;
еще, если (src_cap.ch_mode  A2D_SBC_IE_CH_MD_DUAL)
pref_cap.ch_mode = A2D_SBC_IE_CH_MD_DUAL;
еще, если (src_cap.ch_mode  A2D_SBC_IE_CH_MD_MONO)
pref_cap.ch_mode = A2D_SBC_IE_CH_MD_MONO;
Переместить, если с A2D_SBC_IE_CH_MD_DUAL, наверх.

 

  1. Отключить или увеличить ограничение битрейта

У стека Android Bluetooth есть не только ограничение по битпулу, но и ограничение по битрейту, 328 кбит / с. Если наушники поддерживают, например, битпул 53 для 48 кГц, Android уменьшит битпул до предела 328 кбит / с. Это произойдет ПОСЛЕ согласования кодеков, на этапе кодирования не учитывайте значение битового пула в пакете Bluetooth SetCapabilities.

Android / платформа / внешний / Bluetooth / bluedroid / btif / SRC / btif_media_task.c: 172

Код:

#define DEFAULT_SBC_BITRATE 328

Заменить на 512.

  1. (только для экспериментов) Отключить ограничение MTU.

Это требуется для битрейтов выше ~ 580 кбит / с.

btif / SRC / btif_media_task.c: 174

Код:

/ * Размер полезной нагрузки 2DH5 679 байт - (4 байта заголовка L2CAP + 12 байтов заголовка AVDTP) * /
#define MAX_2MBPS_AVDTP_MTU 663

Как изменить Bluetooth стеки на Android 8 — 9

Эти модификации не были проверены, но должны работать.

Добавьте поддержку двух каналов в источник A2DP SBC

/platform/system/bt/stack/a2dp/a2dp_sbc.cc:55

Код:

/ * Возможности кодека SBC SRC * /
статическая константа tA2DP_SBC_CIE a2dp_sbc_caps = {
A2DP_SBC_IE_SAMP_FREQ_44, / * samp_freq * /
(A2DP_SBC_IE_CH_MD_MONO | A2DP_SBC_IE_CH_MD_JOINT), / * ch_mode * /
(A2DP_SBC_IE_BLOCKS_16 | A2DP_SBC_IE_BLOCKS_12 | A2DP_SBC_IE_BLOCKS_8 |
A2DP_SBC_IE_BLOCKS_4), / * block_len * /
A2DP_SBC_IE_SUBBAND_8, / * num_subbands * /
A2DP_SBC_IE_ALLOC_MD_L, / * alloc_method * /
A2DP_SBC_IE_MIN_BITPOOL, / * min_bitpool * /
A2DP_SBC_MAX_BITPOOL, / * max_bitpool * /
BTAV_A2DP_CODEC_BITS_PER_SAMPLE_16 / * bits_per_sample * /
};

добавить A2DP_SBC_IE_CH_MD_DUAL в ch_mode.

Замените Joint Stereo на Dual Channel в конфигурации по умолчанию

/platform/system/bt/stack/a2dp/a2dp_sbc.cc:82

Код:

/ * Конфигурация кодека SBC по умолчанию * /
const tA2DP_SBC_CIE a2dp_sbc_default_config = {
A2DP_SBC_IE_SAMP_FREQ_44, / * samp_freq * /
A2DP_SBC_IE_CH_MD_JOINT, / * ch_mode * /
A2DP_SBC_IE_BLOCKS_16, / * block_len * /
A2DP_SBC_IE_SUBBAND_8, / * num_subbands * /
A2DP_SBC_IE_ALLOC_MD_L, / * alloc_method * /
A2DP_SBC_IE_MIN_BITPOOL, / * min_bitpool * /
A2DP_SBC_MAX_BITPOOL, / * max_bitpool * /
BTAV_A2DP_CODEC_BITS_PER_SAMPLE_16 / * bits_per_sample * /
};

Замените A2DP_SBC_IE_CH_MD_JOINT на A2DP_SBC_IE_CH_MD_DUAL.

Увеличьте приоритет двойного канала

/platform/system/bt/stack/a2dp/a2dp_sbc.cc:1155

Код:

static bool select_best_channel_mode (uint8_t ch_mode, tA2DP_SBC_CIE * p_result,
btav_a2dp_codec_config_t * p_codec_config) {
если (ch_mode  A2DP_SBC_IE_CH_MD_JOINT) {
p_result-> ch_mode = A2DP_SBC_IE_CH_MD_JOINT;
p_codec_config-> channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO;
вернуть истину;
}
если (ch_mode  A2DP_SBC_IE_CH_MD_STEREO) {
p_result-> ch_mode = A2DP_SBC_IE_CH_MD_STEREO;
p_codec_config-> channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO;
вернуть истину;
}
если (ch_mode  A2DP_SBC_IE_CH_MD_DUAL) {
p_result-> ch_mode = A2DP_SBC_IE_CH_MD_DUAL;
p_codec_config-> channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO;
вернуть истину;
}
если (ch_mode  A2DP_SBC_IE_CH_MD_MONO) {
p_result-> ch_mode = A2DP_SBC_IE_CH_MD_MONO;
p_codec_config-> channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_MONO;
вернуть истину;
}
вернуть ложь;
}

Переместиться, если с A2DP_SBC_IE_CH_MD_DUAL, наверх.

Увеличение лимита битрейта

/platform/system/bt/stack/a2dp/a2dp_sbc_encoder.cc:42

Код:

#define A2DP_SBC_DEFAULT_BITRATE 328

Заменить на 512.

  1. (только для экспериментов) Отключить ограничение MTU

Это требуется для битрейтов выше ~ 580 кбит / с.

/platform/system/bt/stack/a2dp/a2dp_sbc_encoder.cc:47

Код:

#define MAX_2MBPS_AVDTP_MTU 663

Пропатченные Bluetooth-стеки (Flashable)

  • Le Max 2 Oreo Patched.zip
  • LeEco Cool Changer S1 EUI_5.8.19S.zip
  • Leeco LE2 (EUI 5.9.26s, Android 6) .zip
  • Xiaomi Mi Note (Miui 9 Miui.su usnkreal v8.4.12, Android 6.0.1) .zip
  • Xiaomi mi note 3 (MIUI 9, Android 7) .zip
  • Xiaomi Mi4c (Android 7.0 NRD90M, MIUI-9.5 9.5.1.0 (NXKCNFA)). Zip
  • Xiaomi MI5s (MIUI Global 9.6.1.0, Android 7) .zip
  • Xiaomi Redmi 3s (android 6.01, mmb29m, miui global 9.6.1.0) .zip
  • Xiaomi Redmi 4 (MiuiPro 10 8.8.2, Android 6.0.1, MMB29M) .zip
  • Xiaomi Redmi 4 Prime.zip
  • Xiaomi Redmi 4 pro (MIUI 9, miuipro 8.4.26) .zip
  • Xiaomi Redmi Note 3 (Воскресенский ремикс Android 7.1.2_r36) .zip
  • Redmi Note 4x (Масик Премиум, Android 7.0) .zip
  • Asus Zoom (Android 5, 2.26.40.108_20160520) .zip
  • Le Max 2 Oreo Patched.zip
  • Huawei P9 (Android 7) .zip
  • Samsung Galaxy S4 LTE GT-I9505 (Android 7.1.2; LineageOS 14.1-20180615-NIGHTLY-jfltexx) .zip
  • застежка-молния
  • Le Max 2 Oreo Patched.zip
Ссылка на основную публикацию