# Lyrion — Diffuser une source externe _Guide de reconstruction. Il décrit comment faire entrer dans Lyrion Music Server un son qui ne vient pas de la bibliothèque : une entrée audio du serveur, ou le son d'un autre ordinateur du réseau._ **Référence : Lyrion Music Server 9.1.2 – WaveInput 1.04 – Ubuntu 24.04** **Le fichier `.md` de cette page :** [ouvrir le `.md`](https://blog.infolaf.ca/wp-content/uploads/fichiers/guide-lyrion-sources-externes-public.md) **Ce que cette page couvre :** brancher une source sonore extérieure sur Lyrion et la jouer sur n'importe quelle platine de la maison. Trois voies sont décrites : capturer une carte son du serveur, diffuser un flux permanent, et envoyer le son d'un poste de travail. **Convention : chaque bloc indique la machine où il s'exécute**, à l'extérieur du bloc. Un bloc unique se copie tel quel ; des blocs séparés signifient qu'une décision ou une manipulation intervient entre eux. --- ## Ce que fait cette page, et ce qui est ailleurs Lyrion sait jouer trois choses : les fichiers de sa bibliothèque, les services en ligne, et **une adresse quelconque qu'on lui donne**. C'est cette troisième capacité qui sert ici. Une source externe est donc toujours ramenée à une adresse. Il y en a deux familles : - **Une capture faite par le serveur lui-même** — une entrée audio branchée sur la machine, lue par le greffon WaveInput, et désignée par une adresse `wavin:`. - **Un flux HTTP servi par une machine du réseau** — le serveur va le chercher comme il irait chercher une radio web. Peu importe qui le produit. Trois pages voisines portent le reste : - **[Lyrion Music Server](https://blog.infolaf.ca/wiki/lyrion-music-server/)** — le serveur lui-même, sa bibliothèque, ses greffons, ses journaux. - **[Les platines Squeezelite](https://blog.infolaf.ca/wiki/les-platines-squeezelite/)** — ce qui joue le son dans chaque pièce. - **[Icecast2 – Ices2](https://blog.infolaf.ca/wiki/icecast2-ices2/)** — le serveur de diffusion et ses sources. Il est propriétaire de tout ce qui concerne Icecast ; cette page-ci n'en reprend rien et s'y réfère. ℹ️ **L'inverse — écouter le serveur depuis un lecteur ordinaire, ailleurs — ne passe pas par le serveur lui-même.** Son point d'accès `:9000/stream.mp3` répond et réclame une authentification, mais il ne porte aucun son et n'ajoute aucune platine. Pour écouter hors de la maison, ce sont les applications mobiles décrites dans *Les platines Squeezelite* qui servent, à travers le tunnel. --- ## Ajouter une entrée Le geste est le même pour les trois voies, et il est donc écrit une seule fois. `[dans Lyrion]` Ouvrir **Favoris**, puis le bouton en forme de **cœur portant un `+`**, en haut à droite de la liste. Une fenêtre *Modifier le favori* s'ouvre avec trois champs : - **Nom** — ce qui s'affichera dans la liste. - **URL** — l'adresse de la source. C'est le seul champ qui décide de quelque chose. - **Icône** — facultatif. Le favori apparaît aussitôt dans la liste et se joue comme n'importe quelle piste : on choisit la platine, on clique. ℹ️ **Le champ Icône n'a pas de sélecteur de fichier** : on y tape un chemin, et l'image doit déjà se trouver dans l'arborescence `html` du serveur. Le serveur en fournit une qui convient à une source en continu : ``` html/images/radio.png ``` ⚠️ Une image ajoutée à la main dans cette arborescence n'appartient pas au paquet du serveur. Elle survit aux montées de version ordinaires, mais rien ne le garantit — en garder une copie ailleurs. **Ce qui fait la différence avec une liste de lecture enregistrée** : un favori est une adresse nommée, immédiatement rejouable, et modifiable sans être rechargée. C'est la forme à employer pour une source permanente. --- ## Capturer une carte son du serveur C'est la voie la plus directe : ce qui entre par une prise du serveur ressort sur les platines. ### Le greffon WaveInput Le serveur ne sait pas lire une carte son tout seul. Le greffon **WaveInput** ajoute le protocole `wavin:` et s'en charge. Il ne fait pas partie des greffons livrés avec Lyrion : il vient d'un dépôt tiers, dont l'adresse s'ajoute à la liste des dépôts dans les réglages des extensions. ``` http://www.herger.net/slim-plugins/repo.xml ``` Une fois le dépôt déclaré, WaveInput apparaît parmi les extensions installables. Le serveur redémarre après l'installation. **Ce que le greffon fait réellement**, et qu'il vaut mieux savoir avant de chercher une panne ailleurs : il n'est qu'une enveloppe autour d'`arecord`. Son fichier de conversion porte la ligne qui travaille, et `$FILE$` y est remplacé par ce qui suit `wavin:` dans l'adresse. ⚠️ **Ligne longue** — elle sera enroulée dans le PDF, et ne se recopie pas depuis lui. ``` [arecord] -d0 -c2 -f S16_LE -r 44100 -twav -D $FILE$ | [lame] --silent -q $QUALITY$ -v $BITRATE$ - - ``` Il existe la même en FLAC plutôt qu'en MP3. Dans les deux cas, **44 100 Hz, 16 bits, deux canaux sont écrits en dur dans le greffon** : aucun réglage ne les change. Une source d'une autre fréquence est rééchantillonnée par la carte, pas par le serveur. ℹ️ `lame` et `flac` doivent donc être présents sur le serveur — ce sont les encodeurs du greffon, pas ceux de Lyrion. ### Trouver le nom de la carte `[nas-host]` ```bash arecord -l ``` Chaque carte y porte un numéro **et** un nom entre crochets : ``` card 0: PCH [HDA Intel PCH], device 0: ALC888-VD Analog [ALC888-VD Analog] card 1: CODEC [USB Audio CODEC], device 0: USB Audio [USB Audio] ``` 🔴 **C'est le nom qu'on écrit, jamais le numéro.** Le numéro dépend de l'ordre d'énumération au démarrage et change dès qu'un périphérique USB est branché, débranché, ou simplement plus lent à répondre. Une adresse en `hw:1,0` cesse un jour de désigner ce qu'on croyait, sans message et sans qu'on sache pourquoi. `hw:CARD=CODEC,DEV=0` désigne toujours la même carte. La liste des formes que le nom peut prendre : ```bash arecord -L ``` ### L'adresse à écrire Pour la carte son USB : ``` wavin:hw:CARD=CODEC,DEV=0 ``` Pour l'entrée ligne de la carte mère : ``` wavin:default ``` ℹ️ `default` sans nom de carte retombe sur la première carte du système. En l'absence d'un `/etc/asound.conf` qui en décide autrement, c'est la carte intégrée — **pas** la carte USB, même si celle-ci est la seule qui serve. Ces adresses se collent dans le champ **URL** d'un favori, exactement comme une adresse `http://`. ### Pourquoi une carte son USB plutôt que l'entrée de la carte mère L'entrée ligne de la carte mère fonctionne et ne coûte rien. Elle a pourtant été abandonnée ici, et la raison vaut d'être connue avant de refaire le montage : **elle ronfle**. Deux appareils reliés au même secteur par des alimentations distinctes, puis reliés entre eux par un câble audio, forment une boucle de masse ; le ronflement qui en résulte est présent en permanence et ne se règle par aucun niveau. Une carte son USB isole l'étage d'entrée du reste de la machine et supprime le problème. C'est donc un choix de montage, pas un accident : **on capture par une carte son USB**, et l'entrée de la carte mère reste disponible pour un appareil qui ne poserait pas ce problème. ### Le matériel employé Un dongle USB à puce **Texas Instruments PCM2902**, le composant le plus répandu de sa catégorie. Il présente une entrée et une sortie analogiques, et se nomme `CODEC` pour ALSA. ```bash lsusb | grep -i audio ``` ⚠️ **Ce dongle n'a aucun réglage de capture.** Son gain d'entrée est figé dans le matériel : il n'y a rien à démuter ni à monter, et cette piste est à écarter d'emblée en cas de silence. --- ## Le flux permanent La capture directe a une limite : elle n'existe que pendant qu'une platine la joue. Dès qu'on arrête la lecture, plus rien ne capture. Quand la source doit être **disponible en permanence**, on la diffuse plutôt en continu vers un serveur Icecast, et Lyrion vient l'y chercher comme une radio : ``` http://192.168.0.11:8000/Chromecast.ogg ``` Trois raisons de préférer cette voie : - **Un repli d'alarme ne fonctionne que si la source est déjà en ondes** — une platine bascule en une fraction de seconde et n'attend pas qu'une capture démarre. - **Plusieurs platines peuvent écouter la même source sans se gêner**, ce que l'accès direct à une carte interdit. - **La source survit à l'arrêt de la lecture**, donc on la retrouve telle quelle. Le montage complet — serveur Icecast, client source `ices2`, unité systemd, métadonnées, dépannage — est décrit dans **[Icecast2 – Ices2](https://blog.infolaf.ca/wiki/icecast2-ices2/)**. Du point de vue de Lyrion, il n'y a rien à faire d'autre que coller l'adresse du point de montage dans un favori. --- ## Une seule chaîne par carte 🔴 **Une carte son ne se capture que par un seul programme à la fois.** L'accès `hw:` d'ALSA est exclusif, et il n'y a pas de partage possible : la carte annonce alors zéro sous-périphérique libre. ```bash arecord -l ``` ``` card 1: CODEC [USB Audio CODEC], device 0: USB Audio [USB Audio] Subdevices: 0/1 ``` La conséquence est directe et prend au dépourvu : **si la même carte alimente à la fois un flux Icecast permanent et une entrée `wavin:`, les deux ne peuvent pas jouer ensemble.** Lancer la capture directe coupe le flux permanent. ### Savoir qui tient la carte `[nas-host]` ```bash sudo fuser -v /dev/snd/pcmC1D0c ``` Le nom du périphérique se lit ainsi : `pcmC1D0c` = carte 1, périphérique 0, *capture*. La réponse nomme le compte, le PID et le programme : ``` USER PID ACCESS COMMAND /dev/snd/pcmC1D0c: hostadmin 31096 F...m ices2 ``` 🔴 **C'est le seul contrôle qui dise la vérité, et l'état du service ment.** Un service de diffusion configuré pour se relancer indéfiniment se déclare `active` alors qu'il échoue à chaque tentative : la relance périodique fait qu'il est presque toujours en train de démarrer. Son journal, lui, est sans ambiguïté. ⚠️ **Ligne longue** — elle sera enroulée dans le PDF. ``` EROR input-alsa/alsa_open_module Failed to open audio device hw:CARD=CODEC,DEV=0: Device or resource busy ``` ```bash sudo journalctl -u ices2-chromecast -n 12 --no-pager ``` ### Libérer la carte La capture s'arrête quand la platine cesse de lire — mais **ni la pause ni le bouton de lecture ne suffisent**. Cette interface n'a pas de bouton *Arrêt*, et une pause laisse le flux ouvert : `arecord` continue de tenir la carte. Deux gestes libèrent réellement : - **vider la file d'attente** de la platine qui joue la capture ; - ou **éteindre cette platine**, ce qui coupe sa connexion. ✅ Une fois la carte libre, le service de diffusion la reprend **de lui-même** à sa tentative suivante. C'est ce que garantissent le `Restart=always` et le `StartLimitIntervalSec=0` de son unité — rien à relancer à la main. ⚠️ Vérifier qu'aucune **autre** platine ne joue encore la capture avant de conclure à une panne : une seule suffit à retenir la carte. --- ## Diffuser le son d'un poste de travail Cette voie répond à une autre question : envoyer dans la maison ce que joue un ordinateur — une vidéo, un site, une application sans sortie réseau. Le poste capture sa propre sortie audio, l'encode, et la sert sur une adresse que Lyrion vient lire. VLC fait les trois d'un coup, et il n'y a rien à installer sur le serveur. ### Trouver le moniteur à capturer Sous PipeWire comme sous PulseAudio, chaque sortie possède une **source-moniteur** qui porte ce qui en sort. C'est elle qu'on capture. `[poste de travail]` ```bash pactl list short sources ``` La bonne est celle dont le nom finit par `.monitor` et dont l'état est **RUNNING** — c'est la sortie qui joue réellement. Les autres appartiennent à des sorties en veille, typiquement les prises HDMI de la carte graphique. ``` alsa_output.pci-0000_04_00.6.HiFi__hw_Generic_1__sink.monitor ``` ℹ️ Ce nom est propre à la machine et à sa carte : il se relève, il ne se recopie pas d'un poste à l'autre. ### La commande VLC est ici installé en Flatpak, d'où l'invocation par `flatpak run`. La fenêtre reste ouverte pendant toute la diffusion ; la quitter arrête la diffusion. ⚠️ **La troisième ligne dépasse la largeur du PDF** et y sera enroulée sans signe visible. La recopier depuis le `.md`, pas depuis le PDF. `[poste de travail]` ```bash flatpak run org.videolan.VLC \ "pulse://alsa_output.pci-0000_04_00.6.HiFi__hw_Generic_1__sink.monitor" \ --sout "#transcode{vcodec=none,acodec=mp3,ab=192,channels=2,samplerate=48000}:http{dst=:8079/desktop.mp3}" \ :sout-keep ``` Ce que chaque morceau fait : - **`pulse://…monitor`** — la source : ce que le poste joue. - **`vcodec=none`** — aucune vidéo, même si la source en portait. - **`acodec=mp3,ab=192`** — encodage MP3 à 192 kb/s, que toutes les platines lisent. - **`samplerate=48000`** — la fréquence native de PipeWire sur ce poste. La demander identique évite un rééchantillonnage qui n'apporte rien ; sur un poste qui tourne à 44 100 Hz, c'est 44 100 qu'on écrit. - **`http{dst=:8079/desktop.mp3}`** — le serveur HTTP que VLC ouvre. Le port est arbitraire ; il doit seulement être libre. - **`:sout-keep`** — garde la sortie ouverte entre deux pistes, pour que les auditeurs ne soient pas déconnectés à chaque changement. ### L'adresse à donner à Lyrion L'adresse porte celle **du poste**, pas celle du serveur : ``` http://192.168.0.106:8079/desktop.mp3 ``` Elle se colle dans le champ URL d'un favori, comme les précédentes. 🔴 **Ne pas jouer ce favori sur la platine logicielle du poste lui-même.** Cette platine sort par le périphérique dont on capture le moniteur : elle renverrait dans la capture ce que le serveur vient de lui envoyer, et la boucle s'emballe. Choisir une platine d'une autre pièce. ### Vérifier sans écouter `[poste de travail]` ```bash ss -tln | grep ':8079' ``` Une ligne en `0.0.0.0:8079` signifie que le port est ouvert **sur le réseau** — condition nécessaire pour que le serveur vienne y lire. Puis lire quatre secondes du flux : ```bash curl -s --max-time 4 -o /tmp/essai.mp3 http://127.0.0.1:8079/desktop.mp3 ls -l /tmp/essai.mp3 ``` Attendu : de l'ordre de 90 kio, cohérent avec 192 kb/s pendant quatre secondes. ℹ️ **La taille prouve que la chaîne monte, pas qu'elle porte du son.** L'encodeur traite le silence au même débit que la musique. Pour savoir s'il y a du son, il faut écouter. --- ## Dépannage ### La chaîne est montée et je n'entends rien C'est le symptôme le plus fréquent, et le plus trompeur : chaque étape paraît saine, parce que **rien ne distingue le silence du son** dans une chaîne numérique. Procéder du moins coûteux au plus coûteux. **1. Changer d'application source.** Gratuit, instantané, et c'est le maillon hors de la machine qu'on oublie. Une application qui affiche une lecture en cours n'émet pas forcément. **2. Jouer la source sur une autre platine.** Si elle sort ailleurs, le problème est dans la platine, pas dans la source. **3. Écouter le flux directement**, sans passer par Lyrion : ouvrir son adresse dans un lecteur ordinaire. Silence ici, la capture ne reçoit rien. **4. Mesurer le signal à l'entrée** avec un vumètre. L'accès `hw:` étant exclusif, il faut d'abord libérer la carte — donc arrêter ce qui la tient. `[nas-host]` ```bash arecord -D hw:CARD=CODEC,DEV=0 -f cd -d 15 -V stereo /dev/null ``` Des barres plates pendant quinze secondes : aucun signal n'entre, et le problème est physique — câble, source, ou dongle. ### Une entrée refuse de jouer Presque toujours la carte déjà prise par autre chose. Le contrôle est celui décrit plus haut : `fuser` sur le périphérique de capture, et non l'état du service. ### Le son continue après l'arrêt Une platine lit avec de l'avance : elle continue de jouer quelques instants après qu'on a arrêté. Cela ne dit rien sur l'état de la capture, qui peut aussi bien tourner encore — seule la lecture du périphérique tranche. ### La platine a disparu de la liste des lecteurs 🔴 **Couper la source pendant qu'une platine la joue fait disparaître cette platine de la liste**, et elle ne revient pas d'elle-même — ni au bout d'un moment, ni au rafraîchissement de la page, ni à la réouverture du navigateur. Ni la machine ni le serveur ne sont en cause : l'interface de la platine répond normalement, et le serveur garde sa fiche. C'est le lecteur qui reste figé sur un flux qui ne répond plus. ⚠️ **Redémarrer le lecteur seul ne suffit pas, et c'est le piège.** La platine réapparaît dans la liste, ce qui donne l'impression que l'affaire est close — mais elle reste incapable de jouer quoi que ce soit. **Seul un redémarrage complet de la platine la remet en service.** Une platine revenue dans la liste n'est donc pas une platine qui fonctionne : le contrôle qui tranche est une lecture, jamais une apparition dans un menu. La page *Informations* du serveur ne répond pas davantage à cette question. Elle liste les appareils que le serveur a identifiés, pas ceux qui sont connectés : une platine absente de la liste des lecteurs y figure encore, avec son modèle, son micrologiciel et son adresse. Elle sert à vérifier une identité. **L'ordre qui évite le problème : arrêter la lecture d'abord, couper la source ensuite.** ℹ️ Une platine absente n'est pas une platine muette, et les deux se soignent différemment. Le dépannage des platines elles-mêmes est dans **[Les platines Squeezelite](https://blog.infolaf.ca/wiki/les-platines-squeezelite/)**.