Artisan Numérique

/système/audio/ Un serveur musical avec MPD

MPD est finalement assez peu connu et pourtant il répond au besoin récurrent qu'ont les mélomanes qui adorent donner une ambiance musicale à chacune de leurs pièces. L'objectif de ce tutoriel est de vous expliquer ce qu'est MPD, comment l'installer et comment l'utiliser au quotidien

Qu'est-ce que MPD ?

Comme vous le voyez sur le schéma ci-dessus, MPD (Music Player Daemon) est un lecteur audio très complet de type "démon". Entendre par là qu'il s'agit avant tout d'un serveur qui ne dispose d'aucune interface graphique. Pour accéder à ce serveur il vous faudra donc un client capable de lui parler. Et des clients, MPD en a des dizaines pour tous les goûts (client Web, application Android ou iOS, application de bureau pour Gnome ou même Windows, etc.).

Si l'on fait abstraction de l'absence d'interface graphique, MPD dispose de toutes les fonctionnalités que l'on est en droit d'attendre d'un lecteur audio :

  • prise en charge de nombreux formats (MP3, OGG, FLAC, etc.) ainsi que des formats en streaming (ex. web radios)
  • lecture des métadonnées (ex. ID3) des morceaux de votre audiothèque avec possibilité de recherche dans la base de données selon différents critéres,
  • sortie du sont sur ALSO, OSS, Jack ou Pulse, mais aussi en streaming (en mode "shoutcast", via Icecast ),
  • gestion des listes de lectures,

Et si l'on ajoute usage très très faibles des ressources systèmes, MPD devient l'outil idéal dés que vous avez besoin de sonoriser une pièce (salon, bureau, etc.) soit parce que vous y avez un petit serveur multimédia, soit juste pour permettre à tous d'interagir avec les morceaux en cours d'écoute.

Installation et configuration

Installation

MPD est sans aucun doute déjà dans votre distribution. Un coup d'apt-get install mpd (ou brew install mpd sous MacOS) devrait suffire à installer le serveur. Une fois le service installé, jetons un œil à sa configuration en commençant par l'essentiel, la source audio.

Déclaration des fichiers audio

Pour que MPD puisse fonctionner, il lui faut... de la musique et peu importe, ou presque, le format. MPD peut lire les fichier mp3, mp2, ogg, flac, wav, au, aiff, aif, mpc, amf, dsm, far, gdm, imf, it, med, mod, mtm, s3m, stm, stx, ult, uni et xm.

Ces fichiers doivent être accessibles en local par MPD. Si vous avez plusieurs instances, vous la placerez donc dans un dossier partagé, par exemple NFS ou CIFS. Dans la suite du tutoriel, nous partirons du principe que vos morceaux se trouvent dans le dossier /musique.

Commençons donc par éditer le fichier /etc/mpd.conf et repérerons un bloc ressemblant à ceci :

music_directory                 "~/music"
playlist_directory              "~/playlists"
db_file                         "/var/lib/mpd/mpd.db"

Il s'agit de tous les chemins dont a absolument besoin MPD pour fonctionner. La première ligne correspond au dossier des fichiers audio, nous remplaçons donc comme suit :

music_directory                 "/musique"

Déclaration du dossier de playlists

La seconde ligne correspond au dossier dans lequel MPD lit et écrit les listes de lectures (fichiers .m3u au format WinAmp). Comme il est sympa de pouvoir partager ces listes entre tous les serveurs MPD, le plus simple est de créer un sous-dossier /musique/mdp :

playlist_directory                 "/musique/mdp"

Déclaration du dossier de la base de données

Ensuite vient la base de donnée qui contiendra les chemins, les étiquettes, bref, tout ce que MPD découvrira dans le dossier /musique. Là aussi, il est pratique qu'elle soit partagé car ainsi la création et la mis à jour de cette base sur une machine, sera effective sur toutes les autres :

db_file                 "/musique/mdp/mdp.db"

Rendre vos fichiers accessibles à MPD

Maintenant la partie un peu funky. Un peu plus loin dans le fichier vous devez trouvez quelque chose comme cela :

user                            "mpd"

L'idée est que lancer MPD en tant que root, c'est comme croiser les flux, c'est mal. Donc à l'installation du paquet, un gentil utilisateur mpd bien inoffensif a été créé. Et en toute logique cette utilisateur là n'a aucun droit de lecture, et encore moins d'écriture dans votre dossier /musique. Sous Debian, cet utilisateur mpd appartient au groupe audio, de sorte à ce que si vous affectez ce groupe à tous le dossier /musique MPD doit logiquement pouvoir s'y retrouver.

Après selon le cas de figure (dossier musique partagé par exemple), les approches devront varier.Le point important à retenir est que l'utilisateur qui lance MPD puisse lire dans /musique et écrire dans /musique/mpd, et ce sur toutes les machines où il doit être lancé.

Déclaration des sorties Audio

MPD est conçu de sorte à pouvoir gérer en simultané plusieurs sorties audio. Il est donc possible avec plusieurs cartes audio de distribuer la même musique sur plusieurs pièces à partir d'un seul serveur. La majorité des clients MPD permettent d'activer ou de désactiver telle ou telle sortie à distance.

Une sortie MPD peut être une sortie ALSA ou OSS, un serveur Jack ou Pulse, ou encore un serveur de type ShoutCast. Cela laisse tout de même assez de lattitude :-)

Pour l'exemple, nous allons donc utiliser une toute classique périphérique audio en utilisant ALSA. Pour cela il faut aller jeter un oeil un peu plus loin dans le fichier de configuration et chercher les sections nommées audio_output. Si vous en avez aucune ou si elles sont toutes commentées, ajoutez ce qui suit, sinon vérifiez que ça ressemble un peu à cela :

 audio_output {
 type                    "alsa"
 name                    "Sortie vers Chambre"
}

Si je vous avez une deuxième carte audio, vous pouvez donc ajouter une seconde sortie :

audio_output {
  type                    "alsa"
  name                    "Sortie vers Buanderie"
  device                  "hw:0,1"
}

Notez le paramètre device qui indique que le tape sur le deuxième périphérique ALSA (le premier étant sous entendu dans la première sortie comme étant hw:0,0).

Dernier aspect, le contrôle du volume. Comme pour les sorties audio, vérifiez que les lignes suivantes existent, ne sont pas commentées et concordent bien :

  mixer_type                      "alsa"
  mixer_device                    "default"
  mixer_control                   "Master"

On utilise ici la table de mixage ALSA du périphérique par défaut (hw:0,0) dont on sélectionne le canal Master.

Paramétrage réseau

Dernière chose à faire : rendre notre serveur visible sur notre réseau local. Imaginons pour cela que notre machine ait pour adresse IP 10.0.0.10, nous modifierons donc la configuration dans ce sens :

  bind_to_address                 "10.0.0.10"
  port                            "6600"

Si vous êtes de grands paranoïaques ou si vous comptez "publier" MPD sur le réseau publique (pas une idée terrible ceci dit), il est aussi possible d'ajouter un mot de passe et des droits associés. Voir pour cela le paramètre password.

Démarrage du service

Reste maintenant à démarrer notre serveur par un /etc/init.d/mpd start et zouh, le lecteur MPD est lancé... dans le plus grand silence :-) Cela tombe bien car il reste encore une petite chose à faire.

Comme indiqué plus haut, MPD est capable de lire tous les attributs contenus dans les fichiers audio (ID3, vorbis, FLAC, etc) de sorte à constituer une base de donnée de recherche de morceaux qui sera utilisée lors de la navigation. A la première utilisation, il nous faut donc initialiser cette base de donnée. Pour cela, lancez la commande suivante :

mpd --create-db

MPD doit alors cracher un flot continu de texte listant les fichiers audio qu'il est en train de disséquer. Tout dépends de votre audiothèque, chez moi cette opération prend prés de 5 minutes. C'est une des raisons qui m'a amené à partager la base de données entre les différentes serveurs...

Notez cependant que cette opération n'est à réaliser qu'une seule fois. Par la suite il suffira d'une simple mise à jour de la base qui se fera par le biais du client MPD.

Les clients MPD

Maintenant que notre serveur est en route, il est temps de lui envoyer des commandes. Pour cela, il nous faut un client et là, le choix est vaste. Mais avant de commencer à en explorer quelques un, regardons de plus prés comment le serveur MPD cause avec ses clients.

Le protocole MPD

MPD est un simple serveur Telnet... Pour s'en convaincre, essayez ceci :

roottelnet mon_serveur_mpd 6600
Trying 10.0.0.10...
Connected to mon_serveur_mpd (10.0.0.10).
Escape character is '^]'.
OK MPD 0.13.0
ping
OK
list album
Album: #51
Album: 7th Ave. Stroll
Album: A Clockwork Orange
Album: A Day Without Rain
...
OK
close
Connection closed by foreign host.

Avec un protocole aussi trivial, on comprend mieux qu'il existe une librairie MPD pour à peu prés tout les langages. Pour ceux que cela intéresse le protocole est complètement documenté ici.

Clients en ligne de commande

Pour les fanatiques de la console (dont je fais parti :-) et du scripting, nous avons mpc qui est un client en ligne de commande. Cet outil est fabuleux pour écrire de nouvelles fonctionnalités.

Par exemple, imaginons que vous entendiez une musique bien sympathique remonter de la chambre où se prépare votre moitié. Vous, dans le salon, vous vous dites Hum, sympa, ce qu'elle écoute, je vais le mettre ici :

#! /bin/sh

  # on définit le nom de la machine où tourne le serveur source
  export MPD_HOST=$1

  # on récupère la piste en cours de lecture


  track=$(mpc | grep playing | awk '{print $2}' | cut -d"/" -f 1 | tr "#" " ")

  # on récupère la position dans la piste
  position=$(mpc | grep playing  | awk '{print $3}' | cut -d "/" -f1)

  # on vire une éventuelle liste de lecture "tmp"
  mpc rm tmp

  # on sauve la liste de lecture en cours dans "tmp"
  mpc save tmp

  # on se place maintenant sur le serveur cible
  export MPD_HOST=$2

  # on vire la liste de lecture en cours
  mpc clear

  # on charge la liste "tmp" créée plus haut
  mpc load tmp

  # on sélectionne le morceau
  mpc play $track

  # et on se déplace sur la position, la lecture démarre...
  mpc seek 00:$position
/usr/bin/synchronize-mpd.sh

Et voilà, il suffit alors de lancer

synchronize-mpd.sh serveur_chambre serveur_salon

Et hop, les deux serveurs sont synchronisés sur la même liste, lisent le même morceau à la même position. Des petits délires de ce genre, vous pouvez en trouver des tonnes ici.

Pour une version plus "graphique", il existe aussi d'excellents clients nCurse (cf. photo)

Clients graphiques

Autant j'aime bien la ligne de commande, autant pour éditer une playlist on a trouvé tout de même mieux depuis. Il existe de nombreux clients graphique mais j'affectionne particulière Sonata conçu pour Gnome/GTK2 et qui est dispo en standard sur toute distribution un peu étoffée.

Avec Sonata, mais c'est vrai pour la majorité des clients, toutes les opérations MPD sont disponibles, de l'exploration des morceaux à la constitution de la liste de lecture courante, son stockage sur le disque, etc. Sonata rivalise avec Rythmbox en téléchargeant les paroles, les pochettes, etc.

La première chose à faire pour utiliser Sonata, et c'est le cas pour tous les clients qui suivent, est de se connecter au serveur MPD. Pour cela, il suffit de faire sur l'interface un click-droit/préférences... pour, dans l'onglet serveurs, ajouter vos différents noms de machines hébergeant une instance de MPD. Ceci fait, il suffit de refaire un click-droit/connexion et de sélectionner le serveur que l'on cherche à contrôler. Le reste est suffisamment proche d'un lecteur audio classique pour que vous vous en sortiez sans problèmes.

Pour plus de clients graphiques, allez ici...

Les clients mobiles

Bien évidemment les applications mobiles ne sont pas en reste et permettent de transformer vos smartphones en télécommande WIFI de luxe. On en trouve pour toutes les plateformes (android, iOS, Windows Phone, etc.) et de tout les styles. Là je n'ai pas de grand conseil à donner, elles se valent toutes plus ou moins. Pour ceux qui ont plusieurs serveurs MPD, vérifiez juste que celle que vous choisissez permet de basculer d'un serveur à l'autre.

Écouter la radio

Il est possible avec MPD d'ajouter des fichiers qui ne sont pas sur le serveur local mais sur un serveur HTTP. C'est typiquement le cas des listes de lecture et flux des webRadios. Prenons l'exemple de Nashville Edge dont l'URL est http://streaming.radionomy.com/NashvilleEdge.

Allez dans votre dossier /musiques/playlists et ajoutez un fichier radios.m3u contenant ceci :

#EXTM3U
http://streaming.radionomy.com/NashvilleEdge

Ensuite il ne vous reste plus qu'à vous connecter sur le serveur avec Sonata et à double-clicker sur la liste radios pour y accéder.

Et avec mpc, vous feriez comme ceci :

export MPD_HOST=mon_serveur_mpd
mpc clean
mpc load radios
mpc play

Conclusion

Partant d'une définition très simple de "serveur musicale contrôlable à distance", MPD a permis le développement d'un écosystème d'une rare richesse. Et tant que l'on reste dans le cadre de ce pour quoi ce serveur est fait, il est difficile de ne pas trouver client à son pied, ou de ne pouvoir le scripter pour un comportement particulier. C'est bien simple, aujourd'hui MPD est tellement rentré dans notre quotidien que personne ici ne pourrait plus s'en passer.