Come modificare stack Bluetooth su Android per una qualità audio Bluetooth notevolmente migliorata

Avviso: questa è una guida altamente avanzata che prevede la modifica delle pile Bluetooth su Android: leggi questa guida nella sua interezza e segui tutte le istruzioni esattamente come indicato.

Nonostante il fatto che gli auricolari Bluetooth e l'audio Bluetooth siano diventati piuttosto popolari, è un po 'un problema per gli audiofili perché il Bluetooth ha dimostrato di ridurre la qualità audio, poiché i bit delle informazioni audio e delle frequenze si perdono nell'aria attraverso lo streaming Bluetooth.

Questo è il motivo per cui alcuni produttori stanno pubblicando codec aptX e LDAC, per migliorare la qualità del suono rispetto al codec SBC Bluetooth standard che è supportato da tutte le cuffie e dalla maggior parte dei dispositivi Bluetooth - tuttavia, i dispositivi con codec aptX e LDAC sono molto più costosi perché questi codec richiedere tasse di licenza, che il consumatore paga a lungo termine.

La bassa qualità audio del codec SBC Bluetooth è causata da limitazioni artificiali di tutti gli stack Bluetooth attuali e dalla configurazione delle cuffie e questa limitazione può essere aggirata su tutti i dispositivi esistenti.

Se sei interessato all'audio Bluetooth, alla fine di questa guida ti mostreremo come eseguire un dump del registro audio Bluetooth e controllarlo per vedere che tipo di frequenza audio e frequenza stai ricevendo dal ricevitore Bluetooth del tuo Android.

La maggior parte di questa guida si concentrerà su alcune semplici modifiche e modi per leggere la tua uscita audio Bluetooth per migliorare notevolmente la qualità di uscita dei codec Bluetooth SBC standard: leggi attentamente questa intera guida poiché è piuttosto istruttiva e ci sono molte cose diverse lampeggiare o modificare, a seconda del modello del dispositivo.

A questo fine di questa guida c'è un elenco di stack Bluetooth pre-patchati per molti dispositivi Android popolari - questi possono essere salvati in flash come faresti con qualsiasi altro .zip flashable - se nessuno dei dispositivi ti appartiene, avrai seguire la guida per modificare gli stack Bluetooth su Android.

Brevi informazioni tecniche sul codec SBC

SBC ha molti parametri diversi che vengono negoziati durante la fase di impostazione della connessione:

  • Tipo e numero di canale audio: Stereo comune, Stereo, Doppio canale, Mono;
  • Numero di bande di frequenza: 4 o 8;
  • Numero di blocchi audio in un pacchetto: 4, 8, 12, 16;
  • Algoritmo di allocazione dei bit di quantizzazione: Loudness, SNR;
  • Pool di bit massimo e minimo utilizzato nel processo di quantizzazione: di solito 2-53.

Il decodificatore è necessario per supportare qualsiasi combinazione di questi parametri. L'encoder può implementarne solo una parte.

Gli stack Bluetooth esistenti di solito negoziano il seguente profilo: Joint Stereo, 8 bande, 16 blocchi, Loudness, bitpool 2..53. Questo profilo codifica l'audio a 44, 1 kHz con un bitrate di 328 kbps.

Il parametro Bitpool influisce direttamente sul bitrate all'interno dello stesso profilo: maggiore è, maggiore è il bitrate e quindi la qualità.

Tuttavia, il parametro bitpool non è associato a un profilo specifico. Il bitrate è inoltre significativamente influenzato da altri parametri: tipo di canale audio, numero di bande di frequenza, numero di blocchi audio. È possibile aumentare il bitrate indirettamente negoziando profili non standard, senza modificare il bitpool.

Ad esempio, Dual Channel codifica i canali separatamente, utilizzando l'intero bitpool per ciascun canale. Forzare il dispositivo a utilizzare Dual Channel invece di Joint Stereo ci porterà a quasi raddoppiare il bitrate allo stesso bitpool massimo, 617 kbps.

Per me sembra che bitpool dovrebbe essere una variabile interna. È un errore di progettazione delle specifiche A2DP che il valore del bitpool non è associato ad altri parametri del codec e definito solo come valore globale.

Questi valori fissi di Bitpool e Bitrate provengono dai valori consigliati per un audio di alta qualità. Ma la raccomandazione non è una scusa per limitare il profilo a questi valori.

La specifica A2DP v1.2, attiva dal 2007 al 2015, richiede che tutti i decodificatori funzionino correttamente con bitrate fino a 512 kbps:

Il decodificatore di SNK deve supportare tutti i possibili valori di bitpool che non comportano l'eccesso del bit rate massimo. Questo profilo limita la velocità di bit massima disponibile a 320 kb / s per le modalità mono e 512 kb / s per le modalità a due canali.

Nella nuova versione della specifica non vi sono limiti di bitrate. Si presume che le cuffie moderne rilasciate dopo il 2015 possano supportare bitrate fino a 1000 kbps .

Per qualche motivo, tutti gli stack Bluetooth attualmente testati (Linux (PulseAudio), Android, Blackberry e macOS) hanno restrizioni artificiali del parametro bitpool massimo, che influenza direttamente il bitrate massimo. Ma questo non è il problema più grande, quasi tutte le cuffie limitano anche il valore massimo di bitpool a 53.

La maggior parte dei dispositivi funziona perfettamente su uno stack Bluetooth modificato con un bitrate di 507 kbps, senza interruzioni e crepitio. Ma un tale bitrate non sarà mai negoziato in condizioni normali, con pile Bluetooth di serie.

*** Richiesto per i test con le guide di seguito: bluetooth-dualchannel-test-ubuntu-18.04.1-desktop-amd64.iso.torrent

Come testare su un PC

Il test di compatibilità delle cuffie SBC a bitrate elevato è il più semplice da eseguire sul PC con un adattatore Bluetooth. Ho preparato l'immagine di Ubuntu con uno stack Bluetooth modificato, che può essere eseguito come in una macchina virtuale (collegando l'adattatore Bluetooth come dispositivo USB all'interno della macchina virtuale, funziona anche con gli adattatori integrati nei laptop) o avviando da l'unità flash USB. Questa immagine utilizza il seguente profilo: Dual Channel, 8 bande, 16 blocchi, Loudness, bitpool 2..41, 44, 1 kHz, che fornisce bitrate a 485 kbps.

In esecuzione in una macchina virtuale

  • Scarica Virtualbox e Virtualbox Extension Pack: //www.virtualbox.org/wiki/Downloads;
  • Installa Virtualbox, avvialo;
  • Installa Extension Pack usando File → Preferenze → Estensioni;
  • Crea una nuova macchina virtuale: Linux, Ubuntu (64-bit), 1024 RAM. Non creare un HDD.
  • Passare alle impostazioni della macchina virtuale, in Archiviazione selezionare Controller: IDE, Vuoto, premere l'icona del CD → Scegli il file del disco ottico virtuale;
  • Seleziona scaricato bluetooth-dualchannel-test-ubuntu-18.04.1-desktop-amd64.iso;
  • Salva e chiudi la finestra delle impostazioni, avvia la macchina virtuale;
  • Fare clic con il tasto destro sull'icona del cavo USB in basso a destra, selezionare l'adattatore Bluetooth;

In esecuzione su un PC

L'immagine supporta l'avvio BIOS / CSM e UEFI.

  • Masterizza l'immagine su un'unità flash USB usando Etcher: //etcher.io/. Questa operazione eliminerà tutti i file esistenti su un'unità USB.
  • Spegni il PC;
  • Inserisci la chiavetta USB, accendi il PC e premi il pulsante di avvio (di solito Esc o F12);
  • Seleziona la tua chiavetta USB.

Esecuzione del test

  • (opzionale ma consigliato) Fare doppio clic sullo script "Btsnoop Dump" sul desktop. Inizierà l'acquisizione dei dati Bluetooth per successive analisi. Non chiudere la finestra del terminale.
  • Passa le cuffie alla modalità di associazione;
  • Fare clic sulla freccia nell'angolo in alto a destra, selezionare l'icona Bluetooth → Impostazioni Bluetooth;
  • Scegli le cuffie, attendi il completamento dell'accoppiamento e chiudi la finestra;
  • Imposta il volume di Ubuntu a circa 2/3. Riduci anche il volume usando i pulsanti dell'auricolare in quanto potrebbe essere molto forte dopo l'associazione.
  • Aprire la cartella "musica", riprodurre "testrecord1.flac";
  • (opzionale ma consigliato) Chiudi lettore, chiudi la finestra del terminale. Ciò interromperà l'acquisizione dei dati.
  • (opzionale ma consigliato) Apri il browser Firefox, carica il dump dei dati (btsnoop_hci.btsnoop sul desktop) su //btcodecs.valdikss.org.ru/

Puoi ascoltare altra musica nella cartella della musica o caricarne una tua;

Non ci dovrebbero essere scoppiettanti, interruzioni audio o altre distorsioni del suono nelle cuffie. Se senti un buon suono di alta qualità, ciò significa che le tue cuffie supportano l'audio con un bit rate di 485 kbps.

Come testare su un dispositivo Android

Per eseguire il test da smartphone o tablet Android è necessario utilizzare lo stack Bluetooth modificato, che richiede il privilegio di root.

Come acquisire il dump dei dati Bluetooth su Android

  1. Disattiva Bluetooth;
  2. In Impostazioni sviluppatore, abilita l'opzione "Abilita registro snoop Bluetooth HCI";
  3. Attiva il Bluetooth, connettiti all'auricolare tramite il menu Bluetooth (questo è importante! Non consentire la connessione automatica!);
  4. Riproduci breve campione audio;
  5. Apri le impostazioni dello sviluppatore, disattiva l'opzione "Abilita registro snoop Bluetooth HCI";
  6. Dovrebbe essere creato /storage/emulated/0/btsnoop_hci.log o /data/misc/bluetooth/logs/btsnoop_hci.log. Se manca, apri /etc/bluetooth/bt_stack.conf con un editor di testo e vedi il percorso nell'opzione BtSnoopFileName.

Non ci dovrebbero essere scoppiettanti, interruzioni audio o altre distorsioni del suono nelle cuffie. Se senti un buon suono di alta qualità con la libreria patchata, ciò significa che le tue cuffie supportano l'audio con un bit rate di 512 kbps.

Si prega di seguire attentamente l'algoritmo sopra. In particolare, se si spengono le cuffie o si disconnettono dopo l'accoppiamento, è importante collegarsi manualmente alle cuffie dalle impostazioni Bluetooth, non consentire la connessione automatica!

Dispositivi che supportano almeno 512 kbit / s SBC

  • 1 ALTRO 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. Rispondi a non supportare Dual Channel, ma funziona se forzato, 462 kbit / s. Non conforme alle specifiche A2DP.)
  • Bluedio T5 (Rispondi a non supportare Dual Channel, ma funziona se forzato. Non conforme alle specifiche A2DP.)
  • Bluedio T6 (Rispondi a non supportare Dual Channel, ma funziona se forzato. Non conforme alle specifiche A2DP. Adotta il chip Max 97220.)
  • Marshall Major II Bluetooth
  • Overdrive RealForce D1
  • Edificatore W830BT
  • DEXP BT-250
  • Logitech BT Adapter
  • Unità principale automobilistica noname (chip CSR8645)
  • Unità principale automobilistica Sony DSX-A400BT

Dispositivi che supportano SBC superiore 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, doppio canale, 4 sottobande)

Dispositivi che non funzionano con bitrate più alti o Dual Channel

  1. Harper HB-202 (ciccioli; chip Beken BK3256)
  2. Sony Ericsson MW600 (distorsione ad alta frequenza, scoppiettio; dispositivo dal 2009)

Perché questo è importante: SBC 328k e 485k vs aptX

Contrariamente alla credenza popolare sulla qualità del suono aptX, in alcuni casi può produrre una qualità audio peggiore rispetto all'SBC con un bitrate standard di 328k.

SBC alloca dinamicamente i bit di quantizzazione per le bande di frequenza, agendo su una base dal basso verso l'alto. Se si utilizzava l'intero bitrate per le frequenze inferiore e media, le frequenze superiori vengono "tagliate" (silenziate).

aptX quantizza costantemente le bande di frequenza con lo stesso numero di bit, il che lo rende un codec a velocità in bit costante: 352 kbps per 44, 1 kHz, 384 kbps per 48 kHz. Non può "trasferire bit" a frequenze che sono principalmente necessarie in esse. A differenza di SBC, aptX non "taglierà" le frequenze, ma aggiungerà loro rumore di quantizzazione, riducendo la gamma dinamica dell'audio e talvolta introducendo crepitio. SBC, al contrario, "mangia i dettagli" - scarta le aree più tranquille.

In media, rispetto a SBC 328k, aptX fa meno distorsioni nella musica con un ampio intervallo di frequenza, ma sulla musica con un intervallo di frequenze ristretto e un ampio intervallo dinamico SBC 328k a volte vince.

Consideriamo un caso speciale, una registrazione di piano. Ecco uno spettrogramma:

La maggior parte dell'energia si trova nelle frequenze 0-4 kHz e dura fino a 10 kHz.

Lo spettrogramma del file aptX file è simile al seguente:

Ecco SBC 328k:

Si può vedere che l'SBC 328k periodicamente interrompe completamente l'intervallo superiore a 16 kHz e utilizza tutti i bitrate disponibili per intervalli inferiori a questo valore. Tuttavia, aptX ha introdotto più distorsioni nello spettro delle frequenze udibili dall'orecchio umano, che possono essere viste sullo spettrogramma sottratto dallo spettrogramma aptX (più luminoso, più distorsione):

Mentre l'SBC 328k ha introdotto una minore distorsione del segnale nell'intervallo da 0 a 10 kHz, e il resto è stato escluso:

Il bitrate 485k per SBC è stato sufficiente per salvare l'intera gamma di frequenze, senza tagliare le bande.

SBC 485k su questo campione audio è molto meglio di aptX nell'intervallo 0-15 kHz e con una differenza più piccola ma ancora evidente - a 15-22 kHz (più scuro, meno distorsione):

Passando a un SBC a bitrate elevato, otterrai un suono superiore a aptX per la maggior parte del tempo, con qualsiasi cuffia.

  • original_and_aptx.zip
  • sbc.zip

Come modificare le pile Bluetooth su Android 5 - 7

Queste modifiche dovrebbero essere applicate agli stack Bluetooth blu stock Android Bluedroid (Android 5) e Fluoruro (Android 6-7). Lo stack modificato da Qualcomm non è supportato.

Sostituisci Joint Stereo con Dual Channel in configurazione SBC standard

Android / platform / esterno / bluetooth / bluedroid / btif / co / bta_av_co.c: 99

Codice:

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

Sostituisci A2D_SBC_IE_CH_MD_JOINT con A2D_SBC_IE_CH_MD_DUAL.

Aumenta la priorità del doppio canale

Android / platform / esterno / bluetooth / bluedroid / btif / co / bta_av_co.c: 4

Codice:

 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; Sposta se con A2D_SBC_IE_CH_MD_DUAL in alto. 
  1. Disabilita o aumenta la limitazione del bitrate

Lo stack bluetooth Android non ha solo un limite di bitpool, ma anche un limite di bitrate, 328 kbit / s. Se le cuffie supportano, ad esempio, bitpool 53 per 48 kHz, Android ridurrà il bitpool per adattarlo al limite di 328 kbit / s. Ciò accadrà DOPO la negoziazione del codec, nella fase di codifica, non prendere in considerazione il valore del bitpool nel pacchetto Bluetooth SetCapabilities.

Android / platform / esterno / bluetooth / bluedroid / btif / src / btif_media_task.c: 172

Codice:

 #define DEFAULT_SBC_BITRATE 328 

Sostituisci con 512.

  1. (solo per esperimenti) Disabilita il limite MTU.

Ciò è necessario per bitrate superiori a ~ 580 kbit / s.

btif / src / btif_media_task.c: 174

Codice:

 / * Dimensione del payload 2DH5 di 679 byte - (intestazione L2CAP 4 byte + intestazione AVDTP 12 byte) * / #define MAX_2MBPS_AVDTP_MTU 663 

Come modificare le pile Bluetooth su Android 8 - 9

Queste modifiche non sono state testate, ma dovrebbero funzionare.

Aggiungi il supporto Dual Channel nella sorgente SBC A2DP

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

Codice:

 / * Funzionalità codec SBC SRC * / const statica tA2DP_SBC_CIE a2dp_sbc_caps = A2DP_SBC_IE_SAMP_FREQ_44, / * samp_freq * / (A2DP_SBC_IE_CH_MD_MONO; 

aggiungi A2DP_SBC_IE_CH_MD_DUAL in ch_mode.

Sostituisci Joint Stereo con Dual Channel nella configurazione predefinita

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

Codice:

 / * SBC configurazione del codec predefinito * / 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 * /}; 

Sostituisci A2DP_SBC_IE_CH_MD_JOINT con A2DP_SBC_IE_CH_MD_DUAL.

Aumenta la priorità del doppio canale

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

Codice:

 bool select_best_channel_mode statico (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; ritorno vero; } 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; ritorno vero; } 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; ritorno vero; } 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; ritorno vero; } return false; } 

Sposta se con A2DP_SBC_IE_CH_MD_DUAL in alto.

Aumenta il limite di bitrate

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

Codice:

 #define A2DP_SBC_DEFAULT_BITRATE 328 

Sostituisci con 512.

  1. (solo per esperimenti) Disabilita il limite MTU

Ciò è necessario per bitrate superiori a ~ 580 kbit / s.

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

Codice:

 #define MAX_2MBPS_AVDTP_MTU 663 

Stack Bluetooth con patch (Flashable)

  • Le Max 2 Oreo Patched.zip
  • LeEco Cool Changer S1 EUI_5.8.19S.zip
  • Leeco LE2 (EUI 5.9.26s, Android 6) .zip
  • Xiaomi Mi Note (Miui 9 Miui.su usnkreal v8.4.12, Android 6.0.1) .zip
  • Xiaomi mi note 3 (MIUI 9, Android 7) .zip
  • Xiaomi Mi4c (Android 7.0 NRD90M, MIUI-9.5 9.5.1.0 (NXKCNFA)). Zip
  • Xiaomi MI5s (MIUI Global 9.6.1.0, Android 7) .zip
  • Xiaomi Redmi 3s (Android 6.01, mmb29m, miui global 9.6.1.0) .zip
  • Xiaomi Redmi 4 (MiuiPro 10 8.8.2, Android 6.0.1, MMB29M) .zip
  • Xiaomi Redmi 4 Prime.zip
  • Xiaomi Redmi 4 pro (MIUI 9, miuipro 8.4.26) .zip
  • Xiaomi Redmi Note 3 (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
  • cerniera lampo
  • Le Max 2 Oreo Patched.zip

Articoli Interessanti