Unterschied terminal vs. exec



  • Hallo,

    ich versuche unter Raspbian aus einem GTK-Programm den omxplayer zu starten. Dieser Player ist eigentlich ein CLI-Programm, welches sich nur durch Tastendrücke in der Console steuern lässt. davor liegt als Overlay das Video.

    starte ich im terminal (lxterminal) den omxplayer via "omxplayer -b Video.avi", funktioniert alles.

    nun versuche ich das aus meiner Anwendung hinzubekommen. ohne ein terminal scheint omxplayer gar nicht zu starten. dafür gibt es nach googlen eine Abhilfe:

    lxterminal -e omxplayer -b "Video.avi"

    das nehme ich als Grundlage und schreibe das so in eine shell-Datei:

    #!/bin/sh
    echo "File: $1"
    lxterminal -e omxplayer -b -o both $1
    

    ich starte diese shelldatei im Terminal und übergebe ihr eine Videodatei...funktioniert.

    jetzt zum GTK-Programm:

    bool Exec(string command,string parameters,string file)
    {
      bool ret=true;
    
        //char params[] = "vlc -f --play-and-exit --key-quit=esc --volume=256"; // wichtig! Erster Parameter ist a$
        char params[command.size()+1+parameters.size()+1];
        char file_char[file.size()];
    
        strcpy(params,command.c_str());
        strcat(params," ");
        strcat(params,parameters.c_str());
        //g_print("Params: %s\n",params);
    
        strcpy(file_char,file.c_str());
    
        size_t number_of_params = 0;//was 1
        for(char *p = params; *p; ++p) {
          if(*p == ' ') {
            ++number_of_params;
          }
        }
        number_of_params++;//increase Param-count to hold file
        //g_print("Parameter-Anzahl: %d\n",number_of_params);
        char **args = (char**)malloc( (number_of_params+1) * sizeof(*args));
        if(!args) {
          perror("malloc");
          ret=false;
          //_Exit(1);
        }
        size_t i = 1;
        args[0] = params;
        for(char *p = params; *p; ++p) {
          if(*p == ' ') {
            assert(i < number_of_params);
            args[i++] = p+1;
            *p = '\0';
          }
        }
        args[number_of_params-1] = file_char;
        args[number_of_params] = NULL;
      pid_t pid=fork();  
      if (pid==-1)
      {
        g_print("problem while forking\n");//return false; //problem while forking
        ret=false;
      }else if (pid==0)//child-process
      {
        if(execvp(command.c_str(), args) == -1) 
        {
          perror("execvp");
          _Exit(EXIT_FAILURE);//errors in child are handled by signal-handler
        }
      } else 
      {
        //parent process
        struct sigaction sa;
        sigemptyset(&sa.sa_mask);
        sa.sa_flags = SA_RESTART | SA_NOCLDSTOP;
        sa.sa_handler = child_callback;
        sigaction(SIGCHLD, &sa, NULL); 
      }
      return ret;
    }
    

    diese Funktion rufe ich auf mit der shelldatei als command, leerstring als parameter und file die Videodatei mit pfad.

    Das Video läuft los, aber ich kann omxplayer nicht mittels Tastatur bedienen. So langsam habe ich keine Idee mehr, was ich noch verändern könnte.
    mit "system()" ist es das gleiche Phänomen. Da OMX-Player im Vollbild läuft ist ein debugging auch recht schwierig (die --win-option scheint nicht zu funktionieren).

    ich habe das gefühl, dass das Terminal (vom Z-Index [Fensterreihenfolge]) hinter meinem GTK-Programm liegt und somit mein Programm die Eingabe bekommt statt das Terminal.

    ps auxf sieht eigentlich gut aus:

    lxterminal
    \_ gnome-pty-helper
    \_ /bin/bash
    |   \_ iceweasel
    |   \_ mediaselector
    \_ /bin/bash
    \_ /bin/bash /usr/bin/omxplayer -b /home/frank/Video.avi
       \_ /usr/bin/omxplayer.bin -b /home/frank/Video.avi
    

    die Fensterreihenfolge unter X zeigt es natürlich nicht an und sehen kann ichs nicht, da das Fenster von OMX-Player alles verdeckt.

    hat jemand von euch noch eine Idee?

    Gruß Frank



  • ich habe das gefühl, dass das Terminal (vom Z-Index [Fensterreihenfolge]) hinter meinem GTK-Programm liegt und somit mein Programm die Eingabe bekommt statt das Terminal.

    Genau das ist auch meine Vermutung.

    Vielleicht hilft dir das hier weiter:
    http://www.c-plusplus.net/forum/305816-full



  • ich bin bisschen weiter gekommen...
    so wie es aussieht kommt omxplayer nicht damit klar, dass 2 terminals gestartet sind.
    ich habe jetzt meine GTK-Anwendung direkt gestartet (nicht aus terminal heraus) und schon funktioniert es.

    vielleicht liest das einer, der ein ähnliches Phänomen hat oder am besten die Programmierer des omxplayer 😉


Log in to reply