IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Gestion STDIN + pilotage Mplayer


Sujet :

Linux

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Gestion STDIN + pilotage Mplayer
    Bonjour à tous!

    J'essaie de réaliser un programme sous linux, et je suis dans l'embarras.

    Mon programme se lance.

    Il fork pour lancer une video Vboucle en boucle dans mplayer. Cette vidéo qui tourne à l'infini est celle qui sert de video d'"attente".

    En effet, j'ai un lecteur de codes barres sur port usb. Lorsque j'appuie sur le bouton du lecteur/douchette, le code en caractères correspondant au code barre exposé au lecteur est transmis à STDIN, exactement comme si je l'avais tapé manuellement au clavier. Mon programme doit récupérer la chaine de caractères donnée par le lecteur de code barre.

    En fonction du code barre reçu. Une autre vidéo (Vrésultat) est lancée dans mplayer (l'ancien mplayer est alors killé): pas en boucle cette fois, elle est jouée une fois et une seule, puis c'est reparti pour la vidéo d'attente en boucle.
    Pendant que la vidéo Vrésultat est en cours de lecture, je compte inhiber le lecteur de code barre (ça je sais pas encore comment), et le réactiver une fois que Vboucle tourne à nouveau.

    Mon gros problème:
    A partir du moment ou je fork et que j'execl mplayer pour lire la video en boucle, c'est mplayer qui récupère les pressions au clavier, et lorsque je lis un codebarre avec ma douchette, c'est mplayer qui récupère tout, et donc ça va pas du tout du tout (c'est comme si lors d'une lecture de vidéo dans mplayer, vous appuyiez un peu partout sur le clavier dont certaines touches sont affectées à des fonctions diverses).

    J'ai consulté de l'aide ça et là, on m'a dit que:
    - le processus enfant (qui spawn mplayer par la suite) hérite du stdin de son père (mon programme). On m'a conseillé dans un premier temps de rediriger STDIN du processus fils vers /dev/null à l'aide de dup2. Pas concluant du tout, mplayer continue à récupérer les évènements clavier (et donc le code barre).
    - on m'a conseiller d'essayer les paramètres -noconsoleinputs (ou un truc du genre, j'ai pas mon code sous les yeux au moment où je vous écris) --> pas concluant non plus.
    - on m'a conseiller d'essayer le mode -slave. --> pas concluant non plus.

    Lorsque dans Gnome, je lance mplayer depuis un shell en ligne de commande, je remarque que d'une part il écrit dans le terminal. Mais que d'autre part une fenetre graphique est ouverte, celle-là même dans laquelle est affichée la vidéo. Cette fenêtre graphique récupère le focus de la part de X (donc clavier + souris), et je me demande si ça viendrait pas de là.

    Me souvenant que mplayer n'a pas forcément besoin du serveur X pour pouvoir afficher de la video plein écran, j'ai récupéré le fichier de configuration mplayer.conf de GeexBox, pour lancer par la suite mon programme depuis TTY1 (ctrl+alt+F1) en root, et voir ce que ça donne avec un mplayer qui n'ouvre plus une fenetre de window manager, mais écrit directement dans le framebuffer. Manque de pot, sous ubuntu, avec mes drivers ATI proprio, il parait que j'ai pas de framebuffer (on m'a fait lancer un ptit programme qui écrit directement en FBO,et ça m'affiche des "A" rouge plein l'écran).

    Très alambiqué tout cela. Mon problème se résume à vouloir lancer un programme d'une part réceptionne des codesbarres de STDIN, et d'autre part pilote mplayer, SANS que mplayer soit sensible à aucun évènement clavier.

    Ah oui, dernière chose, on peut effectivement configurer mplayer pour mapper les fonctions qu'on veut, aux touches qu'on veut. j'ai essayé de virer tous les mappages, mais même sans mapping, les touches sont interceptées quand même.

    J'aimerai que mon programme garde en somme l'"exclusivité" sur STDIN. Non de dieu!!!

    Merci d'avance de votre aide!

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    petite question comme ça :

    pourquoi tu l'as lancé avec un fork et pas avec un system() ??

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Hmm, euh, j'en sais rien. Pourquoi pas?
    Des restes de cours sur la prog système linux sur les processus et le spawn d'un programme tiers, on utilise classiquement fork(), pas system() (non? avantages/inconvénients?)

    Personne intéressé par mon problème ?

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    ben ça dépend si tu veux communiquer avec ou pas, si c'est un serveur/client ou pas..

    Mais dans le cas d'un programme qui en lance un autre, le plus simple est dans le programme (je ne connais pas la commande en dehors de C) faire juste

    system("programme&")

    ça le lance en background, et je ne pense pas qu'ils partagent le même stdin... puisque celui qui est lancé en background tu pourrais le lancer en faisant "programme < nouveau_stdin"....

    et ça ne fait qu'une ligne de code...

Discussions similaires

  1. Réponses: 0
    Dernier message: 15/07/2014, 21h31
  2. Pilotage de MPlayer sous DOS en mode esclave
    Par Yop dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 22/12/2008, 20h32
  3. Stdin/Pipes et intégration MPlayer à VB6
    Par Yop dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 10/10/2008, 14h27
  4. c: gestion des exceptions
    Par vince_lille dans le forum C
    Réponses: 7
    Dernier message: 05/06/2002, 14h11
  5. gestion d'un joystick ...
    Par Anonymous dans le forum DirectX
    Réponses: 1
    Dernier message: 23/05/2002, 12h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo