{"id":279,"date":"2012-02-07T00:13:00","date_gmt":"2012-02-06T22:13:00","guid":{"rendered":"http:\/\/crudelis.fr\/blog\/?p=279"},"modified":"2012-02-07T00:13:00","modified_gmt":"2012-02-06T22:13:00","slug":"instances-multiples-de-mpd","status":"publish","type":"post","link":"https:\/\/crudelis.fr\/site\/sblog\/2012\/02\/instances-multiples-de-mpd\/","title":{"rendered":"Instances multiples de MPD"},"content":{"rendered":"<p><a href=\"http:\/\/fr.wikipedia.org\/wiki\/Music_Player_Daemon\" target=\"_blank\">MPD<\/a>, Music Player Daemon, pr\u00e9sente l'avantage de pouvoir tourner sur une machine distante et \u00eatre exploit\u00e9 par divers clients sur d'autres machines.<br \/>\nJe l'utilise plus particuli\u00e8rement sur mon serveur c\u00e2bl\u00e9 aux enceintes pour centraliser la source audio quelque que soit l'ordinateur que j'utilise chez moi.<\/p>\n<p>J'ai r\u00e9cemment \u00e9t\u00e9 confront\u00e9 \u00e0 la probl\u00e9matique de jouer plusieurs sons en m\u00eame temps, pour ajouter un son d'ambiance et des bruitages \u00e0 une musique de fond. La solution a donc \u00e9t\u00e9 de multiplier les instances de MPD.<br \/>\nDes instances multiples de MPD permettent aussi de diffuser plusieurs musiques en streaming selon les utilisateurs ou de diffuser sur plusieurs sorties distinctes.<br \/>\n<!--more--><\/p>\n<h2>Principe<\/h2>\n<p>MPD utilise plusieurs fichiers de configuration, plac\u00e9s par d\u00e9faut dans ~\/mpd. Il est possible lors du d\u00e9marrage du serveur de lui sp\u00e9cifier son fichier de configuration principal, '\/etc\/mpd.conf' par d\u00e9faut, duquel d\u00e9coule les autres fichiers de config.<br \/>\nPour d\u00e9marrer une seconde instance de MPD, il suffit de dupliquer son fichier de configuration ainsi que les autres fichiers de config associ\u00e9s et de le lui sp\u00e9cifier au d\u00e9marrage.<\/p>\n<h2>Mise en \u0153uvre<\/h2>\n<p>Tout d'abord, nous allons dupliquer le fichier de config principal pour cr\u00e9er une deuxi\u00e8me configuration.<\/p>\n<pre>sudo cp -a \/etc\/mpd.conf \/etc\/mpd2.conf<\/pre>\n<p>Ensuite nous allons dupliquer les autres fichiers de config pr\u00e9sents dans \/home<\/p>\n<pre>sudo cp -a ~\/mpd ~\/mpd2<\/pre>\n<p>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\u00e9par\u00e9ment de la premi\u00e8re instance.<\/p>\n<pre>sudo nano \/etc\/mpd2.conf<\/pre>\n<pre>[...]\nmusic_directory                \"\/DIR\/votre_dossier_de_musique\"\n[...]\nplaylist_directory\t\t\"\/home\/USER\/mpd2\/playlists\"\n[...]\ndb_file\t\t\t\"\/home\/USER\/mpd2\/tag_cache\"\n[...]\nlog_file\t\t\t\"\/home\/USER\/mpd2\/mpd.\nlog\"\n[...]\npid_file\t\t\t\"\/home\/USER\/mpd2\/pid\"\n[...]\nstate_file\t\t\t\"\/home\/USER\/mpd2\/state\"\n[...]\nport\t\t\t\t\"6601\"\n[...]\naudio_output {\n\ttype\t\t\"alsa\"\n\tname\t\t\"My ALSA Device\"\n#\tdevice\t\t\"hw:0,0\"\t# optional\n#\tformat\t\t\"44100:16:2\"\t# optional\n\tmixer_device\t\"default\"\t# optional\n\tmixer_control\t\"PCM\"\t\t# optional\n#\tmixer_index\t\"0\"\t\t# optional\n}\n[...]\nmixer_type\t\t\t\"software\"\n[...]<\/pre>\n<p>Ce qui donne en d\u00e9tail:<\/p>\n<pre>music_directory                \"\/DIR\/votre_dossier_de_musique\"<\/pre>\n<p>Le chemin absolu du dossier contenant la musique. Qui peut \u00eatre diff\u00e9rent ou non de celui de la premi\u00e8re instance. Selon l'usage d\u00e9sir\u00e9.<\/p>\n<pre>playlist_directory\t\t\"\/home\/USER\/mpd2\/playlists\"<\/pre>\n<p>Le dossier contenant les playlists de MPD. De pr\u00e9f\u00e9rence diff\u00e9rent pour chaque instance.<\/p>\n<pre>db_file\t\t\t\"\/home\/USER\/mpd2\/tag_cache\"<\/pre>\n<p>La base de donn\u00e9es de MPD, elle peut \u00eatre partag\u00e9e entre plusieurs instances \u00e0 condition que le dossier de musique le soit \u00e9galement.<\/p>\n<pre>log_file\t\t\t\"\/home\/USER\/mpd2\/mpd.log\"<\/pre>\n<p>Le fichier de log de MPD.<\/p>\n<pre>pid_file\t\t\t\"\/home\/USER\/mpd2\/pid\"<\/pre>\n<p>Le fichier contenant le PID de l'instance de MPD, il est <strong>imp\u00e9ratif<\/strong> que ce fichier soit diff\u00e9rent pour chaque instance.<\/p>\n<pre>state_file\t\t\t\"\/home\/USER\/mpd2\/state\"<\/pre>\n<p>Le fichier de config utilisateur de MPD, il contient diverses informations sur les r\u00e9glages de l'interface de MPD.<\/p>\n<ul>\n<li>Le volume de la sortie audio.<\/li>\n<li>Les sorties audio physiques.<\/li>\n<li>Et \u00e9ventuellement en streaming.<\/li>\n<li>L'\u00e9tat actuel de la lecture.<\/li>\n<li>Les diff\u00e9rents mode de lecture.<\/li>\n<li>Et enfin la playlist en cours de lecture.<\/li>\n<\/ul>\n<p>Il est bien \u00e9videmment indispensable qu'il soit sp\u00e9cifique \u00e0 chaque instance pour \u00e9viter qu'elles ne se marchent dessus.<\/p>\n<pre>port\t\t\t\t\"6601\"<\/pre>\n<p>Le port de contr\u00f4le de MPD, par d\u00e9faut il utilise le port 6000. Il faut en choisir un autre pour chaque nouvelle instance de MPD, le client choisira l'instance \u00e0 contr\u00f4ler par son port.<\/p>\n<pre>audio_output {\n\ttype\t\t\"alsa\"\n\tname\t\t\"My ALSA Device\"\n#\tdevice\t\t\"hw:0,0\"\t# optional\n#\tformat\t\t\"44100:16:2\"\t# optional\n\tmixer_device\t\"default\"\t# optional\n\tmixer_control\t\"PCM\"\t\t# optional\n#\tmixer_index\t\"0\"\t\t# optional\n}<\/pre>\n<p>J'utilise alsa pour la lecture locale, il est important de garder 'device' comment\u00e9 pour ne pas forcer alsa \u00e0 communiquer directement avec la carte son. On veillera donc \u00e0 d\u00e9commenter 'mixer_device' pour que le son de MPD soit envoy\u00e9 au serveur de son qui mixera l'ensemble avant l'envoi \u00e0 la carte son.<br \/>\nLa raison de cela est simple, si alsa envoi le son directement \u00e0 la carte son, celle-ci ne pouvant g\u00e9rer qu'un seul son \u00e0 la fois, seule la premi\u00e8re instance de mpd pourra \u00e9mettre du son. Tandis qu'en passant par le serveur de son, il servira d'interm\u00e9diaire pour mixer l'ensemble des sons re\u00e7us avant l'envoi \u00e0 la carte son. Ainsi, plusieurs instances de MPD peuvent cohabiter et diffuser chacun un son diff\u00e9rent.<\/p>\n<pre>mixer_type\t\t\t\"software\"<\/pre>\n<p>Dans le m\u00eame esprit que le param\u00e8tre pr\u00e9c\u00e9dent. Pour assurer une saine cohabitation des diff\u00e9rentes instances de MPD, le volume sonore doit pouvoir \u00eatre r\u00e9gl\u00e9 en pr\u00e9amplification sur chaque instance avant d'\u00eatre envoy\u00e9 \u00e0 alsa qui g\u00e9rera lui m\u00eame le volume sonore g\u00e9n\u00e9ral du syst\u00e8me.<\/p>\n<p>On utilisera donc alsamixer pour g\u00e9rer le volume du syst\u00e8me. Tandis que chaque instance de MPD g\u00e9rera son volume propre.<br \/>\nLes 2 derni\u00e8res modifications doivent \u00eatre appliqu\u00e9es \u00e0 <strong>toutes les instances<\/strong> de MPD pour \u00eatre effectives, sinon l'instance ne respectant pas ce r\u00e9glage prendra le pas sur les autres.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Notre fichier de configuration est maintenant pr\u00eat. On peut donc lancer la 2e instance de MPD.<\/p>\n<pre>mpd \/etc\/mpd2.conf<\/pre>\n<p>Voyons maintenant comment lancer les 2 instances de MPD au d\u00e9marrage de la machine.<\/p>\n<h2>Lancement au d\u00e9marrage<\/h2>\n<p>L'op\u00e9ration est simple, nous allons dupliquer le script de mpd dans init.d et lui<br \/>\nindiquer la 2e instance de mpd. Ceci nous permettra de d\u00e9marrer 2 fois mpd, avec le fichier de configuration correspondant.<\/p>\n<pre>sudo cp -a \/etc\/init.d\/mpd \/etc\/init.d\/mpd2<\/pre>\n<p>Puis nous allons modifier le script pour lui indiquer la 2e instance de MPD.<\/p>\n<pre>nano \/etc\/init.d\/mpd2<\/pre>\n<pre>[...]\n# Provides:          mpd2\n[...]\n# Short-Description: Music Player Daemon, 2e instance\n[...]\nNAME=mpd2\n[...]\nDESC=\"Music Player Daemon, 2e instance\"\n[...]\nMPDCONF=\/etc\/mpd2.conf\n[...]<\/pre>\n<p>Il est important de changer les occurrences de 'mpd' par 'mpd2' pour \u00e9viter un \u00e9crasement de la premi\u00e8re instance par la seconde.<br \/>\nEt surtout, il faut bien penser \u00e0 modifier l'emplacement du fichier de config, ici '\/etc\/mpd2.conf'<\/p>\n<p>Nous allons ensuite enregistrer le nouveau script de d\u00e9marrage \u00e0 l'aide de la commande update-rc.d<\/p>\n<pre>sudo update-rc.d mpd2 defaults<\/pre>\n<p>Ceci fait, un red\u00e9marrage de la machine suffira pour que les 2 instances de MPD soit lanc\u00e9es \u00e0 chaque d\u00e9marrage de l'ordinateur.<\/p>\n<p>Ce fonctionnement est satisfaisant pour des instances de MPD qui doivent fonctionner en permanence, tout comme l'instance principale.<br \/>\nMon usage est diff\u00e9rent, 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\u00e9mentaires occasionnellement pour ajouter sons d'ambiances et bruitages \u00e0 une musique de fond. Il me faut donc 2 instances de MPD pour une courte dur\u00e9e, le temps d'une soir\u00e9e, qui n'ont pas de raisons de rester en fonctionnement en permanence.<\/p>\n<p>Nous allons donc voir comment faciliter le lancement de 2 instances de MPD, ainsi que leur client, le temps d'une soir\u00e9e.<\/p>\n<h2>Utilisation occasionnelle d'instances MPD<\/h2>\n<p>Pour le cas pr\u00e9sent, j'utilise <a href=\"http:\/\/ario-player.sourceforge.net\/\" target=\"_blank\">ario<\/a> en tant que client, pour sa possibilit\u00e9 de g\u00e9rer plusieurs \"profils\" MPD et sa capacit\u00e9 \u00e0 d\u00e9marrer sur un profil sp\u00e9cifique.<br \/>\nCes \"profils\" MPD permettent de se connecter \u00e0 diff\u00e9rentes instances de MPD au sein du m\u00eame client.<\/p>\n<p>Enfin, pour \u00e9viter de devoir se connecter manuellement au serveur, nous allons utiliser une connexion ssh via un script qui automatisera tout le processus.<\/p>\n<pre>#!\/bin\/bash\n\necho \"D\u00e9marrage des instances de MPD, puis des instances de ario\"\necho \"D\u00e9marrage des instances mpd\"\nssh maniack@crudelis.fr -p 2222 \"mpd \/etc\/mpd2.conf &amp; mpd \/etc\/mpd3.conf\"\necho \"D\u00e9marrage des instances ario\"\nario - -profile=mpd2 &amp;\nario - -profile=mpd3 &amp;\nread -p \"Appuyer sur une touche pour arr\u00eater les instances mpd sur le serveur...\" a\necho Lancement de ssh-agent pour automatiser la connection ssh le temps du script.\nssh-agent &gt;&gt; \/dev\/null\necho Ajout de la cl\u00e9 pour ssh-agent.\nssh-add $HOME\/.ssh\/id_dsa\necho -n \"Obtention du pid de mpd2\"\nmpdPID=$(ssh maniack@crudelis.fr -p 2222 \"cat \/home\/USER\/mpd2\/pid\")\necho \": $mpdPID\"\necho \"Arr\u00eat de l'instance mpd2\"\nssh maniack@crudelis.fr -p 2222 \"kill $mpdPID\"\necho -n \"\nObtention du pid de mpd3\"\nmpdPID=$(ssh maniack@crudelis.fr -p 2222 \"cat \/home\/USER\/mpd3\/pid\")\necho \": $mpdPID\"\necho \"Arr\u00eat de l'instance mpd3\"\nssh maniack@crudelis.fr -p 2222 \"kill $mpdPID\"\necho Suppression de la cl\u00e9 pour ssh-agent.\nssh-add -d $HOME\/.ssh\/id_dsa<\/pre>\n<blockquote><p><em>Au lignes 7 et 8 du script, un double tiret doit pr\u00e9c\u00e9der 'profile'. WordPress n'affiche pas correctement les 2 tirets, je les ai donc s\u00e9par\u00e9 par un espace.<\/em><\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>MPD, Music Player Daemon, pr\u00e9sente l'avantage de pouvoir tourner sur une machine distante et \u00eatre exploit\u00e9 par divers clients sur d'autres machines. Je l'utilise plus particuli\u00e8rement sur mon serveur c\u00e2bl\u00e9 aux enceintes pour centraliser la source audio quelque que soit l'ordinateur que j'utilise chez moi. J'ai r\u00e9cemment \u00e9t\u00e9 confront\u00e9 \u00e0 la probl\u00e9matique de jouer plusieurs [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_links_to":"","_links_to_target":""},"categories":[2,3,6],"tags":[11,23,29,37],"class_list":["post-279","post","type-post","status-publish","format-standard","hentry","category-divers","category-home-server","category-servus","tag-ario","tag-instances-multiples","tag-mpd","tag-serveur"],"_links":{"self":[{"href":"https:\/\/crudelis.fr\/site\/sblog\/wp-json\/wp\/v2\/posts\/279","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/crudelis.fr\/site\/sblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/crudelis.fr\/site\/sblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/crudelis.fr\/site\/sblog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/crudelis.fr\/site\/sblog\/wp-json\/wp\/v2\/comments?post=279"}],"version-history":[{"count":0,"href":"https:\/\/crudelis.fr\/site\/sblog\/wp-json\/wp\/v2\/posts\/279\/revisions"}],"wp:attachment":[{"href":"https:\/\/crudelis.fr\/site\/sblog\/wp-json\/wp\/v2\/media?parent=279"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/crudelis.fr\/site\/sblog\/wp-json\/wp\/v2\/categories?post=279"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/crudelis.fr\/site\/sblog\/wp-json\/wp\/v2\/tags?post=279"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}