Page 1 sur 1

[ncmpcpp] visualisation FIFO sur le réseau (contourné)

Publié : mar. 27 nov. 2012, 17:00
par z3bra
Bonjour,

Étant un peu noob en piping, je fais appel à vos connaissances pour résoudre mon dernier casse-tête en date:
J'ai deux machines sur le réseau:
Un serveur sur lequel tourne MPD (serveur musical)
Un laptop avec le client ncmpcpp pour manipuler MPD.

La connexion entre les deux se passe très bien, mais la seule chose qui me manque, c'est la visualisation das ncmpcpp !
Lorsqu'mpd et ncmpcpp sont sur la même machine, un pipe est partagé entre les deux pour qu'ncmpcpp puisse afficher un visuel de la sortie audio. Ça fonctionne à merveille chez moi.

Code : Tout sélectionner

# mpd.conf
...
audio_output {
    type "fifo"
    name "FIFO Visual"
    path "/tmp/mpd.fifo"
}

Code : Tout sélectionner

# ncmpccp/config
...
visualizer_fifo_path = "/tmp/mpd.fifo"
visualizer_output_name = "FIFO Visual"
Maintenant, si les deux soft sont sur des machines séparée, impossible pour ncmpcpp d'accéder au pipe ! (J'ai essayé via un montage NFS, non-concluant, j'ai vite compris pourquoi ça ne peut pas marcher ^^)

En cherchant par-ci par-là et grâce au chan IRC, j'ai trouvée cette solution, mais qui reste bancale:
z3bra@client$ netcat -lk 1234 > /tmp/mpd.fifo & ncmpcpp
z3bra@serveur$ netcat client_ip 1234 < /tmp/mpd.fifo
Ça semble fonctionner pas trop mal...

Seulement, si je ferme le lecteur coté client, netcat s'arrête coté serveur, et j'ai plus qu'à recommencer si je veux mon visu...
Et franchement, c'est pas super pratique !

Donc si vous avez des idées, elles sont les bienvenues. Merci d'avance :)

Re: [ncmpcpp] visualisation FIFO sur le réseau

Publié : mar. 27 nov. 2012, 17:15
par benjarobin
Ce n'est pas possible de faire du broadcast coté serveur via netcat (Aucune idée même pas cherché :-) ) ? Ainsi netcat n'est pas lié à l'IP du client

Re: [ncmpcpp] visualisation FIFO sur le réseau

Publié : mar. 27 nov. 2012, 17:26
par oktoberfest
Salut,

un pipe nommé ne marche que pour deux processus sur le même pc. Dans ton cas il faut regarder du côté des communications tcp (à priori mpd sait faire, à voir comment en pratique).

Re: [ncmpcpp] visualisation FIFO sur le réseau

Publié : mar. 27 nov. 2012, 18:03
par z3bra
@benjarobin: Si surement, mais pour l'instant c'est pas ma priorité. je vais déja le faire fonctionner pour un pc, et je verrais par la suite

@oktberfest: Oui je sais, c'est pour ça que j'ai trouvé une solution avec netcat. Pour mpd, j'ai pas réussi à le faire fonctionner en tcp...

Re: [ncmpcpp] visualisation FIFO sur le réseau

Publié : mar. 27 nov. 2012, 19:55
par benjarobin
Ma réponse allait dans le sens ou s'il y a broadcast UDP alors pas de connexion et donc pas de problème de déconnexion. Mais en effet creuser du coté de mpd me semble la meilleur voie

Re: [ncmpcpp] visualisation FIFO sur le réseau

Publié : mar. 27 nov. 2012, 21:00
par oktoberfest
Côté serveur, tu peux mettre ton netcat dans une boucle infinie, un truc du genre :

Code : Tout sélectionner

$ do while [ 1 ]; do netcat client_ip 1234 < /tmp/mpd.fifo; done
Comme ça dès que le client coupe la connexion, le netcat côté serveur est relancé.
Ca reste pas terrible mais c'est une piste.

Re: [ncmpcpp] visualisation FIFO sur le réseau

Publié : mer. 28 nov. 2012, 13:07
par z3bra
Bon, j'ai trouvé comment utiliser le réseau avec mpd.
Il m'a fallu le recompiler avec l'option --enable-pipe-output.

J'ai donc, dans ma config mpd:

Code : Tout sélectionner

audio_output {
    type        "pipe"
    name        "network pipe"
    command     "nc -u hostname 1234"
    format      "44100:16:2"
}
Coté client, je lance toujours la commande nc -u -lk 1234 > /tmp/mpd.fifo.
La connection se passe bien... la première fois. Dès que je ferme ncmpcpp, le serveur me renvoie "broken pipe", alors que coté client, netstat me renvoie la connection comme "ESTABLISHED". J'ai donc un problème à ce niveau là. Puisque le client ne peut écouter qu'une seule connection à la fois, et que cette dernière ne se ferme pas, impossible pour mpd de se reconnecter au client. (je sais pas si je suis très clair...)

Re: [ncmpcpp] visualisation FIFO sur le réseau

Publié : mer. 28 nov. 2012, 13:46
par oktoberfest
De ce que j'ai vu de mes essais hier soir (en tcp du moins), netcat s'arrête d'un côté si le netcap de l'autre côté s'arrête aussi. C'est pour ça que je t'ai proposé la solution de la boucle infinie qui relance netcap.

En udp mes tests n'étaient pas probant alors qu'en tcp tout allait bien.

Je trouverais plus logique de lancer netcap en écoute côté mpd plutôt que côté ncmpcpp.
Si tu fais un truc du genre côté mpd :

Code : Tout sélectionner

$ cat /usr/local/bin/mpd_netcap.sh
#!/bin/bash

while [ 1 ]
do
  nc -lk 1234
done

Code : Tout sélectionner

audio_output {
    type        "pipe"
    name        "network pipe"
    command     "/usr/local/bin/mpd_netcap.sh"
    format      "44100:16:2"
}
et côté ncmpcpp

Code : Tout sélectionner

netcat <serveur mpd> 1234 > /tmp/mpd.fifo & ncmpcpp
Est-ce que ça fonctionne mieux ?

Re: [ncmpcpp] visualisation FIFO sur le réseau

Publié : mer. 28 nov. 2012, 14:06
par z3bra
Pas besoin de la boucle while, mpd se charge de relancer la commande en boucle d'après ce que je vois dans les log...
En revanche, je comprends pas pourquoi tu veux que l'écoute se fasse côté mpd... Il s'agit bien d'ENVOYER des données depuis mpd (audio_output) en pipant les données vers une commande.

Ta commande chercherait donc à envoyer des données par le biais d'un port en écoute ? Où il y a quelquechose que je ne saisis pas ?
(Je vais tout de même essayer hein ^^)

Re: [ncmpcpp] visualisation FIFO sur le réseau

Publié : mer. 28 nov. 2012, 14:16
par oktoberfest
Le sens de connexion n'a rien à voir avec les sens d'envoi des données. Une fois la connexion établie, la communication est birectionnelle avec les sockets. D'un point de vue conceptuel, il parait logique que le netcat côté serveur soit en écoute (il attend un client).
Si tu fais tes tests en tcp est-ce que ça marche mieux ? Quand ça plante, peux-tu poster le résultat d'un netstat côté mpd, qu'on voit bien l'état des sockets ? D'après ce que tu dis, quand tu arrêtes netcat côté client, cela relance netcat côté serveur. As-tu pu vérifier qu'il y a bien un nouveau processus netcat lancé côté serveur ?

Re: [ncmpcpp] visualisation FIFO sur le réseau

Publié : mer. 28 nov. 2012, 16:02
par z3bra
Alors, ça fonctionne plutot pas mal apparement :) merci beaucoup !
Lorsque je ferme ncmpcpp, netcat se ferme côté client (pour broken pipe), mais si je relance netcat, ncmpcpp se reconnecte sans problème au serveur.
Je peux donc me faire un alias, un service systemd ou un cron pour ça, je n'ai que l'embarras du choix...

En revanche, ça pose un tout autre problème, à savoir que si je désactive la sortie "network pipe" du serveur mpd, il m'est impossible de me reconnecter ! Je dois envoyer SIGKILL aux process mpd et netcat avant de relancer mpd et ainsi, réactiver la sortie pour que ça fonctionne à nouveau...

Re: [ncmpcpp] visualisation FIFO sur le réseau

Publié : mer. 28 nov. 2012, 16:26
par z3bra
Ah ! J'ai trouvé !!
En fait, ce qui faisait tout planter lors de la désactivation, c'est le fait que le processus netcat reste lancé sans qu'mpd ne lui pipe de commande (car sortie désactivée)
Donc, pour que netcat se termine lorsque la sortie mpd est désactivée, il suffit de retirer l'option -k de netcat, et celui-ci se terminera chaque fois que la sortie sera désactivée.
À l'inverse, netcat sera relancé à l'activation de la sortie mpd. Génial non ? ^^

Reste pour moi à éclaircir un dernier point, selon vous, le plus "propre" pour se connecter à mpd, c'est que le netcat côté client soit dans un cron, un alias, ou un service systemd ?
Sachant que du côté client:
  • le processus netcat se termine lorsque ncmpcpp est fermé
  • ncmpcpp n'a pas besoin que netcat soit forcément lancé pour fonctionner (même si la sortie coté serveur et activée)
  • un script peut être intéréssant pour vérifier si le serveur écoute bien sur le port définit (nc -z <server> <port> il me semble)

Re: [ncmpcpp] visualisation FIFO sur le réseau

Publié : jeu. 29 nov. 2012, 09:22
par oktoberfest
Pour le démarrage de ncmpcpp, tout dépend de l'usage que tu veux en faire :
- cron : cela va démarrer ncmpcpp à horaire fixe
- alias : démarrage à la demande (à ta demande pour être précis)
- systemd : démarrage au démarrage de l'os

Sinon tu utilises quelle version de netcat (quel package) ? Moi j'ai installé gnu-netcat et je n'ai pas d'option -k...

Re: [ncmpcpp] visualisation FIFO sur le réseau

Publié : jeu. 29 nov. 2012, 18:15
par z3bra
@oktoberfest: J'ai le pkg openbsd-netcat des deux cotés.

Bon, en fait, après avoir testé chez moi, ça marche PAS DU TOUT !
LE fait qu'il y ait la sortie netcat d'activée prends le pas sur la sortie ALSA et donc j'ai bien la visualisation, mais plus le son. J'ai trouvé un tweak, en lançant le netcat -l coté client, ça marche UN PEU mieux, mais à peine, c'est à dire que j'ai la visualisation et le son en intermitence, genre 1 seconde de chacun... Pas top pour écouter la musique.

En dernier recours, j'ai trouvé le moyen de pas altérer le son en ayant la visualisation: J'ai virée la sortie "pipe" et activée la sortie FIFO.
Coté serveur, je lançe netcat client 1234 < /tmp/mpd.fifo
Coté client, j'écoute avec netcat -l 1234 > /tmp/mpd.fifo

Dans ce cas là, le son est nickel, et je peut visualiser le spectre. Cependant, il y a un fort retard sur la visualisation, ce qui est plutôt dommage. De plus, si ferme ncmpcpp, le netcat coté serveur se termine, et il me faut le relancer manuellement. Un script de type "démon" pourrait gérer le redémarrage de netcat dans ces cas là, mais c'est pas très propre.

Enfin bon, je pense finallement pas pouvoir obtenir de bons résultats sur cette manip', et ai donc décidé d'utiliser ncmpcpp directement sur le serveur pour utiliser la sortie FIFO, et d'utiliser mpc coté client histoire d'utiliser des commandes simples sur mes media keys.

JE définit le topic en (contourné) car pour le moment, je suis à court d'idée. Néanmoins, je continuerais de temps à autre à chercher des tweaks, et posterais mes idées (si j'en trouve) ;)

Merci pour votre aide !