Улучшение звука Bluetooth на наушниках без aptX и LDAC | Тестирование совместимости высоких битрейтов SBC с различными устройст



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

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


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

SBC XQ интегрирован в прошивку LineageOS, в сборки LineageOS 15.1 от 31 марта 2019 года и новее, и в LineageOS 16 от 13 мая 2019 года и новее.



Краткая техническая информация о кодеке 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.

Прикрепленное изображение


Например, 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-стеке с битрейтом в 507 кбит/с, без прерываний и треска. Но такой битрейт никогда не будет согласован в обычных условиях, на обычных Bluetooth-стеках.

Тестирование на компьютере
Совместимость наушников с высокими битрейтами проще всего тестировать на компьютере с Bluetooth-адаптером. Я подготовил образ Ubuntu с модифицированным Bluetooth-стеком, который можно запустить как в виртуальной машине (пробросив Bluetooth-адаптер как USB-устройство, сработает и с адаптерами, встроенными в ноутбуки), так и загрузившись с флешки. Этот образ использует следующий профиль: Dual Channel, 8 полос, 16 блоков, Loudness, bitpool 2..41, 44.1 кГц, что обеспечивает битрейт в 485 кбит/с.
Скачать: Прикрепленный файлbluetooth-dualchannel-test-ubuntu-18.04.1-desktop-amd64.iso.torrent ( 5.44 КБ )

Запуск в виртуальной машине:
  1. Скачайте Virtualbox и Virtualbox Extension Pack: https://www.virtualbox.org/wiki/Downloads;
  2. Установите Virtualbox, запустите его;
  3. Установите Extension Pack, используя меню File → Preferences → Extensions;
  4. Создайте новую виртуальную машину Linux, Ubuntu (64-bit), с 1024 мегабайтами оперативной памяти. Диск не создавайте.
  5. Зайдите в настройки виртуальной машины, в пункте Storage выберите Controller: IDE, Empty, нажмите на значок CD → Choose virtual optical disk file;
  6. Выберите bluetooth-dualchannel-test-ubuntu-18.04.1-desktop-amd64.iso;
  7. Сохраните и закройте настройки, запустите виртуальную машину;
  8. Нажмите на значок USB-кабеля внизу справа появившегося окна правой кнопкой мыши, выберите Bluetooth-адаптер;

Запуск на компьютере
Образ поддерживает BIOS/CSM и UEFI.
  1. Запишите образ на флешку с помощью программы Etcher: https://etcher.io/. Эта операция удалит все существующие файлы на флешке.
  2. Выключите компьютер;
  3. Вставьте флешку, включите компьютер, нажимая кнопку выбора устройства загрузки (обычно Esc или F12);
  4. Выберите загрузку с флешки.

Проведение тестирования
  1. (не обязательно, но желательно) Запустите скрипт "Btsnoop Dump" на рабочем столе, двойным кликом. Он запустит запись дампа трафика Bluetooth, чтобы отправить ее на сервер для анализа. Не закрывайте окно терминала.
  2. Переведите наушники в режим сопряжения;
  3. Кликните на стрелочку в правом верхнем углу, выберите значок Bluetooth → Bluetooth Settings;
  4. Выберите ваши наушники, дождитесь сопряжения и закройте окно настроек;
  5. Установите громкость в Ubuntu примерно на 2/3 максимального значения. Также уменьшите громкость на наушниках, после сопряжения громкость может быть очень высокой.
  6. Откройте папку music на рабочем столе, воспроизведите testrecord1.flac;
  7. (не обязательно, но желательно) Закройте окно плеера, закройте черное терминальное окно. Это остановит запись дампа трафика.
  8. (не обязательно, но желательно) Откройте браузер Firefox, загрузите дамп трафика (файл btsnoop_hci.btsnoop на рабочем столе) на https://btcodecs.valdikss.org.ru/
  9. Можете прослушать другие записи в папке music, или включить свои;
  10. Напишите в этой теме, с какими наушниками (или другими устройствами) вы проводили тестирование, и результат. Недостаточно только загрузить дамп на сервер!

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

Сообщение отредактировал ValdikSS - 15.09.19, 16:54



Реп: (484)
Тестирование на устройстве с Android
Для тестирования со смартфона или планшета под управлением Android придется модифицировать Bluetooth-стек, для чего необходимы root-права.

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

Если вы обычный пользователь
Пришлите мне библиотеки Bluetooth-стека вашего устройства (только Android 5-8): /system/lib/hw/bluetooth.default.so и /system/lib64/hw/bluetooth.default.so (если последний имеется). Я модифицирую настройки стека, и вышлю файлы вам.
Пожалуйста, присылайте библиотеки только в том случае, если вы готовы протестировать наушники, отсутствующие в списке ниже, в третьем сообщении. Мне тяжело патчить библиотеки всем желающим.

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

Эти файлы только для тестирования поддержки Dual Channel наушниками, не для повседневного использования.
Файлы были выложены для проведения тестирования совместимости наушников с Dual Channel в конце 2018 года, когда ещё не было понятно, сколько устройств поддерживают этот режим. Все файлы ниже уже не актуальны, не предназначены для использования, гарантированно приведут к проблемам с Bluetooth, и оставлены здесь исключительно в архивных целях.
Сделайте резервную копию библиотеки перед ее заменой. Измененные библиотеки для некоторых устройств:
Прикрепленный файлAsus Zoom (Android 5, 2.26.40.108_20160520).zip ( 2.84 МБ )
Прикрепленный файлRedmi Note 4x (Masik Premium, android 7.0).zip ( 2.24 МБ )
Прикрепленный файлXiaomi Mi4c (Android 7.0 NRD90M, MIUI-9.5 9.5.1.0 (NXKCNFA)).zip ( 1.49 МБ )
Прикрепленный файлXiaomi MI5s (MIUI Global 9.6.1.0, Android 7).zip ( 1.49 МБ )
Прикрепленный файлLeEco Cool Changer S1 EUI_5.8.19S.zip ( 1.69 МБ )
Прикрепленный файлLeeco LE2 (EUI 5.9.26s, Android 6).zip ( 1.64 МБ )
Прикрепленный файлLe Max 2 Oreo Patched.zip ( 7.06 МБ )
Прикрепленный файлXiaomi Redmi 4 Prime.zip ( 884.97 КБ )
Прикрепленный файлXiaomi Redmi 4 (MiuiPro 10 8.8.2, Android 6.0.1, MMB29M).zip ( 1.66 МБ )
Прикрепленный файлXiaomi Redmi 4 pro (MIUI 9, miuipro 8.4.26).zip ( 1.65 МБ )
Прикрепленный файлXiaomi mi note 3 (MIUI 9, Android 7).zip ( 1.75 МБ )
Прикрепленный файлXiaomi Mi Note 3, MiuiPro 9.5.10.0.zip ( 1.75 МБ )
Прикрепленный файлXiaomi Mi Note (Miui 9 Miui.su usnkreal v8.4.12, Android 6.0.1).zip ( 1.63 МБ )
Прикрепленный файлXiaomi Redmi Note 3 (Resurrection Remix Android 7.1.2_r36).zip ( 772.17 КБ )
Прикрепленный файлXiaomi Redmi 3s (android 6.01, mmb29m, miui global 9.6.1.0).zip ( 1.65 МБ )
Прикрепленный файлZTE Nubia Z11 Mini, Android 6.0.1.zip ( 1.64 МБ )
Прикрепленный файлZTE blade x9 (Android 5.1, RuCommon_T07).zip ( 1.48 МБ )
Прикрепленный файлHuawei P9 (Android 7).zip ( 2.23 МБ )
Прикрепленный файлSamsung Galaxy S4 LTE GT-I9505 (Android 7.1.2; LineageOS 14.1-20180615-NIGHTLY-jfltexx).zip ( 2.24 МБ )
Прикрепленный файлPixel 2 XL (Pie 9.0).zip ( 12.01 МБ )
Прикрепленный файлEssential Phone (9.0 Pie).zip ( 12 МБ )
Прикрепленный файлRedmi 3S (LineageOS 15.1 with 9.5.8.0 MALMIFD).zip ( 7.05 МБ )
Прикрепленный файлLeEco LE Pro 3 (PixelExperience_zl1-8.1.0-20180708).zip ( 3.69 МБ )
Прикрепленный файлOP5-OOS-5.1.5_lib64.zip ( 2.64 МБ )
Прикрепленный файлOP6-5.1.11_lib64.zip ( 3.64 МБ )
Прикрепленный файлPixel 2 (Pie).zip ( 6.49 МБ )
Прикрепленный файлLeeco Cool1 Dual (JUI 7.1.1).zip ( 2.54 МБ )
Прикрепленный файлXiaomi Mi Max (Android 6.0.1).zip ( 2.45 МБ )
Прикрепленный файлXiaomi Redmi 5A Lite (AOSPExtended 7.1.2).zip ( 2.32 МБ )
Прикрепленный файлXiaomi Redmi Note 4X (9.6.2.0).zip ( 2.25 МБ )
Прикрепленный файлSharp AQUOS P1 (Android 6.0.1).zip ( 1.63 МБ )

Unrestricted/unlimited-версии согласуют режим Dual Channel и отключают ограничение битрейта (будет использоваться 617-660 кбит/с), версии 482, 486 повышают ограничение битрейта до 482 и 486 кбит/с соответственно (согласуется 474-485 кбит/с).

Если вы разработчик прошивки, и собираете ее из исходных кодов (Android 5-7)
Патчсет, увеличивающий Bitpool и добавляющий опцию включения Dual Channel в меню Bluetooth, доступен по следующей ссылке:
LineageOS 14.1 (Android 7.1.2)

Ниже представлена устаревшая информация, оставлена только для истории.
Описанные модификации предназначены только для проведения тестирования, и не должны включаться в стабильную ветку прошивок!
Данные модификации применимы только к оригинальному стеку Android (bluedroid). Для измененного стека от Qualcomm модификации будут отличаться.
Для Android 5-7, нужно модифицировать следующие файлы:
1. Заменить Joint Stereo на Dual Channel в стандартной конфигурации
android/platform/external/bluetooth/bluedroid/btif/co/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.

2. Установить приоритет Dual Channel перед другими параметрами каналов
android/platform/external/bluetooth/bluedroid/btif/co/bta_av_co.c:411
if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_JOINT)
pref_cap.ch_mode = A2D_SBC_IE_CH_MD_JOINT;
else if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_STEREO)
pref_cap.ch_mode = A2D_SBC_IE_CH_MD_STEREO;
else if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_DUAL)
pref_cap.ch_mode = A2D_SBC_IE_CH_MD_DUAL;
else if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_MONO)
pref_cap.ch_mode = A2D_SBC_IE_CH_MD_MONO;

Переместить if с A2D_SBC_IE_CH_MD_DUAL наверх, чтобы он выбирался первым.

3. Убрать или увеличить ограничение битрейта
В Bluetooth-стеке Android установлено ограничение не только на bitpool, но и на битрейт, в 328 кбит/с. Если наушники, например, поддерживают bitpool 53 при 48 кГц, то Android понизит его до 51, чтобы уместиться в ограничение битрейта. Это произойдет уже на этапе отправки кодированного аудио, а не на этапе согласования, не обращайте внимание на значение max bitpool в Bluetooth-пакете SetCapabilities.
android/platform/external/bluetooth/bluedroid/btif/src/btif_media_task.c:172
#define DEFAULT_SBC_BITRATE 328

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

4. (только для экспериментов) Убрать ограничение MTU.
Необходимо только для битрейтов ~580 kbit/s и выше.
btif/src/btif_media_task.c:174
/* 2DH5 payload size of 679 bytes - (4 bytes L2CAP Header + 12 bytes AVDTP Header) */
#define MAX_2MBPS_AVDTP_MTU 663

Если вы разработчик прошивки, и собираете ее из исходных кодов (Android 8-9)
Патчсет, увеличивающий Bitpool и добавляющий опцию включения Dual Channel в меню Bluetooth, доступен по следующим ссылкам:


Ниже представлена устаревшая информация, оставлена только для истории.
1. Добавить поддержку Dual Channel в A2DP SBC Source
/platform/system/bt/stack/a2dp/a2dp_sbc.cc:55
/* SBC SRC codec capabilities */
static const 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.

2. Заменить Joint Stereo на Dual Channel в стандартной конфигурации
/platform/system/bt/stack/a2dp/a2dp_sbc.cc:82
/* Default SBC codec configuration */
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.

3. Установить приоритет Dual Channel над Joint Stereo
/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) {
if (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;
return true;
}
if (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;
return true;
}
if (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;
return true;
}
if (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;
return true;
}
return false;
}

Переместить if с A2DP_SBC_IE_CH_MD_DUAL наверх.

4. Увеличить ограничение битрейта
/platform/system/bt/stack/a2dp/a2dp_sbc_encoder.cc:42
#define A2DP_SBC_DEFAULT_BITRATE 328

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

5. (только для экспериментов) Убрать ограничение MTU
Необходимо только для битрейтов от 580 кбит/с и выше.
/platform/system/bt/stack/a2dp/a2dp_sbc_encoder.cc:47
#define MAX_2MBPS_AVDTP_MTU 663

Если вы хотите изменить существующий собранный файл библиотеки (Android 5-7)
Для продвинутых пользователей и разработчиков прошивок. Необходимы минимальные знания ARM-ассемблера. Код из примера может не совпадать с кодом вашей библиотеки, в зависимости от версии компилятора, оптимизаций и опций компилирования.
Данные модификации применимы только к оригинальному стеку Android (bluedroid). Если вы видите строку "Needed Library 'com.qualcomm.qti.bluetooth_audio@1.0.so'" или подобную в IDA Pro, с большой вероятностью, эта инструкция вам не поможет.
Вам потребуется IDA Pro (проверял на купленной версии) и любой HEX-редактор.

1. Скачайте и установите IDA Pro, откройте bluetooth.default.so, дождитесь окончания анализа файла (внизу слева должно быть AU: Idle).
Будем искать код из файла Ищем код из файла android/platform/external/bluetooth/bluedroid/btif/co/bta_av_co.c:411.
Значения констант следующие:
A2D_SBC_IE_SAMP_FREQ_48 = 0x10
A2D_SBC_IE_SAMP_FREQ_44 = 0x20
A2D_SBC_IE_CH_MD_JOINT = 0x01
A2D_SBC_IE_CH_MD_STEREO = 0x02
A2D_SBC_IE_CH_MD_DUAL = 0x04
A2D_SBC_IE_CH_MD_MONO = 0x08

2. Откройте View → Open Subviews → Strings.
3. Нажмите CTRL+F, выполните поиск по строке "Cant parse src cap ret". Должна найтись одна строка. Кликните по ней дважды.
Прикрепленное изображение

4. Выделите мышкой название переменной (слева от DB), нажмите "x" на клавиатуре.
Прикрепленное изображение

5. Это — ссылки на нашу текстовую строку. На строку ссылается только одна функция sub_A868C, дважды. Два раза кликаем на первый или второй результат.
Прикрепленное изображение


6. Сверху — код выбора частоты (сверяется сначала 0x10, потом 0x20). Курсор установлен на аналоге if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_JOINT). По адресу loc_A871A в регистр R0 записывается значение 1 и совершается переход на loc_A8724 (отсутствует на скриншоте), который записывает значение регистра в поле структуры.
Прикрепленное изображение


Заменив TST.W R0, #1 по адресу 0xA86FE на TST.W R0, #4, и MOVS R0, #1 по адресу 0xA871A на MOVS R0, #4, мы получим следующую конструкцию:
if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_DUAL)
pref_cap.ch_mode = A2D_SBC_IE_CH_MD_DUAL;
else if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_STEREO)
pref_cap.ch_mode = A2D_SBC_IE_CH_MD_STEREO;
else if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_DUAL)
pref_cap.ch_mode = A2D_SBC_IE_CH_MD_DUAL;
else if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_MONO)
pref_cap.ch_mode = A2D_SBC_IE_CH_MD_MONO;


Чтобы это сделать, установите курсор на TST.W R0, #1, перейдите во вкладку "Hex View-1", откройте HEX-редактор и выполните поиск по подсвеченным байтам и нескольким дополнительным байтам слева и справа. Я буду искать следующее:
04 00 9D F8 0D 00 10 F0 01 0F 0A D1 10 F0 02

Прикрепленное изображение

7. Откройте http://armconverter.com/, выберите x32 — ARM32/AArch32/ARMv7 Converter, скомпилируйте TST.W R0, #4. TST.W — инструкция из стандарта Thumb-2. Скорее всего, нужный вам результат будет в "Thumb-2 HEX".
8. Замените байты инструкции TST.W R0, #1 байтами инструкции TST.W R0, #4.
9. То же самое проделайте с MOVS R0, #1.

Файл android/platform/external/bluetooth/bluedroid/btif/co/bta_av_co.c:99.
10. Нужно заменить A2D_SBC_IE_CH_MD_JOINT на A2D_SBC_IE_CH_MD_DUAL. Можно обойтись только HEX-редактором. Ищем "10 01 10 04 01 35 02" (Если стек собран со стандартной частотой 44.1 кГц) или "20 01 10 04 01 35 02" (48 кГц), должно быть одно совпадение. Заменяем второй байт на 0x04: "10 04 10 04 01 35 02".

Файл android/platform/external/bluetooth/bluedroid/btif/src/btif_media_task.c:653.
11. Ищем строку "non-edr a2dp sink detected", как было описано в пункте 3-5.
12. Ищем значение 0x148 (328).
Прикрепленное изображение

13. Повторяем шаги 6-8, чтобы заменить 0x148 на 0x1E2 (482).
14. Сохраняем изменения в HEX-редакторе, загружаем библиотеку на устройство и перезагружаемся.


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

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

Сообщение отредактировал ValdikSS - 22.12.19, 13:01



Реп: (484)
Протестированные устройства
Устройства, работающие с SBC как минимум на битрейте 512 кбит/с
  • 1MORE iBFree
  • JBL Everest 310
  • JBL Everest 700
  • JBL T110BT
  • JBL E55BT
  • JBL T460BT
  • JBL Endurance SPRINT (Сообщают, что не поддерживают Dual Channel, но работают. Не соответствуют спецификации A2DP.)
  • Skullcandy HESH 3
  • SoundPEATS Q30
  • Sony WH-H900N
  • Sony WI-C400
  • Sony MDR-1ABT
  • Sony MDR-ZX770BT
  • Sony MDR-ZX770BN
  • Sony MDR-XB650BT
  • Sony MDR-XB950B1
  • Sony SBH50
  • SVEN AP-B570MV
  • Syllable G600
  • Bluedio A/Air (Сообщают, что не поддерживают Dual Channel, но работают. Не соответствуют спецификации A2DP.)
  • Bluedio T4s (Bitpool max 39. Сообщают, что не поддерживают Dual Channel, но работают, при 462 кбит/с. Не соответствуют спецификации A2DP.)
  • Bluedio T5 (Сообщают, что не поддерживают Dual Channel, но работают. Не соответствуют спецификации A2DP.)
  • Bluedio T6 (Сообщают, что не поддерживают Dual Channel, но работают. Не соответствуют спецификации A2DP. Чип Adopt Max 97220.)
  • Marshall Major II Bluetooth
  • Overdrive RealForce D1
  • DEXP BT-210
  • DEXP BT-220
  • DEXP BT-250
  • DEXP BT-260
  • DEXP BT-280
  • Edifier W288BT
  • Edifier W830BT
  • Nomi BT 211
  • LeEco Le Sports BT
  • Xiaomi MI Portable Bluetooth Speaker
  • Xiaomi Square Box Bluetooth Speaker 2
  • Sennheiser HD 4.40BT
  • AKG K845BT
  • Beyerdynamic Amiron Wireless
  • Bowers & Wilkins PX
  • Bowers & Wilkins Zeppelin Wireless
  • House of Marley Liberate XLBT
  • Harman Kardon Onyx Studio 4
  • Harman Kardon Aura Studio 2
  • QCY QY8
  • Panasonic RP-BT10
  • Logitech BT Adapter
  • TP-Link HA100
  • Xiaomi Mi Bluetooth Audio Receiver
  • Overfly Portable Bluetooth Receiver
  • KZ Wireless Bluetooth Module
  • Excelvan B7
  • Hagibis X2
  • Pioneer SE-E7BT
  • Sony DSX-A400BT (автомобильное головное устройство)
  • Автомобильное головное устройство на чипе CSR8645 (noname)
  • Автомобильный DAC Lusya bluetooth 4.0 with AK4490, NE5532

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

Устройства, не работающие с битрейтом выше стандартного или в Dual Channel
  1. Harper HB-202 (треск; чип Beken BK3256)
  2. Sony Ericsson MW600 (высокочастотные искажения, треск; гарнитура 2009 года)
  3. Sony SBH52 (не успевают обрабатывать пакеты)
  4. BlitzWolf BW-F2 (нет звука)
  5. Overfly mini Bluetooth receiver (нет звука)


Сообщение отредактировал ValdikSS - 21.09.18, 17:38



Реп: (484)
Зачем это нужно: SBC 328k и SBC 485k против aptX
Вопреки расхожему мнению о качестве звука кодека 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, на любых наушниках.

Прикрепленные файлы

Прикрепленный файлaudio.zip ( 22.47 МБ )


Сообщение отредактировал ValdikSS - 21.08.18, 19:44



Реп: (713)
ValdikSS @ 18.08.2018, 23:21 *
Sony MDR-1ABT

Если Андроид 7 (LOS) и выше, то есть поддержка AptX.
Тестеровщики руками принудительно выбирали SBC?
Как они заставили наушники с поддержкой AptX(LDAC) соединяться по худшему кодеку? ;-)



Реп: (484)
* O1eg_sgn,
Эти наушники тестировал я. Тестирование проводилось на телефоне без поддержки aptX и LDAC, и с записью дампа. Я включил в таблицу только те тестирования, которые я самостоятельно верифицировал по дампам.

Сообщение отредактировал ValdikSS - 19.08.18, 14:37



Реп: (713)
ValdikSS @ 19.08.2018, 16:37 *
Тестирование проводилось на телефоне без поддержки aptX и LDAC...

Понятно :-)
Например, у меня на MIUI 10 нельзя вручную выбрать кодек. Да и, наверное, бессмысленно выбирать SBC при наличии LDAC.



Реп: (5)
Отличная тема! Пора этому придать публичность



Реп: (101)
specialist_01 @ 19.08.18, 20:14 *
Отличная тема! Пора этому придать публичность

Тема действительно заслуживает внимания.
Но. Как придать ей публичность?
И второе: зачем нужна публичность?
Кто "вкурил" суть вопроса, тот уже ТУТ.



Реп: (213)
O1eg_sgn @ 19.08.18, 19:34 *
Да и, наверное, бессмысленно выбирать SBC при наличии LDAC.

Это очевидно как по мне. Однако то что автор описал выглядит многообещающе

Добавлено 19.08.2018, 23:55:

O1eg_sgn @ 19.08.18, 14:34 *
Как они заставили наушники с поддержкой AptX(LDAC) соединяться по худшему кодеку? ;-)

Прикрепленное изображение
Прикрепленное изображение


Добавлено 19.08.2018, 23:56:

Кстати, я тут как раз вспомнил про AAC, его вроде как поддерживают не все наушники с aptx, и он в продуктах эпл используется.
* ValdikSS, что вы по поводу этого думаете?

Сообщение отредактировал mister syslik - 20.08.18, 00:57



Реп: (484)
mister syslik @ 19.08.18, 23:53 *
Кстати, я тут как раз вспомнил про AAC, его вроде как поддерживают всё наушники с aptx

Не все, его тоже нужно отдельно лицензировать. Мои, например, поддерживают SBC, aptX, MP1/2/3, FastStream, но не AAC.
AAC, MP3 — очень продвинутые кодеки, с серьезной психоакустической моделью, для их кодирования и декодирования нужны значительные вычислительные мощности. Они не отличимы от ориганала при 256-320 кбит/с. У обычного AAC большие алгоритмические задержки (100+ мс, но, вроде, есть какой-то профиль с низкими задержками).
SBC, aptX — примитивные кодеки, цель которых — кодирование и декодирование аудио с минимальными вычислительными мощностями и задержками.
Если наушники поддерживают AAC, MP3 или LDAC, то разумней использовать их.

Кто-нибудь может рассказать, как происходит передача AAC на Android и iOS? Поток кодируется системой, как в случае SBC и aptX, или же посылается битстрим на наушнки, без транскодирования?
Например, у меня есть файл в формате AAC. Что произойдет при одновременном воспроизведении файла AAC и какого-то стороннего звука, например, уведомления, или аудиопотока из браузера или другого плеера?

Сообщение отредактировал ValdikSS - 20.08.18, 00:41



Реп: (213)
ValdikSS @ 20.08.18, 0:34 *
Кто-нибудь может рассказать, как происходит передача AAC на Android и iOS? Поток кодируется системой, как в случае SBC и aptX, или же посылается битстрим на наушнки, без транскодирования?
Например, у меня есть файл в формате AAC. Что произойдет при одновременном воспроизведении файла AAC и какого-то стороннего звука, например, уведомления, или аудиопотока из браузера или другого плеера?

Мои поддерживают aac, но откровенно говоря наушники крайне убогие, лучше не скажешь, ибо даже плохими я их назвать не могу, стоят 40$, поддерживают AAC, aptX, излучатели 13 мм, а до одного места это всё, звук донный и сливает китайским за 10$. Если бы не ViPER, бы их вообще тут же в мусорник выкинул. Это я к тому, что вообще особой разницы нет, SBC, AAC, aptX, главное чтобы сами наушники были нормальными. Если вернуться к основной теме - я мог бы помочь с изучением алгоритмов AAC, но я не разбираюсь где взять эти все значения



Реп: (213)
ValdikSS @ 20.08.18, 0:34 *
AAC, MP3 — очень продвинутые кодеки, с серьезной психоакустической моделью, для их кодирования и декодирования нужны значительные вычислительные мощности. Они не отличимы от ориганала при 256-320 кбит/с.

И ещё, например у aptx 48 khz, а у AAC 44,1khz. Если AAC более продвинут, то почему там частота дискретизации меньше? Вообще в чём заключаются конкретные преимущества AAC перед SBC, apt-x, apt-x hd, а так же недостатки перед LDAC? Был бы благодарен если бы вы прояснили эти моменты, а то в инете инфы конкретно об этом маловато



Реп: (484)
mister syslik @ 20.08.18, 00:42 *
я мог бы помочь с изучением алгоритмов AAC

Они и так известны. Меня интересует следующее: если у вас в плеере играет музыка, записанная в виде файла с форматом AAC, с телефона на наушники, и в качестве Bluetooth-кодека используется тоже AAC, во время прихода уведомления, которое проигрывает звук (например, входящая СМС), звук уведомления будет слышен вместе с музыкой, или музыка временно прервется, воспроизведется звук уведомления, и музыка возобновится? Или вообще звука уведомления не будет?

mister syslik @ 20.08.18, 00:55 *
aptx 48 khz, а у AAC 44,1khz

aptX поддерживает 44.1 и 48 кГц, AAC поддерживает от 8 до 96 кГц.

mister syslik @ 20.08.18, 00:55 *
Вообще в чём заключаются конкретные преимущества AAC перед SBC, apt-x, apt-x hd, а так же недостатки перед LDAC?

AAC требует меньше битрейта для получения одинакового качества относительно других кодеков, а значит, меньше вероятность прерывания аудио на улице, или на большом расстоянии между передатчиком и приёмником. Он также требует больше вычислительных мощностей для декодирования, и наушники могут расходовать больше энергии и меньше работать от одного заряда батареи, чем при использовании SBC.
Я не эксперт в устройстве кодеков, но планирую написать объективную обзорную статью о Bluetooth-аудио, а то в интернете из 30 статей я нашел только 2 вменяемые, остальные — не соответствуют действительности, неточные, или откровенно маркетинговые.



Реп: (213)
ValdikSS @ 20.08.18, 1:39 *
если у вас в плеере играет музыка, записанная в виде файла с форматом AAC, с телефона на наушники, и в качестве Bluetooth-кодека используется тоже AAC, во время прихода уведомления, которое проигрывает звук (например, входящая СМС), звук уведомления будет слышен вместе с музыкой, или музыка временно прервется, воспроизведется звук уведомления, и музыка возобновится? Или вообще звука уведомления не будет?

Это зависит от того, как я настрою плеер. Могу сделать паузу при уведомлении, могу затухание звука и проигрывание уведомления и т.д. Не совсем понимаю как это связано с кодеком, это же только от плеера и его настроек зависит

Добавлено 20.08.2018, 01:46:

ValdikSS @ 20.08.18, 1:39 *
AAC поддерживает от 8 до 96 кГц.

Гм, у меня намертво 44.1, странно
Прикрепленное изображение



Реп: (484)
* mister syslik,
Меня больше iOS интересует, в iTunes музыка в AAC, и я подозреваю, что в некоторых условиях на наушники отправляется сам аудиофайл, без перекодирования системой, из-за чего система не может микшировать разные аудиопотоки. В интернете противоречивая информация на этот счет.



Реп: (71)
Поучаствую.

Прикрепленные файлы

Прикрепленный файлbluetooth.default.zip ( 949.24 КБ )



Реп: (484)
* dj_mase,
Отправил в QMS.



Реп: (7)
Прикрепленный файлbluetooth.default.zip ( 2.44 МБ )



Реп: (21)
То же готов поучаствовать, телефон Xiaomi Redmi 3s

Прикрепленный файлbluetooth.default.zip ( 861.47 КБ )



Реп: (213)
ValdikSS @ 20.08.18, 1:50 *
Меня больше iOS интересует

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


Полная версия   Текстовая версия

Помощь   Правила

Сейчас: 29.03.24, 00:57