Cómo modificar las pilas de Bluetooth en Android para obtener una calidad de audio Bluetooth muy mejorada



Pruebe Nuestro Instrumento Para Eliminar Los Problemas

Advertencia: esta es una guía muy avanzada que implica la modificación de sus pilas de Bluetooth en Android; lea esta guía en su totalidad y siga todas las instrucciones exactamente como se dan.



A pesar del hecho de que los auriculares Bluetooth y el audio Bluetooth se han vuelto bastante populares, es un problema para los audiófilos porque se ha demostrado que Bluetooth reduce la calidad del audio, ya que partes de la información de audio y las frecuencias se pierden en el aire a través de la transmisión Bluetooth.



Esta es la razón por la que algunos fabricantes están lanzando códecs aptX y LDAC, para mejorar la calidad del sonido sobre el códec Bluetooth SBC estándar que es compatible con todos los auriculares y la mayoría de los dispositivos Bluetooth; sin embargo, los dispositivos con códecs aptX y LDAC son mucho más costosos debido a estos códecs requieren tarifas de licencia, que el consumidor paga a largo plazo.



La baja calidad de audio del códec SBC Bluetooth se debe a limitaciones artificiales de todas las pilas de Bluetooth y la configuración de auriculares actuales, y esta limitación se puede eludir en cualquier dispositivo existente.

Si está interesado en el audio Bluetooth, al final de esta guía le mostraremos cómo realizar un volcado de registro de audio Bluetooth e inspeccionarlo para ver qué tipo de calidad y frecuencia de audio obtiene del receptor Bluetooth de su Android.

La mayor parte de esta guía se centrará en algunos ajustes simples y formas de leer la salida de audio de Bluetooth para mejorar en gran medida la calidad de salida de los códecs Bluetooth SBC estándar; lea esta guía completa con atención, ya que es bastante educativa y hay muchas cosas diferentes. para flashear o modificar, según el modelo de su dispositivo.



Al final de esta guía hay una lista de pilas de Bluetooth previamente parcheadas para una gran cantidad de dispositivos Android populares; estos se pueden actualizar en la recuperación como lo haría con cualquier otro .zip flasheable; si ninguno de los dispositivos le pertenece, tendrá para seguir la guía para modificar las pilas de Bluetooth en Android.

Breve información técnica sobre el códec SBC

SBC tiene muchos parámetros diferentes que se negocian durante la fase de configuración de la conexión:

  • Tipo y número de canal de audio: Estéreo conjunto, Estéreo, Canal dual, Mono;
  • Número de bandas de frecuencia: 4 u 8;
  • Número de bloques de audio en un paquete: 4, 8, 12, 16;
  • Algoritmo de asignación de bits de cuantificación: sonoridad, SNR;
  • Grupo de bits máximo y mínimo utilizado en el proceso de cuantificación: generalmente 2-53.

Se requiere que el decodificador admita cualquier combinación de estos parámetros. El codificador puede implementar solo una parte de ellos.

Las pilas de Bluetooth existentes generalmente negocian el siguiente perfil: estéreo conjunto, 8 bandas, 16 bloques, sonoridad, bitpool 2..53. Este perfil codifica audio de 44,1 kHz con una tasa de bits de 328 kbps.

El parámetro bitpool afecta directamente la tasa de bits dentro del mismo perfil: cuanto mayor es, mayor es la tasa de bits y, por lo tanto, la calidad.

Sin embargo, el parámetro bitpool no está vinculado a un perfil específico. La tasa de bits también se ve afectada significativamente por otros parámetros: tipo de canal de audio, número de bandas de frecuencia, número de bloques de audio. Puede aumentar la tasa de bits indirectamente negociando perfiles no estándar, sin cambiar el grupo de bits.

Por ejemplo, Dual Channel codifica canales por separado, utilizando el conjunto de bits completo para cada canal. Obligar al dispositivo a usar Dual Channel en lugar de Joint Stereo hará que casi se duplique la tasa de bits con el mismo grupo de bits máximo, 617 kbps.

Para mí, creo que bitpool debería ser una variable interna. Es un error de diseño de la especificación A2DP que el valor del grupo de bits no esté vinculado a otros parámetros del códec y solo se defina como un valor global.

Estos valores fijos de Bitpool y Bitrate se originan a partir de valores recomendados para audio de alta calidad. Pero la recomendación no es excusa para limitar el perfil a estos valores.

La especificación A2DP v1.2, que estuvo activa de 2007 a 2015, requiere que todos los decodificadores funcionen correctamente con velocidades de bits de hasta 512 kbps:

El decodificador de la SNK soportará todos los valores posibles de la combinación de bits que no den lugar a un exceso de la velocidad binaria máxima. Este perfil limita la velocidad de bits máxima disponible a 320 kb / s para mono y 512 kb / s para modos de dos canales.

En la nueva versión de la especificación no hay limitación de velocidad de bits. Se supone que los auriculares modernos lanzados después de 2015 pueden admitir tasas de bits. hasta 1000 kbps .

Por alguna razón, todas las pilas de Bluetooth probadas actualmente (Linux (PulseAudio), Android, Blackberry y macOS) tienen restricciones artificiales del parámetro de grupo de bits máximo, que afecta directamente a la tasa de bits máxima. Pero este no es el mayor problema, casi todos los auriculares también limitan el valor máximo de bitpool a 53.

La mayoría de los dispositivos funcionan bien en una pila Bluetooth modificada con una tasa de bits de 507 kbps, sin interrupciones ni crepitaciones. Pero tal tasa de bits nunca se negociará en condiciones normales, con pilas de Bluetooth estándar.

*** Requerido para realizar pruebas con las siguientes guías: bluetooth-dualchannel-test-ubuntu-18.04.1-desktop-amd64.iso.torrent

Cómo probar en una PC

La prueba de compatibilidad de auriculares SBC de alta tasa de bits es la más fácil de realizar en la PC con un adaptador Bluetooth. He preparado una imagen de Ubuntu con una pila de Bluetooth modificada, que se puede ejecutar como en una máquina virtual (al conectar el adaptador Bluetooth como un dispositivo USB dentro de la máquina virtual, también funciona con los adaptadores integrados en las computadoras portátiles) o al arrancar desde la unidad flash USB. Esta imagen utiliza el siguiente perfil: canal dual, 8 bandas, 16 bloques, sonoridad, bitpool 2..41, 44,1 kHz, que proporciona una tasa de bits de 485 kbps.

Ejecutando en una VM

  • Descargue Virtualbox y Virtualbox Extension Pack: https://www.virtualbox.org/wiki/Downloads;
  • Instale Virtualbox, inícielo;
  • Instale el paquete de extensión usando Archivo → Preferencias → Extensiones;
  • Cree una nueva máquina virtual: Linux, Ubuntu (64 bits), 1024 RAM. No cree un disco duro.
  • Navegue a la configuración de la máquina virtual, en Almacenamiento elija Controlador: IDE, Vacío, presione el ícono de CD → Elija el archivo de disco óptico virtual;
  • Seleccione descargado bluetooth-dualchannel-test-ubuntu-18.04.1-desktop-amd64.iso;
  • Guarde y cierre la ventana de configuración, inicie la máquina virtual;
  • Haga clic con el botón derecho en el icono del cable USB en la parte inferior derecha, seleccione su adaptador Bluetooth;

Ejecutando en una PC

La imagen admite el arranque BIOS / CSM y UEFI.

  • Grabe la imagen en una unidad flash USB con Etcher: https://etcher.io/. Esta operación eliminará todos los archivos existentes en una unidad USB.
  • Apague la PC;
  • Inserte la unidad flash USB, encienda la PC y presione el botón de orden de inicio (generalmente Esc o F12);
  • Seleccione su unidad flash USB.

Realización de la prueba

  • (opcional pero recomendado) Haga doble clic en el script 'Btsnoop Dump' en el escritorio. Comenzará la captura de datos por Bluetooth para su posterior análisis. No cierre la ventana de la terminal.
  • Cambie los auriculares al modo de emparejamiento;
  • Haga clic en la flecha en la esquina superior derecha, seleccione el icono de Bluetooth → Configuración de Bluetooth;
  • Elija sus auriculares, espere hasta que se complete el emparejamiento y cierre la ventana;
  • Establezca el volumen de Ubuntu en aproximadamente 2/3. También reduzca el volumen con los botones de los auriculares, ya que podría ser muy alto después del emparejamiento.
  • Abra la carpeta 'música', reproduzca 'testrecord1.flac';
  • (opcional pero recomendado) Cerrar reproductor, cerrar ventana de terminal. Esto detendrá la captura de datos.
  • (opcional pero recomendado) Abra el navegador Firefox, cargue el volcado de datos (btsnoop_hci.btsnoop en el escritorio) a https://btcodecs.valdikss.org.ru/

Puede escuchar otra música en la carpeta de música o cargar la suya propia;

No debe haber crujidos, interrupciones de audio u otras distorsiones de sonido en los auriculares. Si escucha un buen sonido de alta calidad, eso significa que sus auriculares admiten audio con una tasa de bits de 485 kbps.

Cómo probar en un dispositivo Android

Para realizar la prueba desde un teléfono inteligente o tableta Android, debe usar la pila Bluetooth modificada, que requiere privilegios de root.

Cómo capturar el volcado de datos de Bluetooth en Android

  1. Apague Bluetooth;
  2. En Configuración de desarrollador, habilite el interruptor 'Habilitar registro de inspección de HCI de Bluetooth';
  3. Encienda Bluetooth, conéctese a sus auriculares usando el menú de Bluetooth (¡esto es importante! ¡No permita la conexión automática!);
  4. Reproducir una pequeña muestra de audio;
  5. Abra la configuración del desarrollador, desactive el interruptor 'Habilitar registro de búsqueda de HCI de Bluetooth';
  6. Debe haber /storage/emulated/0/btsnoop_hci.log o /data/misc/bluetooth/logs/btsnoop_hci.log creado. Si falta, abra /etc/bluetooth/bt_stack.conf con un editor de texto y vea la ruta en la opción BtSnoopFileName.

No debe haber crujidos, interrupciones de audio u otras distorsiones de sonido en los auriculares. Si escucha un buen sonido de alta calidad con la biblioteca parcheada, eso significa que sus auriculares admiten audio con una tasa de bits de 512 kbps.

Siga cuidadosamente el algoritmo anterior. Especialmente, si apaga los auriculares o los desconecta después del emparejamiento, es importante conectarse a los auriculares manualmente desde la configuración de Bluetooth, ¡no permita la conexión automática!

Dispositivos que admiten al menos 512 kbit / s SBC

  • 1 MÁS 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. Responda que no es compatible con el canal dual, pero funciona si se fuerza, 462 kbit / s. No se ajusta a la especificación A2DP).
  • Bluedio T5 (Responda que no es compatible con el canal dual, pero funciona si se fuerza. No cumple con la especificación A2DP).
  • Bluedio T6 (Responda que no es compatible con el canal dual, pero funciona si se fuerza. No se ajusta a la especificación A2DP. Adopte el chip Max 97220).
  • Marshall Major II Bluetooth
  • Overdrive RealForce D1
  • Edifier W830BT
  • DEXP BT-250
  • Adaptador Logitech BT
  • Unidad principal automotriz Noname (chip CSR8645)
  • Unidad principal automotriz Sony DSX-A400BT

Dispositivos que admiten SBC superior a 512 kbit / s

  • JBL Everest 310 (617-660 kbit / s)
  • Sony WI-C400 (576 kbit / s)
  • Sony MDR-ZX770BT (617-660 kbit / s)
  • Marshall Major II Bluetooth (617-660 kbit / s)
  • Overdrive RealForce D1 (730 kbit / s, doble canal, 4 subbandas)

Dispositivos que no funcionan con velocidades de bits más altas o de doble canal

  1. Harper HB-202 (chicharrones; chip Beken BK3256)
  2. Sony Ericsson MW600 (distorsión de alta frecuencia, crepitantes; dispositivo de 2009)

Por qué esto es importante: SBC 328k y 485k vs aptX

Contrariamente a la creencia popular de la calidad de sonido aptX, en algunos casos puede producir una peor calidad de audio que SBC con una tasa de bits estándar de 328k.

SBC asigna dinámicamente bits de cuantificación para bandas de frecuencia, actuando sobre una base 'de abajo hacia arriba'. Si se utilizó toda la tasa de bits para las frecuencias bajas y medias, las frecuencias superiores se “cortan” (silencian).

aptX cuantifica constantemente las bandas de frecuencia con la misma cantidad de bits, lo que lo convierte en un códec de tasa de bits constante: 352 kbps para 44,1 kHz, 384 kbps para 48 kHz. No puede 'transferir bits' a las frecuencias que más se necesitan en ellos. A diferencia de SBC, aptX no 'cortará' las frecuencias, pero les agregará ruido de cuantificación, reduciendo el rango dinámico del audio y, a veces, introduciendo crepitaciones. SBC, por el contrario, 'se come los detalles', descarta las áreas más tranquilas.

En promedio, en comparación con SBC 328k, aptX produce menos distorsión en la música con un rango de frecuencia amplio, pero en música con un rango de frecuencia estrecho y un rango dinámico amplio, el SBC 328k a veces gana.

Consideremos un caso especial, una grabación de piano. Aquí hay un espectrograma:


La mayor parte de la energía se encuentra en las frecuencias de 0 a 4 kHz y dura hasta 10 kHz.
El espectrograma del archivo aptX se ve así:

Aquí está SBC 328k:

Puede verse que el SBC 328k corta periódicamente por completo el rango por encima de 16 kHz y utiliza todas las velocidades de bits disponibles para rangos por debajo de este valor. Sin embargo, aptX introdujo más distorsiones en el espectro de frecuencias audibles por el oído humano, que se pueden ver en el espectrograma original restado del espectrograma aptX (cuanto más brillante, más distorsión):


Mientras que el SBC 328k ha introducido menos distorsión en la señal en el rango de 0 a 10 kHz, y el resto se ha reducido:

La tasa de bits de 485k para SBC fue suficiente para salvar todo el rango de frecuencias, sin cortar las bandas.

SBC 485k en esta muestra de audio es mucho mejor que aptX en el rango de 0-15 kHz, y con una diferencia más pequeña pero aún notable, a 15-22 kHz (cuanto más oscuro, menos distorsión):

Al cambiar a un SBC de alta tasa de bits, obtendrá un sonido superior a aptX la mayor parte del tiempo, en cualquier auricular.

  • original_and_aptx.zip
  • sbc.zip

Cómo modificar las pilas de Bluetooth en Android 5-7

Estas modificaciones deben aplicarse a las pilas de Bluetooth de Android Bluedroid (Android 5) y Fluoride (Android 6-7). La pila modificada por Qualcomm no es compatible.

Reemplace Joint Stereo con Dual Channel en la configuración estándar de SBC

android / plataforma / externo / bluetooth / bluedroid / btif / co / bta_av_co.c: 99

Código:

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 * /};

Reemplace A2D_SBC_IE_CH_MD_JOINT con A2D_SBC_IE_CH_MD_DUAL.

Aumente la prioridad de canal dual

android / plataforma / externo / bluetooth / bluedroid / btif / co / bta_av_co.c: 41

Código:

if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_JOINT) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_JOINT; si no (src_cap.ch_mode & A2D_SBC_IE_CH_MD_STEREO) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_STEREO; si no (src_cap.ch_mode & A2D_SBC_IE_CH_MD_DUAL) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_DUAL; si no (src_cap.ch_mode & A2D_SBC_IE_CH_MD_MONO) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_MONO; Mover si con A2D_SBC_IE_CH_MD_DUAL hacia arriba.
  1. Deshabilitar o aumentar la restricción de velocidad de bits

La pila bluetooth de Android no solo tiene un límite de bitpool, sino también un límite de velocidad de bits, 328 kbit / s. Si los auriculares admiten, por ejemplo, bitpool 53 para 48 kHz, Android reducirá el bitpool para que se ajuste al límite de 328 kbit / s. Esto sucederá DESPUÉS de la negociación del códec, en la etapa de codificación, no tenga en cuenta el valor del grupo de bits en el paquete Bluetooth SetCapabilities.

android / plataforma / externo / bluetooth / bluedroid / btif / src / btif_media_task.c: 172

Código:

#define DEFAULT_SBC_BITRATE 328

Reemplazar con 512.

  1. (solo para experimentos) Desactiva el límite de MTU.

Esto es necesario para velocidades de bits superiores a ~ 580 kbit / s.

btif / src / btif_media_task.c: 174

Código:

/ * Tamaño de carga útil 2DH5 de 679 bytes - (encabezado L2CAP de 4 bytes + encabezado AVDTP de 12 bytes) * / #define MAX_2MBPS_AVDTP_MTU 663

Cómo modificar las pilas de Bluetooth en Android 8 - 9

Estas modificaciones no se han probado, pero deberían funcionar.

Agregue soporte de canal dual en la fuente SBC A2DP

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

Código:

/ * Capacidades del códec SBC SRC * / static const tA2DP_SBC_CIE a2dp_sbc_caps = A2DP_SBC_IE_BLOCKS_8;

agregue A2DP_SBC_IE_CH_MD_DUAL en ch_mode.

Reemplazar Joint Stereo con Dual Channel en la configuración predeterminada

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

Código:

/ * Predeterminado SBC codec configuración * / 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_por_muestra * /};

Reemplace A2DP_SBC_IE_CH_MD_JOINT con A2DP_SBC_IE_CH_MD_DUAL.

Aumente la prioridad de canal dual

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

Código:

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_SBC_JOINT = A2DP_SBC_IE_CH_MD_JOINT) {p_SBC_JOINT) p_codec_config-> channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO; devuelve verdadero; } 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; devuelve verdadero; } 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; devuelve verdadero; } 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; devuelve verdadero; } falso retorno; }

Mover si con A2DP_SBC_IE_CH_MD_DUAL hacia arriba.

Aumentar el límite de velocidad de bits

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

Código:

#define A2DP_SBC_DEFAULT_BITRATE 328

Reemplazar con 512.

  1. (solo para experimentos) Deshabilitar el límite de MTU

Esto es necesario para velocidades de bits superiores a ~ 580 kbit / s.

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

Código:

#define MAX_2MBPS_AVDTP_MTU 663

Pilas de Bluetooth parcheadas (parpadeantes)

  • 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 (Resurrection Remix Android 7.1.2_r36) .zip
  • Redmi Note 4x (Masik Premium, 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
  • Código Postal
  • Le Max 2 Oreo Patched.zip
10 minutos de lectura