# Freebox et machines virtuelles : un serveur de son de qualité audiophile Les notes ci-dessous s'appliquent principalement à la création d'un serveur **mpd** sur une machine virtuelle Debian, dans une Freebox Ultra, mais elles s'appliquent aussi à la création d'un serveur sur une machine physique, par exemple un Raspberry, parfaitement adapté. L'installation sur la machine virtuelle est un peu plus complexe. Les freebox ultra permettent l'installation de machines virtuelles linux et l'ajout, nécessaire ici, d'un disque NVMe. La box fait tourner un processeur ARM, et ce sont donc des versions ARM des systèmes linux qu'on peut installer comme VM. On part ici d'une VM Debian stable (bookworm au moment où ces lignes ont été écrites). Des VMs toutes prêtes peuvent être installées en quelques secondes depuis l'interface de la box. Insistons: un NVMe est nécessaire. Ici, on a mis un NVMe de 1 To. ## Préambule : motivations L'auteur possède une grande quantité de CDs audio ; il achète aussi des fichiers audio (chez Qobuz) de qualité largement supérieure aux CDs audio. Les CDs sont convertis en fichiers de format (voir plus bas) .flac, qui est aussi le format des fichiers achetés. L'installation audio comporte un convertisseur digital-analogique (DAC) qu'on peut attaquer par un câble USB. On copiera les fichiers audio sur une machine (virtuelle) qui accédera au DAC par le serveur **mpd**, logiciel -libre bien sûr- présent sur toutes les distributions Linux raisonnables? Le but est d'être "bit perfect", c'est à dire qu'aucune information ne doit être perdue entre les fichiers et le DAC (qualité audiophile). On rappelle que le format flac est un format de compression sans perte. ## La machine virtuelle La box est dotée d'un NVMe (1 To). Depuis le menu d'administration de la box (ultra) cliquer "machines virtuelles" et lancer la création. * J'installe une Debian stable * Je l'appelle _server_ * Je lui donne suffisamment de disque (300go) * Je copie ma clé ssh "pub". * J'active l'usb. * L'utilisateur s'appelle 'moi" En un instant la machine est créée. Repérer l'adresse ip de la machine (le menu l'indique) On peut alors faire `ssh moi@192...` (l'adresse ip de la machine). Ce n'est pas très pratique, mais on va améliorer ça. Une fois connecté, on peut faire `sudo` sans donner de mot de passe. _Je propose de donner un mot de passe à l'utilisateur ("moi" ici):_ ```` sudo -i passwd moi ```` _etc. Cela permet de se connecter à la machine depuis l'interface de la Freebox, sans passer par ssh: utile en cas de problème avec le firewall._ ### Installation des packages nécessaires La machine arrive avec très peu de choses installées. on fait: ```` sudo -i apt update apt full-upgrade ```` puis on installe les paquets ```` apt install mpd avahi-utils avahi-daemon ufw net-tools rsync alsa-utils usbutils apt clean && apt autopurge ```` * **mpd** bien sûr * **avahi-utils avahi-daemon** pour identifier la machine par son nom sur le réseau local. * **ufw** pour modifier le firewall (je ne suis pas bon dans ce domaine et ufw simplifie les choses) * le reste est plus ou moins utile (mais ça ne fait pas de mal). **rsync** servira. ### Configuration 1. **ufw** ```` ufw allow proto tcp to any port 6600 ufw allow proto udp to any port 6600 ```` Nécessaire pour mpd ```` ufw allow 5353 ufw allow 53791 ```` Nécessaire pour Avahi. 2. **Démarrer Avahi** ```` systemctl enable avahi-daemon.service systemctl start avahi-daemon.service ```` Ensuite depuis votre machine _client_ (celle sur laquelle vous travaillez) vous devez pouvoir faire: ```` ssh moi@server.local ```` si bien sûr la machine virtuelle s'appelle server, ce qui est quand même mieux que de donner l'adresse ip. 3. **Démarrer mpd** ```` systemctl enable mpd.service systemctl start mpd.service ```` Sur votre machine _client_ installez un client mpd: je suggère **cantata**. Dans les préférence de cantata, il y a possibilité de découvrir automatiquement le serveur mpd (glace à Avahi !). Si ça fonctionne, c'est bien, sinon mettez le nom de la machine virtuelle (ici server.local) ou son adresse ip et le port 6600. Bien sûr à ce stade mpd n'est pas configuré, mais cantata doit reconnaitre le serveur. Sinon, vous avez probablement un problème avec le firewall (redémarrer ufw peut être utile). ## Configurer mpd ### Sortie On utilise alsa. Voici le fragment correspondant de /etc/mpd.conf : ```` audio_output { type "alsa" name "My ALSA Device" ## device "hw:0,0" # optional # ... } ```` On verra plus loin qu'il faudra peut-être modifier la ligne "# device". Évidemment, à chaque mofification de /etc/mpdconf, il faut redémarrer le serveur mpd: ```` systemctl restart mpd.server ```` ### Considérations audiophiles On veut que le serveur mpd n'altère en rien le signal (être bit perfect). Par défaut, mpd n'est pas très bien configuré (`/etc/mpd.conf`): 1- On doit supprimer ce qui permet de gérer le volume sonore: si mpd le fait, il va dégrader le signal. C'est à l'ampli audio de faire ça. 2- mpd peut interpoler entre les valeurs numériques: ce n'est pas à lui de faire ça mais au DAC. Le faire dans mpd est au mieux sans intérêt mais plus probablement nocif : mpd projetés probablement par interpolation polynomiale, ce qui a de fortes chances de produire des oscillations lors des transitions rapides (les attaques sont particulièrement constitutives de la perception sonore : les perturber est très nocif). C'est connu sous le nom de phénomène de Gibbs. Les DACs ont développé des ruses de sioux pour s'en débarrasser : il faut donc leur laisser faire le travail, sauf peut-être avec un DAC médiocre. ## En route ! Depuis le client (cantata ou autre), on rappelle qu'il il faut indiquer le nom de la machine qui fait tourner mpd. Il arrive que Avahi propose directement la machine et le port; sinon,ici, la machine est __server.local__ et le port _6600_. Normalement, le client (cantata) doit pouvoir se connecter au serveur. Bien... il reste : 1. à fournir de la musique au serveur 2. à vérifier qu'un son sort et qu'il est de bonne qualité. ### La musique : Quelque part (sur ma machine principale, sur un NAS, etc..) mes fichiers .flac sont dans un répertoire. On peut rendre ce répertoire accessible à la machine virtuelle ou le recopier dans la machine virtuelle : c'est là que rsync sera utile. On peut aussi stocker les fichiers musicaux sur le disque NVMe de la box, en dehors de la machine virtuelle : lors de l'installation de la VM on peut activer un partage du disque sur la VM. Ça permet d'y accéder de partout sur le réseau local. Dans /etc/mpd.conf, indiquer le chemin vers le répertoire de la musique., Puis redémarrer mpd : ```` systemctl restart mpd.service ```` Dans Cantata, on doit maintenant voir le répertoire des enregistrements .flac. ### Les radios Il faut les décrire dans un ou plusieurs fichiers stockés à l'emplacement indiqué par "playlist_directory" dans /etc/mpd.conf On peut utiliser le format m3u. Un exemple de fichier est donné La liste des radios doit apparaitre dans le client (cantata). ### Autres sources Il est possible d'ajouter d'autres sources réseau: voir le fichier /etc/mpd.conf. ### Petite catastrophe, temporaire 1. Les CDs audio sont en 16 bits, 44 khz. 2. La radio (enfin celle que j'écoute) est en qualité 16 bits, 48 khz (mais ce n'est pas du flac !) 3. Mes enregistrements de qualité supérieure sont en 24 bits, 96 khz. La radio passe impeccablement, les enregistrements en 24 bits, 96 khz aussi, mais ceux en 16 bits, 44 khz produisent _d'affreux crachotements._ Après avoir consulté le support de mpd, aucune solution n'a été trouvée. Mais le 9 aout 2023, Debian Trixie est devenue la version stable de Debian. Une mise à jour de la VM (Bookworm) vers Trixie a résolu le problème, qui devrait donc disparaitre à l'avenir. ### Problème éventuel : pas de son Il faut bien sûr que votre DAC soint connecté à la prise usb de la box, que l'usb soit activé (ça se règle sur l'interface de la freebox), et que le DAC soit en marche ! On peut deviner l'identifiant de la carte son (= le DAC) en regardant le fichier /proc.asound/cards. On peuutiliser la commande aplay -l sur le serveur. Il faut alors modifier la ligne "device dans ```` audio_output { type "alsa" name "My ALSA Device" ## device "hw:0,0" # optional # ... } ```` qui deviendra quelque chose comme : ```` device "hw:1,0" ... et relancer mpd sur le serveur. On s'en sort facilement.