Technologie audio sans fil Bluetooth: quelle est la meilleure?


Avec le développement de la technologie, les écouteurs analogiques «à tube» si familiers entrent dans l'histoire - ils sont de plus en plus supplantés par leurs homologues sans fil Bluetooth.

Les smartphones modernes sont privés du connecteur habituel dans un souci de protection contre l'humidité et la poussière.

Les développeurs publient toutes les nouvelles versions du protocole Bluetooth et toutes les nouvelles versions des codecs, promettant "plus vite, plus haut, plus fort" - moins de retards de lecture et une meilleure qualité.

Est-ce que tout est si bon? Voyons voir.

Présentation


Je ne m'étendrai pas sur la mise en œuvre technique des protocoles, ainsi que sur les spécifications ennuyeuses. Cher ValdikSS , qui dans une large mesure a été une source d'inspiration et même un consultant scientifique dans cet article, prépare un matériel complet sur les codecs - et tout y sera présenté de manière beaucoup plus détaillée et techniquement correcte.

Je veux en dire plus sur l'expérience personnelle. Eh bien, un peu de pratique divertissante (ennuyeuse?).

Il y a un an et demi, je me suis enthousiasmé à l'idée d'aptX. Oui, j'ai lu beaucoup de critiques comme celle-ci et j'ai cru à tous ces rebondissements techniques. Un enfant est né - et je voulais vraiment regarder des émissions avec des écouteurs la nuit avec ma femme, sans faire de bruit et sans réveiller personne dans la maison.

Qu'est-ce que cela a donné?

La qualité


Commençons par les chiffres et les faits (bonjour, Wikipedia!)

SBC est un bon vieux codec, conforme à la norme A2DP. Le codec est le résultat des travaux de Frans de Bont (F. de Bont, M. Groenewegen et W. Oomen, «A High Quality Audio-Coding System at 128 kb / s», 98th AES Convention, 25-28 février 1995) et de son utilisation les algorithmes décrits dans le brevet EP-0400755B1 . Il est à noter que les auteurs du brevet autorisent l'utilisation gratuite de SBC uniquement dans l'application Bluetooth, cependant, le brevet a expiré le 2 juin 2010. Étant donné que la norme A2DP est très courante, il est extrêmement difficile de trouver des écouteurs ou des haut-parleurs qui ne prennent pas en charge SBC.

Le codec fournit une fréquence d'échantillonnage de 16, 32, 44,1, 48 kHz avec un débit de 10 à 1500 kbit / s. Oui, vous avez bien entendu. Jusqu'à 1500 kbps. Il n'y a tout simplement pas de limite de débit binaire dans le codec. Mais plus à ce sujet plus tard.

Le codec aptX a été développé en 1988 à l'Université Queen's de Belfast . Oui, avant Bluetooth, il y avait encore une douzaine d'années, donc le codec était utilisé dans les équipements audio professionnels. Qualcomm détient actuellement les droits, et donc l'utilisation nécessite des licences et des redevances. En 2014, le coût était approximativement le suivant: un paiement unique de 6 000 $ et 1 $ each pour chaque appareil libéré pour les parties comptant jusqu'à 10 000 appareils. Pour cette raison, de nombreux appareils avec Snapdragon 835, 845, 821, 820, 810, 805, 801, 800, 650, 615, 410 sont tout à fait possibles et prennent en charge aptX, mais il n'y est pas activé, car la licence n'a pas été achetée. À ce sujet - également ci-dessous.

Avec une profondeur de bits de 16 bits et une fréquence d'échantillonnage de 48 kHz, le codec peut fournir un débit binaire de 384 kbit / s (double canal).

Liste des produits supportant officiellement aptX . Vous pouvez trouver beaucoup de systèmes inconnus avec le support aptX sur Aliexpress, mais soyez prêt pour le fait qu'il y aura en fait le même bon vieux SBC - et pas plus.

aptX HD - le même codec, mais avec un profil d'encodage différent, a une vitesse de flux de 576 kbit / s, un support pour des fréquences d'échantillonnage jusqu'à 48 kHz et une profondeur de bits jusqu'à 24 bits. Certaines personnes appellent ce codec aptX Lossless - mais cela n'a aucun sens, ne serait-ce que parce qu'il est impossible pour le moment d'obtenir la valeur d'un flux qui pourrait transporter des données sans perte. Un avantage particulier de ce codec est un retard de codage réglable, qui peut être réduit à 1 ms à une fréquence d'échantillonnage de 48 kHz. En outre, le codec est extrêmement avantageux du point de vue du chargement du processeur, ce qui exprime un avantage par rapport aux MP3 et AAS.

Liste des produits supportant officiellement aptX HD . Il est assez petit.

aptX Low latency (ou LL) est une version spéciale du codec qui vous permet de réduire le temps de retard du son à moins de 40 ms. Liste des produits supportant officiellement aptX LL .

image

Elle est là. C'est cette photo qui à un moment donné m'a acheté avec des abats. Retards! Après tout, qui veut entendre le bruit d'une explosion dans un film d'action, le cri d'un monstre dans un film d'horreur ou le rugissement d'une foule lors d'un match de football quand tout est fini?

Mais est-ce vraiment vrai?

Hélas, non.

Comme pour tout matériel marketing, les chiffres sont farfelus. Le retard dépend en grande partie de la mise en mémoire tampon dans le système et la mise en œuvre du codec. Ainsi, le retard avec SBC pourrait bien être inférieur à 40 ms, ce qui, compte tenu des normes de diffusion télévisuelle (+40 ms ... -60 ms), est parfaitement acceptable.

En résumé:

  1. Aucun codec existant ne peut être meilleur que la technologie filaire, car aucun codec ne peut atteindre une véritable compression sans perte.
  2. Le codec le plus populaire est SBC. Il est le plus flexible dans les paramètres. Et malgré le fait qu'aptX soit sorti plus tôt, il ne pouvait pas battre la popularité de SBC, apparemment parce que ce dernier était gratuit.
  3. La qualité sonore dépend extrêmement de la mise en œuvre du codec, ainsi que des performances matérielles des écouteurs / haut-parleurs en général - si le haut-parleur lui-même est faible, la qualité ne peut être améliorée par aucun codec. Par conséquent, à l'avenir, en comparant la qualité, nous parlerons de la lecture du même contenu à partir de la même source sur les mêmes haut-parleurs / écouteurs, mais avec des codecs différents.

Résultats pratiques et très subjectifs




Les informations sont basées sur l'expérience d'un an et demi déjà mentionnée dans l'exploitation, la comparaison et l'attraction d'auditeurs extérieurs.

L'expérience est basée sur l'écoute sans perte sur le lecteur SONY Walkman NWZ-A17, où le codec peut être sélectionné, ainsi que sur la visualisation de divers programmes avec sortie audio via Avantree Priva III.

Il y avait trois écouteurs: Sennheiser PMX 60, Koss Porta Pro et Koss UR-20.

Jabra BT3030 (SBC) et Avantree Clipper Pro (aptX) ont été utilisés comme récepteurs de signaux sans fil.

Un haut-parleur Voombox Outdoor (SBC) et un casque à conduction osseuse Aftershokz Trekz Titanium (aptX) ont également été utilisés.

Tous les égaliseurs et amplificateurs ont été désactivés - et c'est important.

Total:

  1. La qualité du son joué avec une connexion filaire est toujours meilleure. C'est sans aucun doute.
  2. La différence entre SBC et aptX est extrêmement difficile à entendre - et seulement dans le cas de certains types de musique. Par exemple, l'auteur de l'article a clairement entendu la différence dans les solos de violoncelle dans les compositions classiques, tandis que pour le violon et les instruments à basse fréquence, la différence était moins perceptible. Dans les genres modernes - pop, musique électronique et rock - la différence n'est pas entendue. Dans certains cas, il semblait subjectivement que SBC transmet le son mieux qu'aptX.
  3. Le délai entre SBC et aptX ne peut être vu que si vous vous connectez à la même source et insérez différents récepteurs dans différentes oreilles (enfin, le canal gauche est SBC, et le droit est aptX, par exemple). Il est presque impossible de voir le retard avec l'image, mais parce que l'histoire selon laquelle aptX est destiné aux scènes et au contenu dynamiques est un mythe.
  4. La surprise a été causée par la qualité sonore de la Voombox Outdoor plutôt bon marché et "peu célèbre". Apparemment, c'est la mise en œuvre réussie de SBC, qui a été mentionnée ci-dessus.
  5. La mise en œuvre d'aptX dans les écouteurs à conduction osseuse est totalement incompréhensible - la technologie est très spécifique, et donc la perte de qualité est importante en raison de la technologie elle-même. Compte tenu de la petite plage de la «plage» de fonctionnement de l'appareil, de la mise en œuvre extrêmement médiocre du couplage avec deux appareils, je peux dire qu'Aftershokz est une entreprise qui investit plus dans le marketing que dans le développement.


Je ne dis pas que si vous connectez toutes sortes d’analyseurs spectraux et ainsi de suite, vous pouvez et devez voir la différence. Mais l'oreille humaine, et pire encore - l'oreille humaine moyenne - n'est pas un appareil spectral, et n'entend donc pas toutes ces nuances.

Pratique: fixer ce qui peut être réparé


Partie 1. Activez aptX


Comme déjà mentionné, dans certains appareils, l'utilisation d'aptX est désactivée, probablement afin d'éviter les poursuites en matière de brevets.

Ce problème peut être résolu tout simplement en glissant le périphérique de bibliothèque pour implémenter le codec et en écrivant la possibilité de travailler avec ce codec dans build.prop.

Sur Internet, il existe un grand nombre de solutions de cette nature. J'ai pris la liberté de les combiner en un tout en le réalisant comme module pour Magisk. Oui, j'aime vraiment ce projet et je pense que la mise en œuvre de modifications du système sous la forme de modules Magisk est une solution meilleure et plus sûre avec la possibilité de sauvegarder le système dans sa forme originale et de manière simple à restaurer.

Le module peut être téléchargé ici . Oui, je connais github. Et non, jusqu'à ce que j'aie le temps de le mettre là.

Les entrées dans build.prop, y compris aptX et, si possible, aptX HD, seront émulées automatiquement par le module.



Partie 2. Augmentez le débit binaire SBC


Comme indiqué précédemment, le codec SBC n'a fondamentalement aucune restriction de débit binaire. Cependant, les fabricants fixent généralement une limite de 342 kbit / s pour le mono et de 345 kbit / s pour la stéréo afin d'assurer un fonctionnement fiable avec tous les types d'appareils récepteurs.

Dans le même temps, la spécification A2DP v1.2, qui était active de 2007 à 2015, exige que tous les dispositifs de décodage fonctionnent correctement avec des débits allant jusqu'à 320 kbit / s en mono et 512 kbit / s dans le cas d'un signal stéréo.

Dans la nouvelle version de la spécification, il n'y a aucune limite de débit binaire. Il est supposé que les écouteurs modernes sortis après 2015 et prenant en charge EDR peuvent prendre en charge des débits allant jusqu'à 730 kbps.

En fait, ce n'est certainement pas le cas. Dans une étude approfondie menée par ValdikSS , il a été constaté que presque tous les appareils récepteurs fonctionnent de manière fiable avec des débits binaires de 454 kbit / s, et un nombre assez important avec un débit binaire de 507 kbit / s.

Dans ses recherches, ValdikSS a également montré que, contrairement à la croyance populaire sur la qualité du codec aptX, il peut produire des résultats pires sur certains fichiers que SBC avec un débit binaire standard de 328 kbps, et le passage à un SBC à haut débit produira un son qui dépasse souvent aptX, sur n'importe quel casque.

Sur la base de ces données, ValdikSS a envoyé des commentaires aux développeurs de Lineage OS et de Google, mais jusqu'à présent, il n'y a eu aucune réaction.

Ainsi, nous ne pouvons apporter que manuellement des modifications à la pile Bluetooth.

Nous avons besoin d'un IDA Pro avec la possibilité de décompiler ARM, n'importe quel éditeur HEX (j'ai utilisé WinHEX) et le fichier bluetooth.default.so de notre appareil. Habituellement, il se trouve sur le chemin / system / lib / hw et moins souvent - également sur le chemin / system / lib64 / hw (un accès root est définitivement nécessaire).

Ouvrez donc le fichier bluetooth.default.so. Les opérations et modifications décrites ci-dessous s'appliquent uniquement à la pile Android d'origine (bluedroid). Si vous voyez la ligne «Needed Library 'com.qualcomm.qti.bluetooth_audio@1.0.so'» ou similaire dans IDA Pro, il est fort probable que cette instruction ne vous aidera pas.



Notre première tâche consiste à remplacer Joint Stereo par Dual Channel dans une configuration standard.

Nous travaillerons avec la fonction bta_av_build_src_cfg .

Pour trouver cette procédure dans l'IDA, nous allons utiliser la recherche de ligne pour un message caractéristique dans le journal de débogage "Cant parse src cap ret =% d" :





En conséquence, nous trouvons assez rapidement la fonction elle-même sous forme de code:



Notre tâche est de remplacer la structure d'origine des chèques

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;</code>  <code> 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; 

Il existe plusieurs façons de procéder.

Le premier est le remplacement des instructions TST.W R0, # 1 avec TST.W R0, # 4 et MOVS R0, # 1 avec MOVS R0, # 4 dans la séquence de vérifications:



En bytecode, il s'agit du remplacement de x01 en x04. Il est important de noter la séquence caractéristique d'octets par laquelle ce modèle peut être trouvé. Sans entrer dans les détails, je dirai que c'est essentiellement une recherche de séquence

 10 20 8D F8 04 00 9D F8 0D 00 10 F0 01 0F ?? ?? 10 F0 02 0F ?? ?? 10 F0 04 0F ?? ?? 10 F0 08 0F ?? ?? 08 20 ?? ?? 01 20 ?? ?? 02 20 ?? ?? 04 20 

et son remplacement par

 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 04 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 04 ?? ?? ?? ?? ?? ?? ?? ?? ?? 

Cependant, cette méthode présente des inconvénients.

Un certain nombre de compilateurs modifient la séquence d'exécution des commandes en fonction de l'optimisation. Et dans ce cas, il n'est pas possible de trouver le modèle souhaité, et parfois le mécanisme de vérification dans la structure est généralement introduit dans le code en ligne. Par conséquent, il est plus fiable de modifier la constante btif_av_sbc_default_config .

Pour commencer - trouvez-la. Elle est au tout début de notre fonction, car

 void bta_av_build_src_cfg (UINT8 *p_pref_cfg, UINT8 *p_src_cap) { tA2D_SBC_CIE src_cap; tA2D_SBC_CIE pref_cap; UINT8 status = 0; /* initialize it to default SBC configuration */ A2D_BldSbcInfo(AVDT_MEDIA_AUDIO, (tA2D_SBC_CIE *) &btif_av_sbc_default_config, p_pref_cfg); /* now try to build a preferred one */ /* parse configuration */ if ((status = A2D_ParsSbcInfo(&src_cap, p_src_cap, TRUE)) != 0) { APPL_TRACE_DEBUG(" Cant parse src cap ret = %d", status); 

Et la voici:





On peut voir que btif_av_sbc_default_config lui-même est une séquence d'octets 20 01 10 04 01 35 02, tandis que le premier octet code la fréquence d'échantillonnage et peut être 10 (48 kHz) et 20 (44 kHz), et donc non spécifique. Ainsi, notre tâche est de remplacer la séquence
01 10 04 01 35 02
sur
04 ?? ?? ?? ?? ??

Cela vous permettra de changer la logique de la structure d'une manière similaire, mais en même temps, l'optimisation du compilateur ne posera pas de problèmes.

Dans certains cas, les écouteurs ou les haut-parleurs initient eux-mêmes la connexion. Dans ce cas, le mode est déterminé par la fonction bta_av_co_audio_init .

La fonction est caractérisée par la ligne «bta_av_co_audio_init:% d» et est facilement recherchée dans le code:


L'énumération des modes de connexion possibles est effectuée dans la commande suivante:

  switch (index) { case BTIF_SV_AV_AA_SBC_INDEX: /* Set up for SBC codec for SRC*/ *p_codec_type = BTA_AV_CODEC_SBC; /* This should not fail because we are using constants for parameters */ A2D_BldSbcInfo(AVDT_MEDIA_AUDIO, (tA2D_SBC_CIE *) &bta_av_co_sbc_caps, p_codec_info); /* Codec is valid */ return TRUE; 

la constante bta_av_co_sbc_caps a la structure suivante :

 const tA2D_SBC_CIE bta_av_co_sbc_caps = { (A2D_SBC_IE_SAMP_FREQ_44), /* samp_freq */ (A2D_SBC_IE_CH_MD_MONO | A2D_SBC_IE_CH_MD_STEREO | A2D_SBC_IE_CH_MD_JOINT | A2D_SBC_IE_CH_MD_DUAL), /* ch_mode */ (A2D_SBC_IE_BLOCKS_16 | A2D_SBC_IE_BLOCKS_12 | A2D_SBC_IE_BLOCKS_8 | A2D_SBC_IE_BLOCKS_4), /* block_len */ (A2D_SBC_IE_SUBBAND_4 | A2D_SBC_IE_SUBBAND_8), /* num_subbands */ (A2D_SBC_IE_ALLOC_MD_L | A2D_SBC_IE_ALLOC_MD_S), /* alloc_mthd */ BTA_AV_CO_SBC_MAX_BITPOOL, /* max_bitpool */ A2D_SBC_IE_MIN_BITPOOL /* min_bitpool */ }; 

La constante se retrouve facilement dans le code, dans mon cas c'est 20 0F F0 0C 03 35 02:



Faites attention à l'octet 0F - il offre la possibilité de se connecter à l'un des modes valides, car

 x0F = A2D_SBC_IE_CH_MD_MONO | A2D_SBC_IE_CH_MD_STEREO | A2D_SBC_IE_CH_MD_JOINT | A2D_SBC_IE_CH_MD_DUAL = x08 | x02 | x01 | x04 

Notre tâche consiste à modifier cette valeur comme suit:

 x0F = A2D_SBC_IE_CH_MD_DUAL = x04 

Par conséquent, il est nécessaire de remplacer

?? 0F F0 0C 03 35 02
sur
?? 04 ?? ?? ?? ?? ??

Nous avons donc forcé la pile à se connecter en mode Dual Channel à la fois dans le cas de l'établissement d'une connexion par le périphérique et dans le cas de l'établissement d'une connexion par le côté réception du signal.

Vous devez maintenant supprimer les restrictions de débit binaire ou augmenter son seuil supérieur.

Besoin de gérer btif_media_task_get_sbc_rate . De même, pour rechercher la ligne caractéristique "non-edr a2dp sink détecté, limiter le taux à% d", nous recherchons la fonction dans le code:


La limite de débit binaire est exprimée dans une chaîne
Débit UINT16 = DEFAULT_SBC_BITRATE (qui à son tour est de 328 kbps )

Dans le code, c'est comme ça:



Modifiez cette valeur à 454 kbit / s - elle est supérieure à la norme et fonctionne avec la grande majorité des récepteurs. Pour ce faire, remplacez les octets

B1 4F F4 A4 74 ?? E0
sur
?? ?? ?? E3 ?? ?? ??

Vous devez également rechercher par modèle.

E0 4F F4 A4 74 ?? E0
et remplacez-le par
?? ?? ?? E3 ?? ?? ??
- Ceci est requis pour un certain nombre d'appareils.

La valeur de E3 peut être différente en fonction du débit binaire maximum souhaité:

  • E3 - 454 kbps
  • F1 - 482 kbps
  • F3 - 486 kbps
  • 10 à 576 kbps
  • 48 - pas de limite

En général, cela est déterminé par le bytecode de l'opération MOV.W R4, XXX.

En pratique, il vaut la peine d'expérimenter et de choisir la valeur maximale à laquelle tous vos appareils récepteurs reçoivent une réception de signal stable, il n'y a pas de craquage, d'interruption ou de distorsion.

Sur tous les récepteurs de mon expérience (je les ai indiqués ci-dessus), cette valeur était de 576 kbit / s, le téléphone Xiaomi Redmi 4x MIUI10 Android 7.1 était la source du signal.

Sur la base des actions décrites, un correctif générique a été créé qui trouve les modèles spécifiés dans Bluetooth.default.so et les remplace? y compris le mode Dual Channel forcé et la définition de la limite de débit à 454 kbps. Si nécessaire, la valeur limite peut être facilement modifiée en fonction de la recherche et du remplacement de l'octet correspondant - un lecteur attentif le fera sans difficulté.

Je souligne: le patch ne fonctionne que dans le cas de la pile bluedroid et ne réussira probablement pas dans le cas de la pile Fluoride et d'Android version 8 et versions ultérieures.

Le patch peut être téléchargé à partir d'ici .

Il est fortement recommandé de remplacer le fichier d'origine en tant que modules Magisk, pour moi, je l'ai fait comme suit . Veuillez noter : ces modules ont été créés par moi pour le téléphone Xiaomi Redmi 4x 3/32 Go avec le firmware MIUI 10 stable mondial actuel au moment de la rédaction. Dans votre cas, le fichier bluetooth.default.so devra être remplacé par le vôtre, corrigé, comme décrit ci-dessus. Il est également possible que le fichier doive être dupliqué le long du chemin / système / lib64 / hw - cela dépend du modèle et de la version du firmware de votre téléphone.

Cette approche utilisant des modules Magisk permet de changer facilement le débit binaire maximum et généralement de désactiver les modifications s'il s'avère que certains des appareils récepteurs ne prennent pas en charge le double canal.

Conclusion


À l'heure actuelle, dans la poursuite des ventes, de nombreuses entreprises présentent des innovations technologiques pour justifier un prix plus élevé.

Dans la pratique, il s'avère que les technologies existantes et moins chères ne sont pas entièrement développées et que les innovations technologiques ne sont pas pleinement mises en œuvre, ce qui affecte considérablement la qualité.

Très souvent, les utilisateurs ressentent «l'effet placebo», se convaincant de la perfection d'un produit uniquement parce qu'il est plus récent ou plus coloré. En fait, cette qualité est imaginaire.

Malgré la détérioration évidente de la qualité de la transmission audio sans fil par rapport à la version filaire, il semble que les fabricants d'appareils modernes visent une transition complète vers les technologies sans fil. Dans le même temps, des astuces marketing sont utilisées pour justifier l'augmentation des prix: protection contre l'immersion du téléphone dans l'eau (comment parler sous l'eau? Pourquoi faire tomber l'appareil dans l'eau?), Utilisation de codecs plus chers, etc. Dans le même temps, le potentiel du codec SBC populaire existant n'est pas pleinement utilisé.

Nous n'avons pas pu obtenir de clarification de Google concernant la limite de débit binaire de 328 kbps, ni éliminer cette limite et ajouter l'option d'activer Dual Channel dans le menu Bluetooth des développeurs de Lineage OS.

Merci à tous ceux qui ont lu jusqu'au bout!

Une certaine suite causée par la discussion dans les commentaires et un espace concernant le codec LDAC est ici .

Source: https://habr.com/ru/post/fr433502/


All Articles