Como modificar pilhas Bluetooth no Android por uma excelente qualidade de áudio Bluetooth

Aviso: Este é um guia altamente avançado que envolve a modificação de suas pilhas Bluetooth no Android - leia este guia na íntegra e siga todas as instruções exatamente como fornecidas.

Apesar do fato de fones de ouvido Bluetooth e áudio Bluetooth terem se tornado bastante populares, é um problema para os audiófilos porque o Bluetooth provou reduzir a qualidade do áudio, já que partes da informação de áudio e freqüências se perdem no ar por streaming Bluetooth.

É por isso que alguns fabricantes estão lançando codecs aptX e LDAC para melhorar a qualidade do som em relação ao codec SBC Bluetooth padrão suportado por todos os fones de ouvido e a maioria dos dispositivos Bluetooth - no entanto, os dispositivos com codecs aptX e LDAC são muito mais caros porque esses codecs exigem taxas de licenciamento, que o consumidor paga a longo prazo.

A baixa qualidade de áudio do codec SBC Bluetooth é causada por limitações artificiais de todas as atuais configurações de pilhas e fones de ouvido Bluetooth, e essa limitação pode ser contornada em qualquer dispositivo existente.

Se você estiver interessado em áudio Bluetooth, mostraremos no final deste guia como fazer um despejo de log de áudio Bluetooth e inspecioná-lo para ver que tipo de qualidade de áudio e freqüência você está recebendo do receptor Bluetooth do seu Android.

A maioria deste guia irá focar em alguns ajustes simples e maneiras de ler a sua saída de áudio Bluetooth para melhorar a qualidade de saída dos codecs padrão SBC Bluetooth - por favor, leia todo este guia cuidadosamente, pois é bastante educativo e há muitas coisas diferentes. para piscar ou ajustar, dependendo do modelo do seu dispositivo.

Neste final deste guia há uma lista de pilhas Bluetooth pré-patched para muitos dispositivos Android populares - estes podem ser recuperados em recuperação como qualquer outro .zip que pode ser aberto - se nenhum dos dispositivos pertencer a você, você terá para seguir o guia de modificação de pilhas Bluetooth no Android.

Informações técnicas resumidas sobre o codec SBC

O SBC tem vários parâmetros diferentes que são negociados durante a fase de configuração da conexão:

  • Tipo e número do canal de áudio: Conjunto Estéreo, Estéreo, Canal Duplo, Mono;
  • Número de bandas de frequência: 4 ou 8;
  • Número de blocos de áudio em um pacote: 4, 8, 12, 16;
  • Algoritmo de alocação de bits de quantização: Loudness, SNR;
  • Pool de bits máximo e mínimo usado no processo de quantização: geralmente 2-53.

O decodificador é necessário para suportar qualquer combinação desses parâmetros. O codificador pode implementar apenas uma parte deles.

As pilhas Bluetooth existentes costumam negociar o seguinte perfil: Stereo Conjunto, 8 bandas, 16 blocos, Loudness, bitpool 2..53. Este perfil codifica áudio de 44, 1 kHz com uma taxa de bits de 328 kbps.

O parâmetro Bitpool afeta diretamente a taxa de bits dentro do mesmo perfil: quanto maior, maior a taxa de bits e, consequentemente, a qualidade.

No entanto, o parâmetro bitpool não está vinculado a um perfil específico. A taxa de bits também é significativamente afetada por outros parâmetros: tipo de canal de áudio, número de bandas de freqüência, número de blocos de áudio. Você pode aumentar a taxa de bits indiretamente negociando perfis não padrão, sem alterar o bitpool.

Por exemplo, o canal duplo codifica os canais separadamente, usando todo o pool de bits para cada canal. Forçar o dispositivo a usar o Dual Channel em vez do Joint Stereo nos dará uma taxa de bits quase duplicada no mesmo bitpool máximo de 617 kbps.

Para mim, parece que o bitpool deve ser uma variável interna. É uma falha de design da especificação A2DP que o valor do bitpool não está vinculado a outros parâmetros do codec e definido apenas como um valor global.

Esses valores fixos de Bitpool e Bitrate são originados de valores recomendados para áudio de alta qualidade. Mas a recomendação não é uma desculpa para limitar o perfil a esses valores.

A especificação A2DP v1.2, que estava ativa de 2007 a 2015, exige que todos os decodificadores funcionem corretamente com taxas de bits de até 512 kbps:

O decodificador do SNK deve suportar todos os valores de bitpool possíveis que não resultem no excesso da taxa de bits máxima. Este perfil limita a taxa de bits máxima disponível para 320kb / s para mono e 512kb / s para os modos de dois canais.

Na nova versão da especificação, não há limitação de taxa de bits. Supõe-se que os fones de ouvido modernos lançados após 2015 possam suportar taxas de bits de até 1000 kbps .

Por algum motivo, todas as pilhas Bluetooth atualmente testadas (Linux (PulseAudio), Android, Blackberry e macOS) têm restrições artificiais do parâmetro máximo do bitpool, o que afeta diretamente a taxa de bits máxima. Mas este não é o maior problema, quase todos os fones de ouvido também limitam o valor máximo do bitpool a 53.

A maioria dos dispositivos funciona bem em uma pilha Bluetooth modificada com uma taxa de bits de 507 kbps, sem interrupções e estalidos. Mas essa taxa de bits nunca será negociada em condições normais, com pilhas de estoque Bluetooth.

*** Necessário para testes usando guias abaixo: bluetooth-dual-channel-test-ubuntu-18.04.1-desktop-amd64.iso.torrent

Como testar em um PC

O teste de compatibilidade de headphone SBC de alta taxa de bits é o mais fácil de executar no PC com um adaptador Bluetooth. Eu preparei a imagem do Ubuntu com uma pilha Bluetooth modificada, que pode ser executada como em uma máquina virtual (conectando o adaptador Bluetooth como um dispositivo USB dentro da máquina virtual, ele também funciona com os adaptadores embutidos nos laptops) ou a unidade flash USB. Esta imagem utiliza o seguinte perfil: Dual Channel, 8 bandas, 16 blocos, Loudness, bitpool 2.41, 44, 1 kHz, que fornece uma taxa de bits de 485 kbps.

Executando em uma VM

  • Faça o download do Virtualbox e do Virtualbox Extension Pack: //www.virtualbox.org/wiki/Downloads;
  • Instale o Virtualbox, inicie-o;
  • Instale o pacote de extensões usando Arquivo → Preferências → Extensões;
  • Crie uma nova máquina virtual: Linux, Ubuntu (64 bits), 1024 RAM. Não crie um HDD.
  • Navegue até as configurações da máquina virtual, em Storage, escolha Controller: IDE, Empty, pressione o ícone do CD → Choose virtual optical disk file;
  • Selecione baixado bluetooth-dualchannel-test-ubuntu-18.04.1-desktop-amd64.iso;
  • Salvar e fechar a janela de configurações, inicie a máquina virtual;
  • Clique com o botão direito no ícone do cabo USB no canto inferior direito, selecione o seu adaptador Bluetooth;

Correndo em um PC

A imagem suporta inicialização via BIOS / CSM e UEFI.

  • Grave a imagem em uma unidade flash USB usando o Etcher: //etcher.io/. Esta operação excluirá todos os arquivos existentes em uma unidade USB.
  • Desligue o PC;
  • Insira a unidade flash USB, ligue o PC e pressione o botão de ordem de inicialização (geralmente Esc ou F12);
  • Selecione sua unidade flash USB.

Realizando o teste

  • (opcional, mas recomendado) Clique duas vezes no script “Btsnoop Dump” na área de trabalho. Ele iniciará a captura de dados Bluetooth para análise posterior. Não feche a janela do terminal.
  • Alterne os fones de ouvido para o modo de pareamento;
  • Clique na seta no canto superior direito, selecione o ícone Bluetooth → Configurações do Bluetooth;
  • Escolha seus fones de ouvido, espere até o emparelhamento estar completo e feche a janela;
  • Definir o volume do Ubuntu para cerca de 2/3. Também diminua o volume usando os botões do fone de ouvido, pois ele pode ficar muito alto após o emparelhamento.
  • Abra a pasta “music”, reproduza “testrecord1.flac”;
  • (opcional, mas recomendado) Feche o player, feche a janela do terminal. Isso interromperá a captura de dados.
  • (opcional, mas recomendado) Abra o navegador Firefox, faça o upload do despejo de dados (btsnoop_hci.btsnoop na área de trabalho) para //btcodecs.valdikss.org.ru/

Você pode ouvir outras músicas na pasta de músicas ou fazer upload de suas próprias músicas;

Não deve haver cracklings, interrupção de áudio ou outra distorção de som nos fones de ouvido. Se você ouvir um som de alta qualidade, isso significa que seus fones de ouvido suportam áudio com uma taxa de bits de 485 kbps.

Como testar no dispositivo Android

Para testar a partir do smartphone ou tablet Android, você precisa usar uma pilha Bluetooth modificada, que requer privilégios de root.

Como capturar dados de Bluetooth no Android

  1. Desligue o Bluetooth;
  2. Nas Configurações do desenvolvedor, ative o comutador "Ativar registro de rastreio Bluetooth HCI";
  3. Ligue o Bluetooth, conecte-se ao seu fone de ouvido usando o menu Bluetooth (isso é importante! Não permita conexão automática!);
  4. Reproduzir uma pequena amostra de áudio;
  5. Abra as configurações do desenvolvedor, desative o comutador "Ativar registro de rastreamento do Bluetooth HCI";
  6. Deve haver /storage/emulated/0/btsnoop_hci.log ou /data/misc/bluetooth/logs/btsnoop_hci.log criado. Se estiver faltando, abra /etc/bluetooth/bt_stack.conf com um editor de texto e veja o caminho na opção BtSnoopFileName.

Não deve haver cracklings, interrupção de áudio ou outra distorção de som nos fones de ouvido. Se você ouvir um som de alta qualidade com a biblioteca corrigida, isso significa que seus fones de ouvido suportam áudio com uma taxa de bits de 512 kbps.

Por favor, siga atentamente o algoritmo acima. Especialmente, se você desligar os fones de ouvido ou desconectar após o emparelhamento, é importante conectar os fones de ouvido manualmente a partir das configurações de Bluetooth, não permitir conexão automática!

Dispositivos que suportam pelo menos 512 kbit / s SBC

  • 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. Responda a não suportar Dual Channel, mas trabalhe se forçado, 462 kbit / s. Não está em conformidade com a especificação A2DP.)
  • Bluedio T5 (Responda a não suportar Dual Channel, mas trabalhe se forçado. Não está em conformidade com a especificação A2DP.)
  • Bluedio T6 (Responder a não suportar Dual Channel, mas funciona se forçado. Não está em conformidade com a especificação A2DP. Adote Max 97220 chip.)
  • Marshall Major II Bluetooth
  • Overdrive RealForce D1
  • Edifier W830BT
  • DEXP BT-250
  • Adaptador BT Logitech
  • Unidade principal automotiva Noname (chip CSR8645)
  • Unidade principal automotriz Sony DSX-A400BT

Dispositivos que suportam 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, dual channel, 4 sub-bandas)

Dispositivos que não funcionam com taxas de bits mais altas ou Dual Channel

  1. Harper HB-202 (crepitações; Beken BK3256 chip)
  2. Sony Ericsson MW600 (distorção de alta frequência, crepitações; dispositivo de 2009)

Por que isso é importante: SBC 328k e 485k vs aptX

Ao contrário da crença popular de qualidade de som do aptX, em alguns casos, pode produzir pior qualidade de áudio do que o SBC com uma taxa de bits padrão de 328k.

O SBC aloca dinamicamente bits de quantização para bandas de frequência, agindo de forma “de cima para baixo”. Se toda a taxa de bits foi usada para as frequências baixas e médias, as frequências altas são "cortadas" (silenciadas).

O aptX quantifica constantemente as bandas de frequência com o mesmo número de bits, o que o torna um codec de taxa de bits constante: 352 kbps para 44, 1 kHz, 384 kbps para 48 kHz. Não pode “transferir bits” para freqüências que são mais necessárias neles. Ao contrário do SBC, o aptX não “corta” freqüências, mas adiciona ruído de quantização a elas, reduzindo a faixa dinâmica de áudio e, às vezes, introduzindo estalos. A SBC, pelo contrário, “come os detalhes” - descarta as áreas mais silenciosas.

Em média, comparado com o SBC 328k, o aptX faz menos distorção na música com uma ampla faixa de freqüência, mas em músicas com uma faixa de frequência estreita e uma ampla faixa dinâmica, o SBC 328k às vezes vence.

Vamos considerar um caso especial, uma gravação de piano. Aqui está um espectrograma:

A maior parte da energia está nas frequências de 0-4 kHz e dura até 10 kHz.

O espectrograma do arquivo aptX se parece com isto:

Aqui está o SBC 328k:

Pode ser visto que o SBC 328k periodicamente cortou completamente o intervalo acima de 16 kHz, e usou todas as taxas de bits disponíveis para faixas abaixo deste valor. No entanto, o aptX introduziu mais distorções no espectro de frequências audíveis pelo ouvido humano, o que pode ser visto no espectrograma original subtraído do espectrograma aptX (quanto mais brilhante, mais distorção):

Enquanto o SBC 328k introduziu menos distorção o sinal na faixa de 0 a 10 kHz, e o resto foi:

Bitrate 485k para SBC foi o suficiente para salvar toda a faixa de freqüência, sem cortar as bandas.

O SBC 485k neste exemplo de áudio é muito melhor do que o aptX na faixa de 0-15 kHz, e com uma diferença menor, mas ainda perceptível - a 15-22 kHz (quanto mais escuro, menos distorção):

Mudando para um SBC de alta taxa de bits, você obterá um som superior ao aptX na maioria das vezes, em qualquer fone de ouvido.

  • original_and_aptx.zip
  • sbc.zip

Como modificar as pilhas Bluetooth no Android 5 - 7

Essas modificações devem ser aplicadas ao estoque de pilhas bluetooth Android Bluedroid (Android 5) e Fluoride (Android 6-7). A pilha modificada pela Qualcomm não é suportada.

Substitua o estéreo comum pelo canal duplo na configuração padrão do 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 * /}; 

Substitua A2D_SBC_IE_CH_MD_JOINT por A2D_SBC_IE_CH_MD_DUAL.

Aumentar a prioridade de canal duplo

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

Código:

 if (src_cap.ch_mode e A2D_SBC_IE_CH_MD_JOINT) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_JOINT; else if (src_cap.ch_mode e A2D_SBC_IE_CH_MD_STEREO) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_STEREO; else if (src_cap.ch_mode e A2D_SBC_IE_CH_MD_DUAL) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_DUAL; else if (src_cap.ch_mode e A2D_SBC_IE_CH_MD_MONO) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_MONO; Mova se com A2D_SBC_IE_CH_MD_DUAL para o topo. 
  1. Desativar ou aumentar a restrição de taxa de bits

O Android bluetooth stack não tem apenas o limite do bitpool, mas também o limite de taxa de bits, 328 kbit / s. Se os fones de ouvido suportarem, por exemplo, o bitpool 53 para 48 kHz, o Android diminuirá o bitpool para caber no limite de 328 kbit / s. Isso acontecerá APÓS a negociação do codec, no estágio de codificação, não leve em conta o valor do bitpool no pacote Bluetooth SetCapabilities.

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

Código:

 #define DEFAULT_SBC_BITRATE 328 

Substitua por 512.

  1. (somente para experimentos) Desabilite o limite de MTU.

Isso é necessário para taxas de bits maiores que ~ 580 kbit / s.

btif / src / btif_media_task.c: 174

Código:

 / * Tamanho de carga útil 2DH5 de 679 bytes - (4 bytes Cabeçalho L2CAP + 12 bytes do cabeçalho AVDTP) * / #define MAX_2MBPS_AVDTP_MTU 663 

Como modificar pilhas Bluetooth no Android 8 - 9

Essas modificações não foram testadas, mas devem funcionar.

Adicionar suporte de canal duplo na fonte SBC A2DP

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

Código:

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

adicione A2DP_SBC_IE_CH_MD_DUAL em ch_mode.

Substitua o estéreo comum pelo canal duplo na configuração padrão

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

Código:

 / * Padrão SBC configuração codec * / 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 * /}; 

Substitua A2DP_SBC_IE_CH_MD_JOINT por A2DP_SBC_IE_CH_MD_DUAL.

Aumentar a prioridade de canal duplo

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

Código:

 bool estático select_best_channel_mode (uint8_t ch_mode, tA2DP_SBC_CIE * p_result, btav_a2dp_codec_config_t * p_codec_config) {if (ch_mode e 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; retorno verdadeiro; } if (ch_mode e 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; retorno verdadeiro; } if (ch_mode e 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; retorno verdadeiro; } if (ch_mode e 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; retorno verdadeiro; } retorna falso; } 

Mova se com A2DP_SBC_IE_CH_MD_DUAL para o topo.

Aumentar limite de taxa de bits

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

Código:

 #define A2DP_SBC_DEFAULT_BITRATE 328 

Substitua por 512.

  1. (apenas para experiências) Desativar limite de MTU

Isso é necessário para taxas de bits maiores que ~ 580 kbit / s.

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

Código:

 #define MAX_2MBPS_AVDTP_MTU 663 

Patched Bluetooth Stacks (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 Nota (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)).
  • 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
  • fecho eclair
  • Le Max 2 Oreo Patched.zip

Artigos Interessantes