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

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

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 los bits de la información de audio y las frecuencias se pierden en el aire por la transmisión Bluetooth.

Es por eso que algunos fabricantes están lanzando códecs aptX y LDAC, para mejorar la calidad del sonido sobre el códec SBC Bluetooth 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 caros porque estos códecs requieren tarifas de licencia, que el consumidor paga a largo plazo.

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

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

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

En este extremo de esta guía hay una lista de pilas de Bluetooth pre-parcheadas para muchos dispositivos Android populares, que se pueden flashear en recuperación como lo haría con cualquier otro .zip flasheable, si ninguno de los dispositivos le pertenece, tendrá 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, doble canal, 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 cuantización: sonoridad, SNR;
  • Agrupación de bits máxima y mínima utilizada en el proceso de cuantización: generalmente 2-53.

El decodificador es necesario para admitir cualquier combinación de estos parámetros. El codificador puede implementar solo una parte de ellos.

Las pilas Bluetooth existentes generalmente negocian el siguiente perfil: Conjunto estéreo, 8 bandas, 16 bloques, Loudness, 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 significativamente afectada 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 la agrupación de bits.

Por ejemplo, Dual Channel codifica canales por separado, utilizando todo el conjunto de bits para cada canal. Al obligar al dispositivo a usar Dual Channel en lugar de Joint Stereo, obtendremos una tasa de bits casi duplicada en el mismo grupo de bits máximo, 617 kbps.

Para mí, parece que Bitpool debería ser una variable interna. Es un error de diseño de la especificación A2DP que el valor de bitpool no está vinculado a otros parámetros de códec y solo se define 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 una 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 del SNK admitirá todos los valores posibles de agrupación de bits que no den como resultado un exceso de la velocidad de bits 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 velocidades de bits de hasta 1000 kbps .

Por alguna razón, todas las pilas de Bluetooth actualmente probadas (Linux (PulseAudio), Android, Blackberry y macOS) tienen restricciones artificiales del parámetro de bitpool 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 velocidad de bits de 507 kbps, sin interrupciones y chisporroteo. Pero dicha tasa de bits nunca se negociará en condiciones normales, con pilas de Bluetooth de stock.

*** Se requiere 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 la imagen de Ubuntu con una pila Bluetooth modificada, que puede ejecutarse como en una máquina virtual (conectando el adaptador Bluetooth como dispositivo USB dentro de la máquina virtual, también funciona con los adaptadores integrados en las computadoras portátiles) o arrancando desde la unidad flash USB Esta imagen utiliza el siguiente perfil: Canal dual, 8 bandas, 16 bloques, Loudness, bitpool 2..41, 44.1 kHz, que proporciona una velocidad de bits de 485 kbps.

Ejecutando en una VM

  • Descargue Virtualbox y Virtualbox Extension Pack: //www.virtualbox.org/wiki/Downloads;
  • Instale Virtualbox, inícielo;
  • Instale Extension Pack 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 icono del CD → Elija un archivo de disco óptico virtual;
  • Seleccione bluetooth-dualchannel-test-ubuntu-18.04.1-desktop-amd64.iso descargado;
  • 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;

Corriendo en una PC

La imagen admite el arranque de BIOS / CSM y UEFI.

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

Realizar la prueba

  • (opcional pero recomendado) Haga doble clic en el script "Btsnoop Dump" en el escritorio. Comenzará la captura de datos de Bluetooth para su posterior análisis. No cierre la ventana de 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 disminuya el volumen usando los botones de los auriculares, ya que podría ser muy fuerte 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 //btcodecs.valdikss.org.ru/

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

No debe haber chisporroteos, interrupción de audio u otra distorsión de sonido en los auriculares. Si escucha un buen sonido de alta calidad, eso significa que sus auriculares admiten audio con una velocidad 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 utilizar la pila Bluetooth modificada, que requiere privilegios de root.

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

  1. Apagar Bluetooth;
  2. En la Configuración del desarrollador, habilite el interruptor "Habilitar Bluetooth HCI snoop log";
  3. Encienda Bluetooth, conéctese a su auricular usando el menú Bluetooth (¡esto es importante! ¡No permita la conexión automática!);
  4. Reproduce una breve muestra de audio;
  5. Abra la configuración del desarrollador, deshabilite el interruptor "Habilitar el registro de snoop Bluetooth HCI";
  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 chisporroteos, interrupción de audio u otra distorsión 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 velocidad 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

  • 1MÁ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. Responde para no admitir Dual Channel, pero funciona si es forzado, 462 kbit / s. No cumple con la especificación A2DP).
  • Bluedio T5 (responde que no es compatible con el canal dual, pero funciona si es forzado. No cumple con la especificación A2DP).
  • Bluedio T6 (responde que no es compatible con el canal dual, pero funciona si es forzado. No cumple con la especificación A2DP. Adopta 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 doble canal

  1. Harper HB-202 (chicharrones; chip Beken BK3256)
  2. Sony Ericsson MW600 (distorsión de alta frecuencia, chisporroteo; 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 usó toda la tasa de bits para las frecuencias bajas y medias, las frecuencias superiores se "cortan" (silencian).

aptX cuantifica las bandas de frecuencia con el mismo número de bits constantemente, lo que lo convierte en un códec de velocidad 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, sino que les agregará ruido de cuantización, reduciendo el rango dinámico del audio y algunas veces introduciendo crepitaciones. SBC, por el contrario, "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 amplio rango de frecuencia, pero en música con un rango de frecuencia estrecho y un amplio rango dinámico, SBC 328k a veces gana.

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

La mayor cantidad de energía reside en las frecuencias de 0-4 kHz y dura hasta 10 kHz.

El espectrograma del archivo aptX se ve así:

Aquí está SBC 328k:

Se puede ver que el SBC 328k periódicamente corta 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 frecuencia audible por el oído humano, que se puede ver en el espectrograma original sustraído del espectrograma aptX (cuanto más brillante, más distorsión):

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

La velocidad de bits 485k para SBC fue suficiente para guardar todo el rango de frecuencia, 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 menor pero aún notable: a 15-22 kHz (cuanto más oscura, menos distorsión):

Cambiando 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.

Aumentar la prioridad de doble canal

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

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; Muévase si con A2D_SBC_IE_CH_MD_DUAL hacia arriba. 
  1. Deshabilitar o aumentar la restricción de velocidad de bits

La pila de Bluetooth de Android no solo tiene un límite de bitpool, sino también un límite de velocidad de bits de 328 kbit / s. Si los auriculares son compatibles, por ejemplo, con el 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 conjunto 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 - (4 bytes Encabezado L2CAP + 12 bytes Encabezado AVDTP) * / #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 doble canal en la fuente SBC A2DP

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

Código:

 / * Capacidades de códec SBC SRC * / static const tA2DP_SBC_CIE a2dp_sbc_caps = A2DP_SBC_IE_SAMP_FREQ_44, / * samp_freq * / (A2DP_SBC_IE_CH_MD_MONO; 

agregue A2DP_SBC_IE_CH_MD_DUAL en ch_mode.

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

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

Código:

 / * Predeterminado configuración codec SBC * / const a2dp_sbc_default_config tA2DP_SBC_CIE = {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 * /}; 

Reemplace A2DP_SBC_IE_CH_MD_JOINT con A2DP_SBC_IE_CH_MD_DUAL.

Aumentar la prioridad de doble canal

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

Código:

 select_best_channel_mode static bool (ch_mode uint8_t, tA2DP_SBC_CIE * p_result, btav_a2dp_codec_config_t * p_codec_config) {if (ch_mode y 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; volver 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; volver 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; volver 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; volver verdadero; } falso retorno; } 

Mover si con A2DP_SBC_IE_CH_MD_DUAL a la parte superior.

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) Desactivar 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 Bluetooth Parcheadas (Intermitente)

  • 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
  • cremallera
  • Le Max 2 Oreo Patched.zip

Artículos De Interés