Greboca  

LinuxFr.org : les journaux  -  Utiliser un pi zero comme serveur de son et lecteur bluetooth

 -  Octobre 2019 - 

Sommaire

Le contexte

Depuis longtemps, j'utilise un PC branché à mon ampli hifi pour écouter la musique dans le salon. Ça me permet d'avoir un bon son depuis n'importe quel PC (via pulseaudio en réseau, MPD etc) et se passer des enceintes intégrées des PCs de bureau. Ce serveur de son servait aussi à héberger mes courriels, site, et serveur de fichier.

Les choses changent, et depuis quelques temps, j'ai choisi d'héberger ces services sur des instances dédiées, et mon serveur équipé de disques raid, d'une grosse alim était devenu largement surdimensionné par rapport à son utilisation.

En parallèle de ça, j'ai commencé à jouer avec le raspberry pi zero, et l'idée est venue de déporter le son sur un PI0, toujours en jouant avec pulseaudio pour récupérer le son depuis mon PC ou celui de ma femme, mon serveur MPD (qui ne sera allumé cette fois qu'au moment où j'ai besoin de ces fichiers).

Il y a quelques années, j'avais également joué avec un DAC bluetooth (le philips AEA2700) puis avait laissé tombé devant le peu d'entrée de mon ampli qui ne rendait pas l'utilisation pratique. Vu que le PI0 dispose du wifi et du bluetooth, pourquoi ne pas l'utiliser également comme une sortie son pour y connecter les téléphones ? C'est à priori possible, mais n'ai jamais testé ça. À voir.

La carte du PI0 n'a pas de sortie son (il y a quand même une sortie HDMI qui peut être utilisée avec un adaptateur), et j'ai voulu me faire plaisir pour une fois. Vu que le PI0 contient des ports GPIO, de nombreux constructeurs sont venus proposer des extensions pour ajouter une carte son sur le pi. J'ai retenu la Mini Boss de Allo, au vu des critiques glanées ci et là, mais sans avoir d'attente particulières sur la carte. Le but est avant tout de remplacer l'existant.

Ah oui, avant qu'on aborde le sujet dans les commentaires, je ne suis pas mélomane, et je me suis contenté pendant des années des sorties son intégrées aux PC (les fameux AC97 et autres consorts), d'un ampli datant des années 80, et des enceintes peut-être aussi âgées… Mes oreilles ont été modelées par le MP3 et les concerts. Mes avis sur le son ne sont donc pas des références.

Installation

C'est parti pour une petite Raspbian Lite, pas d'interface graphique, le but est que tout fonctionne sans intervention (ou presque).

On configure ce qu'il faut (wifi etc), on branche la carte, et comme le libre fait bien les choses, il suffit d'une ligne de conf dans un fichier pour charger les drivers correspondants :

   dtoverlay=allo-boss-dac-pcm512x-audio

Et c'est tout !

Premier test

Pour tester, je me suis copié un fichier directement sur la carte, installé mpg123, et là. WOW ! (insérer ici le commentaire de quelqu'un qui découvre une nouvelle dimension pour la première fois). Pour être sûr, je débranche tout, je remet les fils sur mon ancien serveur, rejoue le même fichier. Ok, j'ai compris, il n'y aura pas de retour. Je garde !

PulseAudio

Sur le serveur

Maintenant, il ne reste plus qu'à configurer pour avoir le son depuis les PCs. Là c'est facile, il me suffit de reprendre ma configuration précédente :

  sudo apt-get install pulseaudio

Dans le fichier /etc/pulse/system.pa :

  # Autoriser les connexions du réseau
  load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;réseau-local-ipv4/24;réseau-local-ipv6::/64 auth-anonymous=1

Afin que le service démarre avec le raspberry pi, nous allons préparer un petit
script dans le fichier /etc/systemd/system/pulseaudio.service

  [Unit]
  Description=PulseAudio system server

  [Service]
  ExecStart=/usr/bin/pulseaudio --system

  [Install]
  WantedBy=multi-user.target

On active ensuite le démarrage du service avec la commande suivante :

  sudo systemctl enable pulseaudio.service

Sur les clients

Je ne voulais pas rediriger par défaut le son vers le pi0. Des fois on a juste besoin de regarder des vidéos de chats, et pour ça, le son du PC suffit largement. Sur les PCs, j'ai donc ajouté une sortie son, tout en gardant le serveur local de pulseaudio :

Ça donne cette ligne à ajouter dans le fichier /etc/pulse/default.pa :

   load-module module-tunnel-sink sink_name=rpi_tunnel server=tcp:192.168.0.2:4713 sink=alsa_output.platform-soc_sound.stereo-fallback

Le nom de la sortie peut être trouvée avec la sortie de la commande pulse pactl list depuis le pi0

Ça permet de choisir à partir du contrôleur de volume de pulseaudio la sortie vers laquelle on souhaite rediriger le son.

Bluetooth

Et maintenant, nous allons voir comment déclarer le PI0 comme une sortie bluetooth ! En fait, on va utiliser à la fois pulseaudio et son module dédié :

  sudo apt-get install pulseaudio-module-bluetooth

et on modifie le fichier /etc/pulse/default.pa pour le charger :

  load-module module-bluetooth-policy
  .ifexists module-bluetooth-discover.so
  load-module module-bluetooth-discover
  .endif

Pour que ça fonctionne, il faut aussi ajouter l'utilisateur pulse au groupe lp :

  sudo usermod -a -G lp pulse

Il faut bien sûr que le pi0 soit déclaré comme un périphérique capable de recevoir du son. Pour cela, il y a toute une série de codes que l'on peut trouver à cette adresse qui permettent d'identifier la classe du périphérique auprès des appareil. De mon côté, j'ai pris le code 0x200428 qui correspond à une sortie audio HIFI.

Ça se passe ensuite dans le fichier /etc/bluetooth/main.conf :

Class = 0x200428


# How long to stay in discoverable mode before going back to non-discoverable
# The value is in seconds. Default is 180, i.e. 3 minutes.
# 0 = disable timer, i.e. stay discoverable forever
DiscoverableTimeout = 0

# How long to stay in pairable mode before going back to non-discoverable
# The value is in seconds. Default is 0.
# 0 = disable timer, i.e. stay pairable forever
PairableTimeout = 0

Autorisation d'un périphérique

Notre pi0 autorise maintenant n'importe qui a s'appairer avec lui, à tout moment. Ça n'est toutefois pas suffisant, il faut encore autoriser la connexion. C'est là la seule étape qu'on ne peut pas automatiser, il faut faire l'autorisation manuellement, pour chaque nouveau périphérique. Il faut à se moment se connecter sur le pi0, et lancer l'autorisation via bluetoothctl

    $ bluetoothctl
    trust 

Et c'est tout ! Ensuite on laisse opérer la magie de pulseaudio, qui récupère le son et le joue directement. On dispose donc d'un petit périphérique sans fil qui peut maintenant centraliser tout le son de la maisonnée !

Conclusion

En fait, ça n'était pas aussi compliqué que ça quoi je m'attendais. J'ai passé à peu près une demi journée pour trouver les informations, et je suis au final vraiment bluffé par la qualité du son. De manière générale, le son ne laggue pas quand je joue depuis un PC ou que je diffuse en bluetooth, le PI fait bien son boulot.

Voilà il ne me reste plus qu'a mettre en route ma scie à chantourner et faire un petit boitier qui va bien ! Je retourne à ma musique !

Commentaires : voir le flux atom ouvrir dans le navigateur

par chimrod

LinuxFr.org : les journaux

LinuxFr.org : Journaux

Regata OS 24 “Arctic Fox” avec KDE Plasma 6 et d'autres améliorations

 -  27 mars - 

Regata OS 24 “Arctic Fox” avec KDE Plasma 6 et d'autres améliorationsLa version 24 de Regata OS, baptisée "Arctic Fox", est une distribution basée (...)


Redis Open Source bronsonisé

 -  22 mars - 

Bonjour Nal.Désolé pour ce titre un peu putaclick. Personne n'est décédé cette fois ci.Juste Redis qui change de licence, passant de BSD3 a une (...)


PullRequest d'une application en Rust

 -  16 mars - 

Sommaire Le commencement Description du pool de stockage de BackupPC Le format des fichiers compressés Le format des fichiers d'attributs Le (...)


Jouons un peu avec linuxfr et CSS3

 -  16 mars - 

De temps en temps, j'ai besoin de me détendre, et je joue un peu avec les tech du web, entre deux déploiements.J'aime bien HTML5 et CSS, (...)


Traduction : Payer ne permet pas d'échapper aux monopoles

 -  6 mars - 

Sommaire Contexte Traduction ContexteAyant récemment découvert dans la section liens de LinuxFr le plus récent blog de C. Doctorow, le caractère (...)