Pourquoi pulseaudio gère-t-il la connexion de qualité sonore à un appareil BT?

11

Je suis nouveau sur Linux et nouveau sur les scripts Bluetooth. Ce que j'ai découvert jusqu'à présent est le suivant:

  1. Bluez est la pile BT par défaut.
  2. BluezTools est un ensemble d'utilitaires que vous pouvez utiliser pour interagir plus facilement avec Bluez
  3. DBus est l'interface à laquelle Bluez se connecte tout en interagissant directement avec le matériel.
  4. PulseAudio est le sous-système responsable de la production audio sur le système.

C'est logique. Disons donc que j'ai un casque BlueTooth, ce à quoi je m'attendrais (tout après l'appairage et la confiance), pour pouvoir émettre une commande qui peut se connecter directement à un certain profil sur le casque BT.

Le chemin technique que j'ai en tête serait quelque chose comme:

  1. Allumez les écouteurs.
  2. Émettez une commande BluezTools - telle que bt-audio -c
  3. Attendez que l'appareil se connecte au service que je recherche
  4. PulseAudio devrait maintenant prendre un nouveau périphérique de sortie
  5. Émettez une autre commande pour changer l'audio de ce qu'il était en un nouvel audio de sortie (le casque BT).
  6. Profitez d'une expérience d'écoute transparente.

Tout cela semble logique, mais l'implémentation réelle n'est pas comme ça, et je cherche le POURQUOI, donc je peux mieux comprendre le problème et essayer de le résoudre.

C'est ce qui se passe réellement:

  1. Allumez les écouteurs.
  2. Émettez une commande BluezTools - telle que bt-audio -c
  3. Attendez que l'appareil se connecte au service que je recherche
  4. PulseAudio devrait maintenant prendre un nouveau périphérique de sortie
  5. Émettez une commande PulseAudio pour changer le profil audio de la qualité du téléphone à la haute fidélité.

Permettez-moi de développer un peu ce point. Le casque bluetooth propose 2 modes de qualité (téléphone et haute fidélité). Seul 1 est vraiment adapté pour écouter de la musique.

Je m'attendrais à ce que le casque BT expose chaque mode de qualité en tant que service, n'est-ce pas? Cette hypothèse pourrait être fausse, mais je m'attendrais à quelque chose comme

bt-audio -c highFidelityProfile

ou

bt-audio -changeProfile highFidelityProfile

Au lieu de cela, il semble que Bluez gère uniquement la connexion RAW à l'appareil, et à partir de là, vous devez émettre un: pacmd set-card-profile $ INDEX a2dp

Cela semble fondamentalement faux. Pourquoi le contrôle de la qualité dans le sous-système audio nécessite-t-il donc une implémentation différente pour pulse ou alsa, ou tout autre sous-système audio?

Qu'est-ce que je rate? Pourquoi n'est-il pas possible de se connecter directement à un certain profil en utilisant Bluez / BluezTools, etc.?

JL.
la source

Réponses:

2

Une connexion Bluetooth a une latence importante par rapport à de simples écouteurs ou haut-parleurs filaires. De plus, la latence de connexion peut varier, selon les propriétés du récepteur Bluetooth et peut-être même la puissance du signal radio lorsque l'utilisateur se déplace.

L'interface entre une application et PulseAudio peut être aussi simple que "voici quelques données audio PCM; lisez ceci." Mais cela peut aussi être plus compliqué; quelque chose comme "Voici quelques données audio PCM; lisez-les et dites-moi toutes les 50 ms où vous en êtes, afin que je puisse vous dire de sauter si vous avez l'impression que vous ne tombez pas en synchronisation labiale avec le flux vidéo Je joue. Oh, et vous devrez également le rééchantillonner, car les données ont un taux d'échantillonnage que votre matériel ne prendra pas directement en charge. " Dans ce dernier cas, PulseAudio doit être en mesure de fournir à l'application des informations en retour du périphérique audio pour déterminer correctement dans quelle mesure les données audio sont réellement lues à un moment donné.

En conséquence, il est logique que PulseAudio soit assez profondément impliqué dans le traitement audio Bluetooth: plus il y a de couches intermédiaires, plus il y a de possibilités pour les données à tamponner sans maintenir une rétroaction précise, ce qui entraîne la perte de la synchronisation labiale.

En fait, avant que PulseAudio n'existe, il existait auparavant un backend ALSA pour l'audio Bluetooth, mais il était obsolète. Je pense que le problème était que les interfaces d'ALSA à cette époque étaient conçues principalement pour les cartes son traditionnelles, et qu'il était difficile de gérer une latence audio potentiellement variable de Bluetooth.

Les interfaces de PulseAudio ont été conçues dès le départ pour gérer divers périphériques audio et même basculer entre les flux audio pendant la lecture, il me semble donc qu'il a également un concept assez avancé de latence audio intégré.

Oui, il aurait pu être implémenté dans BlueZ plutôt qu'en tant que module PulseAudio; mais alors, BlueZ aurait dû présenter une interface audio pour les applications. Et puisque PulseAudio veut gérer "tout" l'audio sur un système (afin de pouvoir transférer à la volée l'audio que vous jouez actuellement des haut-parleurs vers Bluetooth ou vice versa), il devrait s'interfacer avec PulseAudio de toute façon.

telcoM
la source
2

Je pense avoir enfin trouvé une solution (testée sur deux systèmes Linux Mint) bien que je ne sache pas pourquoi je dois suivre ces étapes exactes:

Étapes initiales:

  1. Installer Blueman: Sudo apt-get installer Blueman
  2. Modifiez le fichier Bluetooth: sudo nano /etc/bluetooth/main.conf et ajoutez cette ligne à la fin: Disable = Headset

Pour chaque course:

  1. Redémarrez le service bluetooth: redémarrage bluetooth du service sudo
  2. Ouvrez Périphériques depuis blueman dans la barre d'état système ou tapez blueman-manager dans le terminal
  3. Recherchez votre appareil audio Bluetooth
  4. Faites un clic droit sur votre appareil et connectez-vous en tant que casque
  5. Accédez au son à partir des paramètres système
  6. Sélectionnez votre appareil en cliquant une fois dessus
  7. Maintenant, allez à nouveau à blueman-manager
  8. Cliquez avec le bouton droit sur votre périphérique Bluetooth et définissez le profil audio sur Lecture haute fidélité (récepteur A2DP)

Si vous manquez l'une des étapes, passez à l'étape 1 et réessayez. Laissez-moi savoir si cela fonctionne.

Edit : Dans Linux Mint 19, le gestionnaire Bluetooth par défaut fonctionne parfaitement avec la lecture haute fidélité, aucune configuration requise du tout !!

Aditya Pal
la source
0

Bien que cela puisse varier de votre configuration, voici quelques commandes bien testées.

Vous devez définir l'appareil comme fiable. Cela peut être fait via l'interface graphique.

sdptool Browse donnera de nombreux détails sur les protocoles et canaux disponibles sur le périphérique cible.

Il est plus facile de définir un bluetooth A2P bloc récepteur audio lors de l' utilisation des sorties audio simultanées, pour la configuration, le voir l'outil paprefs .

sudo apt install bluetooth 
sudo apt install bluez bluez-tools
sudo apt install rfkill rfcomm

Démarrez l'appareil, il devrait être de toute façon hci0:

sudo hciconfig hci0 up

Liste des appareils distants:

sudo rfkill list

Liste des réseaux Bluetooth:

hcitool scan

Parcourir les protocoles disponibles:

sdptool browse 43:23:00:02:23:A7

Connectez un appareil:

sudo rfcomm connect hci0 43:23:00:02:23:A7

Envoyer un fichier:

sudo bt-obex -p 43:23:00:02:23:A7 ~/images/tof.png

Recevoir un fichier:

sudo bt-obex -s /

Scannez / attendez les données sur un canal (ici le canal 19), et écrivez les données sur un fichier appelé dump, dans le dossier home:

sudo apt install bluez-hcidump

hcidump -i hci0 -O 19 -w ~/dump

Alternative: parfois utile pour l'appairage:

sudo apt install bluetoothctl

bluetoothctl
power on
connect 43:23:00:02:23:A7
trust 43:23:00:02:23:A7
info 43:23:00:02:23:A7

[bluetooth]# agent on
[bluetooth]# default-agent
[bluetooth]# discoverable on
[bluetooth]# pairable on
[bluetooth]# scan on
[bluetooth]# pair 43:23:00:02:23:A7
[agent]PIN code: ####
[bluetooth]# trust 43:23:00:02:23:A7
[bluetooth]# connect 43:23:00:02:23:A7
[bluetooth]# info 43:23:00:02:23:A7
NVRM
la source