Casques Bluetooth stéréo A2DP : comment améliorer la qualité

Depuis Mac OS X 10.5, Apple supporte les appareils Bluetooth à la norme A2DP, qui permet de la diffusion en stéréo. Mais dans beaucoup de cas, la qualité est assez moyenne sous Mac OS X (pour ne pas dire mauvaise). Avec cette astuce, il est possible d’améliorer dans certains cas la qualité du flux.
EDIT : j’ai corrigé une sale erreur sur la relation entre bitpool et bitrate, ce qui ne change rien à la question dans la pratique.

Pour bien comprendre, il faut d’abord voir comment l’A2DP fonctionne. La technologie recompresse le son dans un codec maison, le SBC, et envoie le flux au casque, qui décompresse. On a donc une dégradation obligatoire du son, contrairement à une solution comme AirPlay qui transmet en ALAC. Techniquement, il est possible de transmettre directement du son déjà compressé (par exemple en AAC) mais aucun périphérique ne le permet à ma connaissance.

Le débit binaire du flux compressé dépend de plusieurs choses, et est variable. La première chose, c’est le périphérique : tous les appareils ne supportent pas les mêmes débits. Dans mes quelques tests (5 appareils), le bitpool (a priori le débit binaire) maximal varie de 44 à 64.

La relation entre bitpool et bitrate n’est pas très claire, mais voici quelques valeurs données par le consortium Bluetooth : 19 correspond à du 128 kilobits/s, 35 à du 235 kilobits/s, 53 à du 328 kilobits/s. Sachant que le SBC est significativement moins bon que du MP3, ça reste assez moyen.

La seconde chose, c’est le nombre d’appareils Bluetooth : si vous avez beaucoup de périphériques, la bande passante est saturée et le débit binaire diminue automatiquement (dans une certaine limite). Si vous avez beaucoup d’appareils, vous risquez de recevoir ce genre de messages :

Dans mon cas, je l’ai eu alors que j’avais quatre appareils connectés : un clavier, un pavé numérique, une souris, un trackpad. De fait, le son était saccadé, et débrancher la souris a réglé les choses.

Le dernier point, sur lequelle nous allons jouer, ce sont les paramètres de Mac OS X. Par défaut, Mac OS X peut faire varier le débit entre un bitpool de 2 et un bitpool de 64, avec une initialisation à 30. En fixant une valeur minimale élevée, il est donc possible d’empêcher le système de dégrader le son et donc « améliorer » la qualité globale. Il y a deux défauts : il faut une réception correcte (oublier si vous avez comme moi qautre appareils connectés) et que votre périphérique supporte un débit élevé.

La première chose à faire est de vérifier si votre appareils supporte un débit élevé. Il faut donc le jumeler, lancer de la musique (important) et ensuite lancer une fenêtre Terminal.

defaults read com.apple.BluetoothAudioAgent

Le résultat (ici pour un Motorola S9) donne quelques informations.

{
"Apple Bitpool Max (editable)" = 64;
"Apple Bitpool Min (editable)" = 2;
"Apple Initial Bitpool (editable)" = 30;
"Negotiated Bitpool" = 30;
"Negotiated Bitpool Max" = 44;
"Negotiated Bitpool Min" = 2;
"Stream - Flush Ring on Packet Drop (editable)" = 0;
"Stream - Max Outstanding Packets (editable)" = 30;
"Warned about audio bandwidth" = 1;
}

Les trois premières valeurs sont les paramètres Apple. La suivante est le débit actuel, les deux suivantes les capacités de l’appareil. On voit par exemple que le casque Motorola est assez mauvais, avec seulement un bitpool de 44. C’est une valeur importante, dans le sens ou il ne faut évidemment pas fixer une valeur plus élevée que celle là.

Dans mes tests, le Motorola S9 est à 44, un casque Sony DR-BT21G à 53, une oreillette Sony Ericsson HBH-DS200 à 64, un récepteur Sony Ericsson MBR-100 à 55 et une enceinte Sony Ericcson MBS-100 à 53. On considère que 48 est un son de bonne qualité et 58 un son de très bonne qualité.

Une fois qu’on a une valeur maximale, il suffit de fixer les paramètres de Mac OS X. Au lieu d’un bitpool minimale de 2, le mieux est de fixer un bitpool minimal de 40 ou 48, en fonction des appareils, et éventuellement de le diminuer en cas de soucis.

defaults write com.apple.BluetoothAudioAgent "Apple Bitpool Min (editable)" 48

Normalement, la différence devrait être audible assez facilement…