Teclis01
Messages postés
1423
Date d'inscription
mardi 14 décembre 2004
Statut
Membre
Dernière intervention
29 décembre 2012
4
18 mars 2006 à 02:51
Hum...
J'ai effectué un projet il y a peu et il consistais a utiliser XMMSpipe pour controler XMMS depuis une machine distante.
Pour l ecriture j'ai utilisé directement la fonction shell_exec();
pour la lecture néanmoins, comme je n arrivais pas a utiliser de façon convenable le fopen et le fread car la lecture etait synchrone je suis passé par le C et le PHP... je m explique:
je voulais recuperer le volume sonore ainsi que la balance appliqué au lecteur.
j ai donc utilisé ceci:
<?php
$descriptorspec = array(
0 => array("pipe", "r"), // stdin est un pipe où le processus va lire
1 => array("pipe", "w"), // stdout est un pipe où le processus va écrire
2 => array("file", "/tmp/error-output.txt", "a"), // stderr est un fichier
);
$process = proc_open("/tmp/msg_pipe-out", $descriptorspec, $pipes);
if (is_resource($process)) {
// $pipes ressemble à :
// 0 => fichier accessible en écriture, connecté à l'entrée standard du processus fils
// 1 => fichier accessible en lecture, connecté à la sortie standard du processus fils
// Toute erreur sera ajoutée au fichier /tmp/error-output.txt
fwrite($pipes[0], " ");
fclose($pipes[0]);
while(!feof($pipes[1])) {
$pipecontent=fgets($pipes[1], 1024);
/*Parser Balance*/
$contentbalance=explode("~",$pipecontent);
echo $contentbalance[1].$contentbalance[2];
/*Parser volume*/
$contentvolume=explode("[",$pipecontent);
echo $contentvolume[1].$contentvolume[2];
}
fclose($pipes[1]);
// Il est important que vous fermiez les pipes avant d'appeler
// proc_close() afin d'éviter un verrouillage.
$return_value = proc_close($process);
/*Renvoie 0 si Ok*/
echo "La commande a retourné $return_value\n";
}
?>
/tmp/msg_pipe-out est le chemin + nom de fichier que j ai utilisé afin d ecrire dans le pipe in et avoir une reponse dans le pipe out
Le programme en C le voici(j avoue qu'il est degeu mais il marche et je n'avais pas spécialement le tps de faire propre)
#include
#include <sys/time.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static void send_command(char* s);
static FILE *in, *out;
static void send_command(char* s)
{
fprintf(out, "%s\n", s);
//using buffered I/O is okay as long as we tell it when it must send
fflush(out);
}
int main()
{
char outpipe[]="/tmp/xmmspipe-out_root.0";
char inpipe[]="/tmp/xmmspipe-in_root.0";
int iVolumeLeft, iVolumeRight,iBalance;
float fRatio;
out = fopen(inpipe, "w");
if (!out) {
fprintf(stderr, "Error: can't open input pipe '%s'\n", inpipe);
return 1;
}
send_command("out on");
//flush outpipe just in case there is some stale output on it
send_command("out flush");
in = fopen(outpipe,"r");
if (!in) {
fprintf(stderr, "Error: can't open output pipe '%s'\n", outpipe);
return 1;
}
send_command("report volume");
fscanf(in,"%d %d", &iVolumeLeft, &iVolumeRight);
/*Traitement si balance n'est pas centree*/
if(iVolumeLeft!=iVolumeRight){
if(iVolumeLeft>iVolumeRight){
fRatio=1-( (float)iVolumeRight/ (float) iVolumeLeft);
iBalance=(int)(fRatio*100);
printf("~-1~%d~\n",iBalance);
}
if(iVolumeLeft-------------------------------------------------------------------------------------------------------
Il vaut mieux poser une question et passer pour bête que le rester toute sa vie