7

Feb

by Maniack Crudelis

MPD, Music Player Daemon, présente l'avantage de pouvoir tourner sur une machine distante et être exploité par divers clients sur d'autres machines.
Je l'utilise plus particulièrement sur mon serveur câblé aux enceintes pour centraliser la source audio quelque que soit l'ordinateur que j'utilise chez moi.

J'ai récemment été confronté à la problématique de jouer plusieurs sons en même temps, pour ajouter un son d'ambiance et des bruitages à une musique de fond. La solution a donc été de multiplier les instances de MPD.
Des instances multiples de MPD permettent aussi de diffuser plusieurs musiques en streaming selon les utilisateurs ou de diffuser sur plusieurs sorties distinctes.

Principe

MPD utilise plusieurs fichiers de configuration, placés par défaut dans ~/mpd. Il est possible lors du démarrage du serveur de lui spécifier son fichier de configuration principal, '/etc/mpd.conf' par défaut, duquel découle les autres fichiers de config.
Pour démarrer une seconde instance de MPD, il suffit de dupliquer son fichier de configuration ainsi que les autres fichiers de config associés et de le lui spécifier au démarrage.

Mise en œuvre

Tout d'abord, nous allons dupliquer le fichier de config principal pour créer une deuxième configuration.

sudo cp -a /etc/mpd.conf /etc/mpd2.conf

Ensuite nous allons dupliquer les autres fichiers de config présents dans /home

sudo cp -a ~/mpd ~/mpd2

Maintenant que nous avons 2 config distinctes, nous allons modifier le nouveau fichier de config pour lui faire correspondre son nouveau dossier et lui permettre de fonctionner séparément de la première instance.

sudo nano /etc/mpd2.conf
[...]
music_directory                "/DIR/votre_dossier_de_musique"
[...]
playlist_directory		"/home/USER/mpd2/playlists"
[...]
db_file			"/home/USER/mpd2/tag_cache"
[...]
log_file			"/home/USER/mpd2/mpd.
log"
[...]
pid_file			"/home/USER/mpd2/pid"
[...]
state_file			"/home/USER/mpd2/state"
[...]
port				"6601"
[...]
audio_output {
	type		"alsa"
	name		"My ALSA Device"
#	device		"hw:0,0"	# optional
#	format		"44100:16:2"	# optional
	mixer_device	"default"	# optional
	mixer_control	"PCM"		# optional
#	mixer_index	"0"		# optional
}
[...]
mixer_type			"software"
[...]

Ce qui donne en détail:

music_directory                "/DIR/votre_dossier_de_musique"

Le chemin absolu du dossier contenant la musique. Qui peut être différent ou non de celui de la première instance. Selon l'usage désiré.

playlist_directory		"/home/USER/mpd2/playlists"

Le dossier contenant les playlists de MPD. De préférence différent pour chaque instance.

db_file			"/home/USER/mpd2/tag_cache"

La base de données de MPD, elle peut être partagée entre plusieurs instances à condition que le dossier de musique le soit également.

log_file			"/home/USER/mpd2/mpd.log"

Le fichier de log de MPD.

pid_file			"/home/USER/mpd2/pid"

Le fichier contenant le PID de l'instance de MPD, il est impératif que ce fichier soit différent pour chaque instance.

state_file			"/home/USER/mpd2/state"

Le fichier de config utilisateur de MPD, il contient diverses informations sur les réglages de l'interface de MPD.

  • Le volume de la sortie audio.
  • Les sorties audio physiques.
  • Et éventuellement en streaming.
  • L'état actuel de la lecture.
  • Les différents mode de lecture.
  • Et enfin la playlist en cours de lecture.

Il est bien évidemment indispensable qu'il soit spécifique à chaque instance pour éviter qu'elles ne se marchent dessus.

port				"6601"

Le port de contrôle de MPD, par défaut il utilise le port 6000. Il faut en choisir un autre pour chaque nouvelle instance de MPD, le client choisira l'instance à contrôler par son port.

audio_output {
	type		"alsa"
	name		"My ALSA Device"
#	device		"hw:0,0"	# optional
#	format		"44100:16:2"	# optional
	mixer_device	"default"	# optional
	mixer_control	"PCM"		# optional
#	mixer_index	"0"		# optional
}

J'utilise alsa pour la lecture locale, il est important de garder 'device' commenté pour ne pas forcer alsa à communiquer directement avec la carte son. On veillera donc à décommenter 'mixer_device' pour que le son de MPD soit envoyé au serveur de son qui mixera l'ensemble avant l'envoi à la carte son.
La raison de cela est simple, si alsa envoi le son directement à la carte son, celle-ci ne pouvant gérer qu'un seul son à la fois, seule la première instance de mpd pourra émettre du son. Tandis qu'en passant par le serveur de son, il servira d'intermédiaire pour mixer l'ensemble des sons reçus avant l'envoi à la carte son. Ainsi, plusieurs instances de MPD peuvent cohabiter et diffuser chacun un son différent.

mixer_type			"software"

Dans le même esprit que le paramètre précédent. Pour assurer une saine cohabitation des différentes instances de MPD, le volume sonore doit pouvoir être réglé en préamplification sur chaque instance avant d'être envoyé à alsa qui gérera lui même le volume sonore général du système.

On utilisera donc alsamixer pour gérer le volume du système. Tandis que chaque instance de MPD gérera son volume propre.
Les 2 dernières modifications doivent être appliquées à toutes les instances de MPD pour être effectives, sinon l'instance ne respectant pas ce réglage prendra le pas sur les autres.

 

 

Notre fichier de configuration est maintenant prêt. On peut donc lancer la 2e instance de MPD.

mpd /etc/mpd2.conf

Voyons maintenant comment lancer les 2 instances de MPD au démarrage de la machine.

Lancement au démarrage

L'opération est simple, nous allons dupliquer le script de mpd dans init.d et lui
indiquer la 2e instance de mpd. Ceci nous permettra de démarrer 2 fois mpd, avec le fichier de configuration correspondant.

sudo cp -a /etc/init.d/mpd /etc/init.d/mpd2

Puis nous allons modifier le script pour lui indiquer la 2e instance de MPD.

nano /etc/init.d/mpd2
[...]
# Provides:          mpd2
[...]
# Short-Description: Music Player Daemon, 2e instance
[...]
NAME=mpd2
[...]
DESC="Music Player Daemon, 2e instance"
[...]
MPDCONF=/etc/mpd2.conf
[...]

Il est important de changer les occurrences de 'mpd' par 'mpd2' pour éviter un écrasement de la première instance par la seconde.
Et surtout, il faut bien penser à modifier l'emplacement du fichier de config, ici '/etc/mpd2.conf'

Nous allons ensuite enregistrer le nouveau script de démarrage à l'aide de la commande update-rc.d

sudo update-rc.d mpd2 defaults

Ceci fait, un redémarrage de la machine suffira pour que les 2 instances de MPD soit lancées à chaque démarrage de l'ordinateur.

Ce fonctionnement est satisfaisant pour des instances de MPD qui doivent fonctionner en permanence, tout comme l'instance principale.
Mon usage est différent, j'utilise une instance de MPD pour lire de la musique au quotidien, elle est donc toujours en fonctionnement. Mais j'ai besoin de 2 instances supplémentaires occasionnellement pour ajouter sons d'ambiances et bruitages à une musique de fond. Il me faut donc 2 instances de MPD pour une courte durée, le temps d'une soirée, qui n'ont pas de raisons de rester en fonctionnement en permanence.

Nous allons donc voir comment faciliter le lancement de 2 instances de MPD, ainsi que leur client, le temps d'une soirée.

Utilisation occasionnelle d'instances MPD

Pour le cas présent, j'utilise ario en tant que client, pour sa possibilité de gérer plusieurs "profils" MPD et sa capacité à démarrer sur un profil spécifique.
Ces "profils" MPD permettent de se connecter à différentes instances de MPD au sein du même client.

Enfin, pour éviter de devoir se connecter manuellement au serveur, nous allons utiliser une connexion ssh via un script qui automatisera tout le processus.

#!/bin/bash

echo "Démarrage des instances de MPD, puis des instances de ario"
echo "Démarrage des instances mpd"
ssh maniack@crudelis.fr -p 2222 "mpd /etc/mpd2.conf & mpd /etc/mpd3.conf"
echo "Démarrage des instances ario"
ario - -profile=mpd2 &
ario - -profile=mpd3 &
read -p "Appuyer sur une touche pour arrêter les instances mpd sur le serveur..." a
echo Lancement de ssh-agent pour automatiser la connection ssh le temps du script.
ssh-agent >> /dev/null
echo Ajout de la clé pour ssh-agent.
ssh-add $HOME/.ssh/id_dsa
echo -n "Obtention du pid de mpd2"
mpdPID=$(ssh maniack@crudelis.fr -p 2222 "cat /home/USER/mpd2/pid")
echo ": $mpdPID"
echo "Arrêt de l'instance mpd2"
ssh maniack@crudelis.fr -p 2222 "kill $mpdPID"
echo -n "
Obtention du pid de mpd3"
mpdPID=$(ssh maniack@crudelis.fr -p 2222 "cat /home/USER/mpd3/pid")
echo ": $mpdPID"
echo "Arrêt de l'instance mpd3"
ssh maniack@crudelis.fr -p 2222 "kill $mpdPID"
echo Suppression de la clé pour ssh-agent.
ssh-add -d $HOME/.ssh/id_dsa

Au lignes 7 et 8 du script, un double tiret doit précéder 'profile'. WordPress n'affiche pas correctement les 2 tirets, je les ai donc séparé par un espace.

Comments

Leave a Reply