Journal Utiliser un pi zero comme serveur de son et lecteur bluetooth

Posté par  (site web personnel) . Licence CC By‑SA.
Étiquettes : aucune
57
6
oct.
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 <adresse du téléphone>

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 !

  • # Super merci

    Posté par  (site web personnel, Mastodon) . Évalué à 5.

    Bravo ! J'espère qu'on pourra voir le boitier qui va avec.
    Par contre, je me dis que ça réclame une organisation matérielle particulière. Bref, en admettant que j'essaie, ça veut dire qu'il va me falloir changer la chaîne de place, ou en dégager pour le PI0.
    Et c'est connecté sur quel type d'ampli ?

    « Tak ne veut pas quʼon pense à lui, il veut quʼon pense », Terry Pratchett, Déraillé.

    • [^] # Re: Super merci

      Posté par  (site web personnel) . Évalué à 9.

      Il faut pas exagérer, la taille est vraiment petite :

      Le DAC pi0

      L'ampi est un ampli audio des années 80 que l'on peut trouver à 60€ sur le bon coin (AKAI AM-U310). Comme dit dans le journal, c'est du matériel de récup, et c'est la première fois que j'investi autre chose que du temps dans mon système audio.

      Sur le net j'avais un peu galéré à trouver des infos sur l'utilisation de pulseaudio pour la réception audio. La plupart des tutos expliquent comment se connecter à un casque bluetooth, mais jamais comment créer un récepteur. C'est surtout cette partie là qui m'a poussé à faire le journal.

    • [^] # Re: Super merci

      Posté par  (Mastodon) . Évalué à 4. Dernière modification le 06 octobre 2019 à 15:47.

      J'ai un pi-zero w + carte et boitier hifiberry. Il était accroché à l'arrière du meuble sur lequel était posé mon ampli via du velcro autocollant.

      Pas la peine de revoir toute la déco intérieure à priori.

      • [^] # Re: Super merci

        Posté par  (site web personnel, Mastodon) . Évalué à 3. Dernière modification le 06 octobre 2019 à 15:57.

        Ben, vu que la chaine hifi est dans une bibliothèque qui déborde de livres (elle-même cernée de bibliothèques qui…), si, en ce qui me concerne :-)

        « Tak ne veut pas quʼon pense à lui, il veut quʼon pense », Terry Pratchett, Déraillé.

  • # mon expérience

    Posté par  (site web personnel) . Évalué à 4.

    Ah tiens ton tuto m'intéresse bien, car ça fait longtemps que j'ai voulu tenter un truc comme ça, mais faute de temps je ne suis pas allé au bout. Il y a quelques années j'avais réussi à transmettre l'audio via pulseaudio du PC au PI-2, mais j'avais des problèmes de coupure au bout d'un moment je crois, donc j'avais abandonné.

    Je m'en suis donc arrêté à coller mpd sur le PI-0, que j'ai relié à ma micro-chaîne hifi avec un convertisseur HDMI -> VGA+Jack.

    Au départ, sur le PI-0, mpd utilisait pulseaudio. Puis lors de la dernière mise à jour majeure de raspbian, ça a cessé de fonctionner et j'ai reconfiguré en alsa (pulseaudio ne m'apportait pas de plus par rapport à mon utilisation actuelle, mais ça m'ennuyait quand même d'avoir une régression).

    Du peu que j'ai creusé, il semble que ce soit un problème de sécurité et de démarrage de pulseaudio, qui ne se faisait qu'une fois un utilisateur avait ouvert une session… ce qui n'est jamais le cas dans mon utilisation. Avant, je crois qu'il démarrait par root (d'où le problème de sécurité). Bon je vous raconte tout ça de mémoire, ça date de plusieurs mois.

    Donc merci pour ton journal, j'essaierai quand j'aurai un peu de temps (là je ne vais pas avoir mon PI-0 sous la main pendant une semaine…).

    • [^] # Re: mon expérience

      Posté par  (site web personnel) . Évalué à 3. Dernière modification le 07 octobre 2019 à 09:44.

      Depuis toujours, il y a un discours ambigüe de la part des développeurs de pulseaudio sur l'utilisation d'un serveur de son. Il y a un gros warning qui explique que pulseaudio n'est pas fait pour ça, et présente un gros risque de sécurité.

      Du coup, il n'y a pas d'intégration dans les distributions, et ça oblige à faire un peu à la main. (Je n'ai pas voulu détailler d'avantage dans le journal, j'ai juste mis le service systemd).

      Je pense que ça ne concerne pas tant d'utilisateurs que ça dans le monde, donc au final tout le monde bricole ça un peu de son côté…

  • # Tablette pour faire du son

    Posté par  . Évalué à 4. Dernière modification le 06 octobre 2019 à 17:07.

    Chez mes parents, on a une tablette pour écouter des radios internet. La tablette, tournant sur Ubuntu avec Mate, est branchée à un ampli et lit une radio au démarrage (avec Clementine).

    Elle est également capable de recevoir des flux PulseAudio par le réseau (configuré avec paprefs) et accepte des périphériques Bluetooth comme des téléphones Android, configuré avec un des gestionnaires Bluetooth qu'on peut installer, Blueman je crois. Configuration entièrement graphique dans mes souvenirs.

    Lors du premier appairage d'un appareil Bluetooth, il faut accepter l'appareil depuis l'écran de la tablette.

    Configuration assez simple au final.

    • Méthode native PulseAudio :
      • avantage : les appareils peuvent être assez loin entre eux. Pas de compression avec perte.
      • inconvénient : ça demande beaucoup de bande passante. Il faut utiliser Ethernet ou avoir un bon wifi stable. Les téléphones Android ne permettent pas d'envoyer du son vers PulseAudio nativement.
    • Méthode Bluetooth :
      • avantage : Ça marche avec n'importe quel appareil compatible Bluetooth et les gens savent l'utiliser, c'est aussi facile qu'utiliser un casque Bluetooth. On peut régler le son comme avec un casque.
      • inconvénient : il ne faut pas être loin de la tablette, et loin, c'est quand même assez proche…
    • [^] # Re: Tablette pour faire du son

      Posté par  . Évalué à 4.

      Hello, une tablette sur laquelle on peut installer Ubuntu?
      Peux tu partager le modèle ?
      Merci!

      • [^] # Re: Tablette pour faire du son

        Posté par  . Évalué à 4. Dernière modification le 06 octobre 2019 à 19:12.

        C'est une airis kira slimpad. Elle est vieille et probablement plus vendue depuis longtemps.

        Je ne la conseille pas pour les raisons suivantes :

        • le port HDMI est gérée par une puce chrontel, dont le pilote est libre mais n'est pas supporté sous GNU/Linux. Je crois me souvenir qu'on pouvait le compiler et que ça marchottait, je ne sais mas si ça fonctionne encore. Ça marche probablement sous Android ou ChromeOS mais je n'ai pas testé
        • le capteur lumineux règle la luminosité. C'est chiant et ça se désactive en ligne. La désactivation tient jusqu'à redémarrage pas propre de la tablette ou une perte totale de courant. Ça se corrige facilement, cependant.
        • le SSD est très lent
        • l'écran tactile se bloque de temps à autres. Il faut arrêter de le toucher pendant 5-10 secondes et ça revient tout seul
        • 1 Gio de mémoire vive est trop limite.
        • elle est aussi rapide et a autant d'autonomie qu'un netbook moyen de l'époque. C'est à dire, rien de transcendant. En particulier, la navigation internet peut être un peu fastidieuse.

        Mais sa prise en charge de GNU/Linux est autrement excellente et pour une utilisation ciblée, elle fait le job. Pour une utilisation nomade aujourd'hui… Oublie.

  • # 1 seul Haut parleur

    Posté par  (site web personnel) . Évalué à 2.

    Sais tu si il y a moyen de declarer le Raspberry comme un peripherique Mono ?

    En effet je n'ai qu'un seul haut parleur et si je peux faire l'envoi du flux comme un seul signal depuis les telephones et autres clients plutot que de faire du traitement du signal pour faire du stereo2mono ça m'arrange.

  • # Récepteur Bluetooth

    Posté par  (site web personnel) . Évalué à 2. Dernière modification le 06 octobre 2019 à 20:30.

    Merci pour ce journal intéressant.

    Par contre tu as quand même investi dans un DAC adapté au zero pour ça. De ce que je comprend tu utilises surtout le Bluetooth. Est ce que ça apporte vraiment quelque chose en plus qu'un bête récepteur Bluetooth à 15€?
    Dans ta config, tes PC partagent le son via Wi-Fi, mais ça pourrait très bien se faire par Bluetooth.

    Un LUG en Lorraine : https://enunclic-cappel.fr

    • [^] # Re: Récepteur Bluetooth

      Posté par  . Évalué à 3. Dernière modification le 06 octobre 2019 à 21:36.

      Je pense que le DAC, c'est pour générer un bien meilleur signal audio vers l'ampli analogique, pas pour la réception! Je vois notamment qu'ils ont mis un gros condensateur sur la carte son pour être sûrs que le signal n'est pas affaibli par manque de jus sur les grosses basses.

      ⚓ À g'Auch TOUTE! http://afdgauch.online.fr

      • [^] # Re: Récepteur Bluetooth

        Posté par  (Mastodon) . Évalué à 4.

        le condo pour les basses c'est après amplification. ici on est encore dans des courants faibles :)

        sûrement un filtrage de l'alim du PiZero ?

        En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

        • [^] # Re: Récepteur Bluetooth

          Posté par  (site web personnel) . Évalué à 4.

          Je penche aussi beaucoup plus pour le filtrage des parasites du PI. L'informatique génère des courants assez crade avec l'utilisation massive de la masse pour tout et n'importe quoi.

          J'ai installé un orange Pi + DAC à l’intérieur d'un ampli (comme cela, pas de problème de décoration). Et quand il n'y a pas de son, je n'arrives pas à me débarrasser de tout petits craquements, que l'ampli chope du Pi. Ce n'est pas des parasites électriques classique, ça ne ronronne pas le 50hz. c'est vraiment caractéristique.

          • [^] # Re: Récepteur Bluetooth

            Posté par  (site web personnel) . Évalué à 4.

            Il y a une revue du DAC qui m'a beaucoup influencée dans l'achat. Le constructeur intervient dans les commentaires et explique ses choix. (La revue commence sur une version antérieure du matériel, puis évoque les changements apportés par la version actuelle de la carte).

            De mon côté, je n'ai aucun souffle, aucun bruit, les enceintes sont vraiment silencieuses dès que le son est coupé. (Il y a une petite LED qui reste allumée sur la carte un peu de temps après que la musique ait cessée, mais je n'entend aucune différence au niveau des enceintes.)

      • [^] # Re: Récepteur Bluetooth

        Posté par  (site web personnel) . Évalué à 1.

        Je pensais à un appareil Bluetooth fait pour être connecté à une Chaine hi-fi, tout-en-un, pas juste une clé Bluetooth.

        Un LUG en Lorraine : https://enunclic-cappel.fr

        • [^] # Re: Récepteur Bluetooth

          Posté par  (Mastodon) . Évalué à 2.

          Sur mon pi zero w + hat hifiberry le son était meilleur sans souffle ni bruit parasites que sur le dac bluetooth philips Mais je ne l'utilisais pas comme recepteur bluetooth, uniquement wifi/airplay et surtout volumio.

          Par contre il existe de très bons dac bluetooth, comme le arcam miniblink mais ils sont un un peu plus chers.

          Je doute que ceux à 15€ aient une qualité correcte.

        • [^] # Re: Récepteur Bluetooth

          Posté par  (site web personnel) . Évalué à 3.

          En fait, aucun de mes PC n'a de connexion sans fil, le wifi sert seulement entre la box et le raspberry pi. J'utilise donc surtout pulseaudio, le bluetooth est un peu une cerise sur le gâteau, si j'ai envie de m'écouter de la musique en prenant mon petit-dej sans avoir à allumer le PC…

          Sinon j'avais déjà un récepteur bluetooth, que j'ai mentionné dans le journal (sans mettre de lien pour ne pas de faire de pub). Le problème étant qu'il me mange une entrée son sur l'ampli, et je crois me souvenir que seul une source peut être connectée à la fois (le problème est le même avec le pi0, mais comme j'utilise surtout pulseaudio le problème se pose moins). Au niveau de la qualité, le son était similaire sur une sortie standard intégrée à un PC.

          Avec la carte, c'est vraiment le jour et la nuit, pour avoir testé avec un morceau que je connaissais bien, j'ai entendu des détails que je n'avais jamais entendu jusqu'alors. Il y avait vraiment du volume dans la musique. Je veux pas m'appesantir davantage car je ne suis pas compétent pour évaluer la qualité, je peux juste dire que subjectivement, j'ai vraiment redécouvert ma musique.

  • # Simple et instructif, merci !

    Posté par  (site web personnel) . Évalué à 1. Dernière modification le 07 octobre 2019 à 13:17.

    Merci pour ce retour d’expérience !

    Si quelqu’un a une solution open-source pour la même chose en audio+vidéo, ça m’intéresse ; le but serait de lire une vidéo ou parcourir des photos sur le téléphone Android, et de voir ça sur grand écran via un PC Linux.

  • # Imprimante ?

    Posté par  . Évalué à 4.

    sudo usermod -a -G lp pulse
    

    lp c'est le groupe qui a le droit d'utiliser les imprimantes… c'est nécessaire pour recevoir le son via bluetooth ?

    • [^] # Re: Imprimante ?

      Posté par  (site web personnel) . Évalué à 7.

      En fait oui, et c'est vraiment un truc que j'aurai pas trouvé tout seul. La conf est gérée par dbus, dans le fichier /etc/dbus-1/system.d/bluetooth.conf et l'on y trouve les lignes suivantes :

        <!-- allow users of lp group (printing subsystem) to 
             communicate with bluetoothd -->
        <policy group="lp">
          <allow send_destination="org.bluez"/>
        </policy>
      

      Va savoir pourquoi…

      • [^] # Re: Imprimante ?

        Posté par  . Évalué à 1.

        Il doit bien exister des imprimantes bluetooth :)

  • # Nokia N900

    Posté par  . Évalué à 1.

    Oh, génial. J'ai fait quelque chose de similaire mais en utilisant un Nokia N900 et son émetteur FM. Le désavantage avec ma solution c'était l'impossibilité d'utiliser le Bluetooth comme récepteur, mais je vais réessayer avec ta méthode.

    Par contre ce qui me pousse à rester sur le Nokia N900, c'est la présence d'un émetteur infrarouge. Avec LIRC, c'est le top et je peux manipuler ma chaîne Hi-Fi depuis n'importe quel appareil configuré préalablement.

  • # Questions materielles

    Posté par  . Évalué à 1.

    Bonjour,

    merci pour ce tuto, c'est une super idée, et je n'y avais pas pensé.

    J'ai vu qu'un HAT avait ete rajouté, est-ce que les ports GPIO restent disponibles ?

    Je suis en train de créer une Webradio a base de PI3, et pas mal de GPIO sont deja pris ( ecran epaper, bouton, etc..)

    Je cherche pour cette WebRadio un module (au sens large) qui me permette d'amplifier la sortie son, quelqu'un peut-il me conseiller  ? Je voudrais autant de puissance qu'un radio-CD transportable, si vous voyez un peu…

    Merci d'avance
    Olivier

    • [^] # Re: Questions materielles

      Posté par  (site web personnel) . Évalué à 2.

      Il n'y a pas d'information sur la carte pour le pi-zero, mais ont peut trouver les infos pour la carte adaptée au raspberry pi standard (Boss 1.2 DAC Tech Manual), seuls les ports suivants seraient utilisés :

      • 3 : SDA1-I2C
      • 5 : SCL1-I2C
      • 12 : I2S_BCLK
      • 31 : GPIO6/DMUTE
      • 35 : I2S_LRCLK
      • 40 : I2S_DOUT

      Je n'ai pas testé, le plus simple serait de leur demander directement.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.