is it possible to:

  * use ecore_pipe ?
  * use eina_lock instead of pthread ?

we have written all that stuff to make the EFL cross platform.

Vincent

On Mon, 5 Sep 2011, Enlightenment SVN wrote:

> Log:
> emotion/generic - Use pipes instead of stdin/stdout for communication.
>
>  Now the player will have the stdin and stdout available for anything
>  else, and there's no need to make line-buffering with ecore_exe anymore.
>
> Author:       antognolli
> Date:         2011-09-05 06:12:17 -0700 (Mon, 05 Sep 2011)
> New Revision: 63198
> Trac:         http://trac.enlightenment.org/e/changeset/63198
>
> Modified:
>  trunk/emotion/src/generic_players/vlc/emotion_generic_vlc.c 
> trunk/emotion/src/modules/generic/emotion_generic.c 
> trunk/emotion/src/modules/generic/emotion_generic.h
>
> Modified: trunk/emotion/src/generic_players/vlc/emotion_generic_vlc.c
> ===================================================================
> --- trunk/emotion/src/generic_players/vlc/emotion_generic_vlc.c       
> 2011-09-05 13:11:53 UTC (rev 63197)
> +++ trunk/emotion/src/generic_players/vlc/emotion_generic_vlc.c       
> 2011-09-05 13:12:17 UTC (rev 63198)
> @@ -36,8 +36,10 @@
>      char *filename;
>      char *shmname;
>      int w, h;
> -     int fd_read;
> -     int fd_write;
> +     int fd_read; // read commands from theads here
> +     int fd_write; // write commands from threads here
> +     int em_read; // read commands from emotion here
> +     int em_write; // write commands to emotion here
>      int size_sent;
>      int opening;
>      int closing;
> @@ -121,13 +123,13 @@
> }
>
> static int
> -_em_str_read(char **str)
> +_em_str_read(int fd, char **str)
> {
>    int size;
>    int r;
>    char buf[PATH_MAX];
>
> -   r = _em_read_safe(STDIN_FILENO, &size, sizeof(size));
> +   r = _em_read_safe(fd, &size, sizeof(size));
>    if (!r)
>      {
>         *str = NULL;
> @@ -140,7 +142,7 @@
>         return 1;
>      }
>
> -   r = _em_read_safe(STDIN_FILENO, buf, size);
> +   r = _em_read_safe(fd, buf, size);
>    if (!r)
>      {
>         *str = NULL;
> @@ -152,86 +154,84 @@
> }
>
> static int
> -_em_cmd_read(void)
> +_em_cmd_read(struct _App *app)
> {
>    int cmd;
> -   _em_read_safe(STDIN_FILENO, &cmd, sizeof(cmd));
> +   _em_read_safe(app->em_read, &cmd, sizeof(cmd));
>
>    return cmd;
> }
>
> static void
> -_send_cmd_start(int cmd)
> +_send_cmd_start(struct _App *app, int cmd)
> {
>    pthread_mutex_lock(&_mutex_fd);
> -   _em_write_safe(STDOUT_FILENO, &cmd, sizeof(cmd));
> +   _em_write_safe(app->em_write, &cmd, sizeof(cmd));
> }
>
> static void
> -_send_cmd_finish(void)
> +_send_cmd_finish(struct _App *app)
> {
> -   static const char c = '\n';
> -   _em_write_safe(STDOUT_FILENO, &c, sizeof(c));
>    pthread_mutex_unlock(&_mutex_fd);
> }
>
> static void
> -_send_cmd(int cmd)
> +_send_cmd(struct _App *app, int cmd)
> {
> -   _send_cmd_start(cmd);
> -   _send_cmd_finish();
> +   _send_cmd_start(app, cmd);
> +   _send_cmd_finish(app);
> }
>
> static void
> -_send_cmd_str(const char *str)
> +_send_cmd_str(struct _App *app, const char *str)
> {
>    int len;
>    len = strlen(str) + 1;
> -   _em_write_safe(STDOUT_FILENO, &len, sizeof(len));
> -   _em_write_safe(STDOUT_FILENO, str, len);
> +   _em_write_safe(app->em_write, &len, sizeof(len));
> +   _em_write_safe(app->em_write, str, len);
> }
>
> -#define SEND_CMD_PARAM(i) \
> -   _em_write_safe(STDOUT_FILENO, &(i), sizeof((i)));
> +#define SEND_CMD_PARAM(app, i) \
> +   _em_write_safe((app)->em_write, &(i), sizeof((i)));
>
> static void
> -_send_resize(int width, int height)
> +_send_resize(struct _App *app, int width, int height)
> {
> -   _send_cmd_start(EM_RESULT_FRAME_SIZE);
> -   SEND_CMD_PARAM(width);
> -   SEND_CMD_PARAM(height);
> -   _send_cmd_finish();
> +   _send_cmd_start(app, EM_RESULT_FRAME_SIZE);
> +   SEND_CMD_PARAM(app, width);
> +   SEND_CMD_PARAM(app, height);
> +   _send_cmd_finish(app);
> }
>
> static void
> -_send_length_changed(const struct libvlc_event_t *ev)
> +_send_length_changed(struct _App *app, const struct libvlc_event_t *ev)
> {
>    float length = ev->u.media_player_length_changed.new_length;
>    length /= 1000;
>
>    fprintf(stderr, "length changed: %0.3f\n", length);
> -   _send_cmd_start(EM_RESULT_LENGTH_CHANGED);
> -   SEND_CMD_PARAM(length);
> -   _send_cmd_finish();
> +   _send_cmd_start(app, EM_RESULT_LENGTH_CHANGED);
> +   SEND_CMD_PARAM(app, length);
> +   _send_cmd_finish(app);
> }
>
> static void
> -_send_time_changed(const struct libvlc_event_t *ev)
> +_send_time_changed(struct _App *app, const struct libvlc_event_t *ev)
> {
>    float new_time = ev->u.media_player_time_changed.new_time;
>    new_time /= 1000;
> -   _send_cmd_start(EM_RESULT_POSITION_CHANGED);
> -   SEND_CMD_PARAM(new_time);
> -   _send_cmd_finish();
> +   _send_cmd_start(app, EM_RESULT_POSITION_CHANGED);
> +   SEND_CMD_PARAM(app, new_time);
> +   _send_cmd_finish(app);
> }
>
> static void
> -_send_seekable_changed(const struct libvlc_event_t *ev)
> +_send_seekable_changed(struct _App *app, const struct libvlc_event_t *ev)
> {
>    int seekable = ev->u.media_player_seekable_changed.new_seekable;
> -   _send_cmd_start(EM_RESULT_SEEKABLE_CHANGED);
> -   SEND_CMD_PARAM(seekable);
> -   _send_cmd_finish();
> +   _send_cmd_start(app, EM_RESULT_SEEKABLE_CHANGED);
> +   SEND_CMD_PARAM(app, seekable);
> +   _send_cmd_finish(app);
> }
>
> static void *
> @@ -270,7 +270,7 @@
>    if (!app->playing)
>      return;
>
> -   _send_cmd(EM_RESULT_FRAME_NEW);
> +   _send_cmd(app, EM_RESULT_FRAME_NEW);
> }
>
> static void *
> @@ -298,7 +298,7 @@
>    if (!app->mp)
>      return;
>
> -   _em_read_safe(STDIN_FILENO, &pos, sizeof(pos));
> +   _em_read_safe(app->em_read, &pos, sizeof(pos));
>
>    if (app->playing)
>      {
> @@ -325,14 +325,14 @@
> {
>    app->closing = 0;
>    emotion_generic_shm_free(app->vs);
> -   _send_cmd(EM_RESULT_FILE_CLOSE);
> +   _send_cmd(app, EM_RESULT_FILE_CLOSE);
> }
>
> static void
> _send_file_set(struct _App *app)
> {
>    if (app->opening)
> -      _send_cmd(EM_RESULT_FILE_SET);
> +      _send_cmd(app, EM_RESULT_FILE_SET);
>
>    if (app->closing)
>      _send_file_closed(app);
> @@ -346,26 +346,26 @@
>
>    switch (ev->type) {
>       case libvlc_MediaPlayerTimeChanged:
> -      _send_time_changed(ev);
> +      _send_time_changed(app, ev);
>        break;
>       case libvlc_MediaPlayerPositionChanged:
>        thread_event = EM_THREAD_POSITION_CHANGED;
>        write(app->fd_write, &thread_event, sizeof(thread_event));
>        break;
>       case libvlc_MediaPlayerLengthChanged:
> -      _send_length_changed(ev);
> +      _send_length_changed(app, ev);
>        break;
>       case libvlc_MediaPlayerSeekableChanged:
> -      _send_seekable_changed(ev);
> +      _send_seekable_changed(app, ev);
>        break;
>       case libvlc_MediaPlayerPlaying:
> -      _send_resize(app->w, app->h);
> +      _send_resize(app, app->w, app->h);
>        break;
>       case libvlc_MediaPlayerStopped:
>        _send_file_set(app);
>        break;
>       case libvlc_MediaPlayerEndReached:
> -      _send_cmd(EM_RESULT_PLAYBACK_STOPPED);
> +      _send_cmd(app, EM_RESULT_PLAYBACK_STOPPED);
>        break;
>    }
> }
> @@ -373,7 +373,7 @@
> static void
> _file_set(struct _App *app)
> {
> -   _em_str_read(&app->filename);
> +   _em_str_read(app->em_read, &app->filename);
>
>    app->m = libvlc_media_new_path(app->libvlc, app->filename);
>    if (!app->m)
> @@ -411,7 +411,7 @@
>      return;
>
>    float position;
> -   _em_read_safe(STDIN_FILENO, &position, sizeof(position));
> +   _em_read_safe(app->em_read, &position, sizeof(position));
>
>    libvlc_time_t new_time = position * 1000;
>    libvlc_media_player_set_time(app->mp, new_time);
> @@ -425,7 +425,7 @@
>    if (!app->mp)
>      return;
>
> -   _em_read_safe(STDIN_FILENO, &rate, sizeof(rate));
> +   _em_read_safe(app->em_read, &rate, sizeof(rate));
>
>    libvlc_media_player_set_rate(app->mp, rate);
> }
> @@ -438,7 +438,7 @@
>    if (!app->mp)
>      return;
>
> -   _em_read_safe(STDIN_FILENO, &mute, sizeof(mute));
> +   _em_read_safe(app->em_read, &mute, sizeof(mute));
>
>    libvlc_audio_set_mute(app->mp, mute);
> }
> @@ -452,7 +452,7 @@
>    if (!app->mp)
>      return;
>
> -   _em_read_safe(STDIN_FILENO, &volume, sizeof(volume));
> +   _em_read_safe(app->em_read, &volume, sizeof(volume));
>    vol = volume * 100;
>
>    libvlc_audio_set_volume(app->mp, vol);
> @@ -463,7 +463,7 @@
> {
>    int track;
>
> -   _em_read_safe(STDIN_FILENO, &track, sizeof(track));
> +   _em_read_safe(app->em_read, &track, sizeof(track));
>
>    libvlc_audio_set_track(app->mp, track);
> }
> @@ -484,9 +484,9 @@
>       app->filename = NULL;
>       app->m = NULL;
>       app->mp = NULL;
> -     _send_cmd_start(EM_RESULT_FILE_SET_DONE);
> -     SEND_CMD_PARAM(r);
> -     _send_cmd_finish();
> +     _send_cmd_start(app, EM_RESULT_FILE_SET_DONE);
> +     SEND_CMD_PARAM(app, r);
> +     _send_cmd_finish(app);
>      }
>    app->w = app->vs->width;
>    app->h = app->vs->height;
> @@ -505,9 +505,9 @@
>
>    libvlc_audio_set_mute(app->mp, 0);
>
> -   _send_cmd_start(EM_RESULT_FILE_SET_DONE);
> -   SEND_CMD_PARAM(r);
> -   _send_cmd_finish();
> +   _send_cmd_start(app, EM_RESULT_FILE_SET_DONE);
> +   SEND_CMD_PARAM(app, r);
> +   _send_cmd_finish(app);
> }
>
> static void
> @@ -534,7 +534,7 @@
> static void
> _process_emotion_commands(struct _App *app)
> {
> -   int cmd = _em_cmd_read();
> +   int cmd = _em_cmd_read(app);
>    switch (cmd) {
>       case EM_CMD_FILE_SET:
>        _file_set(app);
> @@ -570,27 +570,27 @@
> }
>
> static void
> -_send_track_info(libvlc_media_player_t *mp)
> +_send_track_info(struct _App *app)
> {
>    int track_count, current;
>    libvlc_track_description_t *desc;
>
> -   current = libvlc_audio_get_track(mp);
> -   track_count = libvlc_audio_get_track_count(mp);
> -   desc = libvlc_audio_get_track_description(mp);
> +   current = libvlc_audio_get_track(app->mp);
> +   track_count = libvlc_audio_get_track_count(app->mp);
> +   desc = libvlc_audio_get_track_description(app->mp);
>
> -   _send_cmd_start(EM_RESULT_AUDIO_TRACK_INFO);
> -   SEND_CMD_PARAM(current);
> -   SEND_CMD_PARAM(track_count);
> +   _send_cmd_start(app, EM_RESULT_AUDIO_TRACK_INFO);
> +   SEND_CMD_PARAM(app, current);
> +   SEND_CMD_PARAM(app, track_count);
>    while (desc)
>      {
>       int tid = desc->i_id;
>       const char *name = desc->psz_name;
> -     SEND_CMD_PARAM(tid);
> -     _send_cmd_str(name);
> +     SEND_CMD_PARAM(app, tid);
> +     _send_cmd_str(app, name);
>       desc = desc->p_next;
>      }
> -   _send_cmd_finish();
> +   _send_cmd_finish(app);
> }
>
> static void
> @@ -604,10 +604,10 @@
>    r = libvlc_video_get_size(app->mp, 0, &w, &h);
>    if (r < 0)
>      return;
> -   _send_resize(w, h);
> +   _send_resize(app, w, h);
>
>    /* sending audio track info */
> -   // _send_track_info(app->mp);
> +   // _send_track_info(app);
>
>    libvlc_media_player_stop(app->mp);
> }
> @@ -657,6 +657,18 @@
>       chroma
>      };
>
> +   if (argc < 3)
> +     {
> +     fprintf(stderr, "player: missing paramters.\n");
> +     fprintf(stderr, "syntax:\n\t%s <fd read> <fd write>\n", argv[0]);
> +     return -1;
> +     }
> +
> +   app.em_read = atoi(argv[1]);
> +   app.em_write = atoi(argv[2]);
> +
> +   fprintf(stderr, "reading commands from fd: %d, writing on fd: %d\n", 
> app.em_read, app.em_write);
> +
>    int vlc_argc = sizeof(vlc_argv) / sizeof(*vlc_argv);
>    snprintf(cwidth, sizeof(cwidth), "%d", DEFAULTWIDTH);
>    snprintf(cheight, sizeof(cheight), "%d", DEFAULTHEIGHT);
> @@ -684,23 +696,23 @@
>    app.playing = 0;
>    app.closing = 0;
>
> -   if (_em_cmd_read() != EM_CMD_INIT)
> +   if (_em_cmd_read(&app) != EM_CMD_INIT)
>      {
>       fprintf(stderr, "player: wrong init command!\n");
>       return -1;
>      }
>
>    int size;
> -   _em_read_safe(STDIN_FILENO, &size, sizeof(size));
> -   _em_read_safe(STDIN_FILENO, buf, size);
> +   _em_read_safe(app.em_read, &size, sizeof(size));
> +   _em_read_safe(app.em_read, buf, size);
>    app.shmname = strdup(buf);
>
> -   _send_cmd(EM_RESULT_INIT);
> +   _send_cmd(&app, EM_RESULT_INIT);
>
>    pipe(tpipe);
>    app.fd_read = tpipe[0];
>    app.fd_write = tpipe[1];
> -   fds[0].fd = STDIN_FILENO;
> +   fds[0].fd = app.em_read;
>    fds[0].events = POLLIN;
>    fds[1].fd = app.fd_read;
>    fds[1].events = POLLIN;
>
> Modified: trunk/emotion/src/modules/generic/emotion_generic.c
> ===================================================================
> --- trunk/emotion/src/modules/generic/emotion_generic.c       2011-09-05 
> 13:11:53 UTC (rev 63197)
> +++ trunk/emotion/src/modules/generic/emotion_generic.c       2011-09-05 
> 13:12:17 UTC (rev 63198)
> @@ -103,19 +103,19 @@
>       ERR("invalid command to player.");
>       return;
>      }
> -   ecore_exe_send(ev->player.exe, &cmd, sizeof(cmd));
> +   write(ev->fd_write, &cmd, sizeof(cmd));
> }
>
> static void
> _player_send_int(Emotion_Generic_Video *ev, int number)
> {
> -   ecore_exe_send(ev->player.exe, &number, sizeof(number));
> +   write(ev->fd_write, &number, sizeof(number));
> }
>
> static void
> _player_send_float(Emotion_Generic_Video *ev, float number)
> {
> -   ecore_exe_send(ev->player.exe, &number, sizeof(number));
> +   write(ev->fd_write, &number, sizeof(number));
> }
>
> static void
> @@ -127,8 +127,8 @@
>      len = eina_stringshare_strlen(str) + 1;
>    else
>      len = strlen(str) + 1;
> -   ecore_exe_send(ev->player.exe, &len, sizeof(len));
> -   ecore_exe_send(ev->player.exe, str, len);
> +   write(ev->fd_write, &len, sizeof(len));
> +   write(ev->fd_write, str, len);
> }
>
> static Eina_Bool
> @@ -234,31 +234,94 @@
>    _file_open(ev);
> }
>
> -#define RCV_CMD_PARAM(src, param) \
> -   memcpy(&(param), (src), sizeof((param))); \
> -   (src) = (char *)(src) + sizeof((param));
> +static int
> +_em_read_safe(int fd, void *buf, ssize_t size)
> +{
> +   ssize_t todo;
> +   char *p;
>
> -#define RCV_CMD_STR(src, buf, len) \
> -   RCV_CMD_PARAM((src), (len)); \
> -   memcpy((buf), (src), (len)); \
> -   (src) = (char *)(src) + len;
> +   todo = size;
> +   p = buf;
>
> -static int
> -_player_int_read(Emotion_Generic_Video *ev __UNUSED__, void **data)
> +   while (todo > 0)
> +     {
> +        ssize_t r;
> +
> +        r = read(fd, p, todo);
> +        if (r > 0)
> +          {
> +             todo -= r;
> +             p += r;
> +          }
> +        else if (r == 0)
> +          return 0;
> +        else
> +          {
> +             if (errno == EINTR || errno == EAGAIN)
> +               continue;
> +             else
> +               {
> +                  ERR("could not read from fd %d: %s", fd, strerror(errno));
> +                  return 0;
> +               }
> +          }
> +     }
> +
> +   return 1;
> +}
> +
> +static Eina_Bool
> +_player_int_read(Emotion_Generic_Video *ev, int *i)
> {
> -   int number;
> -   memcpy(&number, *data, sizeof(number));
> -   *data = (char *)(*data) + sizeof(number);
> +   int n;
> +   n = _em_read_safe(ev->fd_read, i, sizeof(*i));
> +   if (n <= 0)
> +     {
> +     ERR("could not read int from fd_read %d\n", ev->fd_read);
> +     return EINA_FALSE;
> +     }
>
> -   return number;
> +   return EINA_TRUE;
> }
>
> +static Eina_Bool
> +_player_float_read(Emotion_Generic_Video *ev, float *f)
> +{
> +   int n;
> +   n = _em_read_safe(ev->fd_read, f, sizeof(*f));
> +   if (n <= 0)
> +     {
> +     ERR("could not read float from fd_read %d\n", ev->fd_read);
> +     return EINA_FALSE;
> +     }
> +
> +   return EINA_TRUE;
> +}
> +
> +static Eina_Bool
> +_player_str_read(Emotion_Generic_Video *ev, char *str, int *len)
> +{
> +   int n;
> +
> +   if (!_player_int_read(ev, len))
> +     return EINA_FALSE;
> +
> +   n = _em_read_safe(ev->fd_read, str, *len);
> +   if (n <= 0)
> +     {
> +     ERR("could not read string from fd_read %d\n", ev->fd_read);
> +     return EINA_FALSE;
> +     }
> +
> +   return EINA_TRUE;
> +}
> +
> static void
> -_player_frame_resize(Emotion_Generic_Video *ev, void *line)
> +_player_frame_resize(Emotion_Generic_Video *ev)
> {
>    int w, h;
> -   RCV_CMD_PARAM(line, w);
> -   RCV_CMD_PARAM(line, h);
> +   _player_int_read(ev, &w);
> +   _player_int_read(ev, &h);
>
>    INF("received frame resize: %dx%d", w, h);
>    ev->w = w;
> @@ -272,10 +335,10 @@
> }
>
> static void
> -_player_length_changed(Emotion_Generic_Video *ev, void *line)
> +_player_length_changed(Emotion_Generic_Video *ev)
> {
>    float length;
> -   RCV_CMD_PARAM(line, length);
> +   _player_float_read(ev, &length);
>
>    INF("received length changed: %0.3f", length);
>
> @@ -284,10 +347,10 @@
> }
>
> static void
> -_player_position_changed(Emotion_Generic_Video *ev, void *line)
> +_player_position_changed(Emotion_Generic_Video *ev)
> {
>    float position;
> -   RCV_CMD_PARAM(line, position);
> +   _player_float_read(ev, &position);
>
>    INF("received position changed: %0.3f", position);
>
> @@ -305,10 +368,10 @@
> }
>
> static void
> -_player_seekable_changed(Emotion_Generic_Video *ev, void *line)
> +_player_seekable_changed(Emotion_Generic_Video *ev)
> {
>    int seekable;
> -   RCV_CMD_PARAM(line, seekable);
> +   _player_int_read(ev, &seekable);
>
>    INF("received seekable changed: %d", seekable);
>
> @@ -318,10 +381,10 @@
> }
>
> static void
> -_player_volume(Emotion_Generic_Video *ev, void *line)
> +_player_volume(Emotion_Generic_Video *ev)
> {
>    float vol, oldvol;
> -   RCV_CMD_PARAM(line, vol);
> +   _player_float_read(ev, &vol);
>
>    INF("received volume: %0.3f", vol);
>
> @@ -332,10 +395,10 @@
> }
>
> static void
> -_player_audio_mute(Emotion_Generic_Video *ev, void *line)
> +_player_audio_mute(Emotion_Generic_Video *ev)
> {
>    int mute;
> -   RCV_CMD_PARAM(line, mute);
> +   _player_int_read(ev, &mute);
>
>    INF("received audio mute: %d", mute);
>
> @@ -353,7 +416,7 @@
> }
>
> static void
> -_player_audio_tracks_info(Emotion_Generic_Video *ev, void *line)
> +_player_audio_tracks_info(Emotion_Generic_Video *ev)
> {
>    int track_current, tracks_count;
>    int i;
> @@ -361,8 +424,8 @@
>    if (ev->audio_channels_count)
>      _audio_channels_free(ev);
>
> -   RCV_CMD_PARAM(line, track_current);
> -   RCV_CMD_PARAM(line, tracks_count);
> +   _player_int_read(ev, &track_current);
> +   _player_int_read(ev, &tracks_count);
>    INF("video with %d audio tracks (current = %d):", tracks_count, 
> track_current);
>    ev->audio_channels = calloc(
>       tracks_count, sizeof(Emotion_Generic_Audio_Channel));
> @@ -372,8 +435,8 @@
>      {
>       int tid, len;
>       char buf[PATH_MAX];
> -     RCV_CMD_PARAM(line, tid);
> -     RCV_CMD_STR(line, buf, len);
> +     _player_int_read(ev, &tid);
> +     _player_str_read(ev, buf, &len);
>       ev->audio_channels[i].id = tid;
>       ev->audio_channels[i].name = eina_stringshare_add_length(buf, len);
>       INF("\t%d: %s", tid, buf);
> @@ -393,12 +456,12 @@
> }
>
> static void
> -_player_open_done(Emotion_Generic_Video *ev, void *line)
> +_player_open_done(Emotion_Generic_Video *ev)
> {
>    int success;
>
>    ev->opening = EINA_FALSE;
> -   RCV_CMD_PARAM(line, success);
> +   _player_int_read(ev, &success);
>
>    shm_unlink(ev->shmname);
>    if (!success)
> @@ -419,11 +482,16 @@
> }
>
> static void
> -_player_read_cmd(Emotion_Generic_Video *ev, void *line, int size __UNUSED__)
> +_player_read_cmd(Emotion_Generic_Video *ev)
> {
>    int type;
> -   RCV_CMD_PARAM(line, type);
>
> +   if (!_player_int_read(ev, &type))
> +     {
> +     ERR("could not read command\n");
> +     return;
> +     }
> +
>    switch (type) {
>       case EM_RESULT_INIT:
>        _player_ready(ev);
> @@ -435,7 +503,7 @@
>        _player_file_set_done(ev);
>        break;
>       case EM_RESULT_FILE_SET_DONE:
> -      _player_open_done(ev, line);
> +      _player_open_done(ev);
>        break;
>       case EM_RESULT_FILE_CLOSE:
>        _player_file_closed(ev);
> @@ -444,27 +512,41 @@
>        _emotion_playback_finished(ev->obj);
>        break;
>       case EM_RESULT_FRAME_SIZE:
> -      _player_frame_resize(ev, line);
> +      _player_frame_resize(ev);
>        break;
>       case EM_RESULT_LENGTH_CHANGED:
> -      _player_length_changed(ev, line);
> +      _player_length_changed(ev);
>        break;
>       case EM_RESULT_POSITION_CHANGED:
> -      _player_position_changed(ev, line);
> +      _player_position_changed(ev);
>        break;
>       case EM_RESULT_SEEKABLE_CHANGED:
> -      _player_seekable_changed(ev, line);
> +      _player_seekable_changed(ev);
>        break;
>       case EM_RESULT_AUDIO_TRACK_INFO:
> -      _player_audio_tracks_info(ev, line);
> +      _player_audio_tracks_info(ev);
>        break;
>       default:
>        WRN("received wrong command: %d", type);
>    };
> }
>
> -#undef RCV_CMD_PARAM
> +static Eina_Bool
> +_player_cmd_handler_cb(void *data, Ecore_Fd_Handler *fd_handler)
> +{
> +   Emotion_Generic_Video *ev = data;
>
> +   if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_ERROR))
> +     {
> +     ERR("an error occurred on fd_read %d.", ev->fd_read);
> +     return ECORE_CALLBACK_CANCEL;
> +     }
> +
> +   _player_read_cmd(ev);
> +
> +   return ECORE_CALLBACK_RENEW;
> +}
> +
> static Eina_Bool
> _player_data_cb(void *data, int type __UNUSED__, void *event)
> {
> @@ -485,7 +567,7 @@
>      }
>
>    for (i = 0; ev->lines[i].line; i++)
> -     _player_read_cmd(evideo, ev->lines[i].line, ev->lines[i].size);
> +     INF("received input from player: \"%s\"", ev->lines[i].line);
>
>    return ECORE_CALLBACK_DONE;
> }
> @@ -517,14 +599,71 @@
>
>    ev->player.exe = NULL;
>    ev->ready = EINA_FALSE;
> +   ecore_main_fd_handler_del(ev->fd_handler);
> +   close(ev->fd_read);
> +   close(ev->fd_write);
> +   ev->fd_read = -1;
> +   ev->fd_write = -1;
>    _emotion_decode_stop(ev->obj);
>
>    return ECORE_CALLBACK_DONE;
> }
>
> static Eina_Bool
> -_fork_and_exec(Evas_Object *obj __UNUSED__, Emotion_Generic_Video *ev)
> +_player_exec(Emotion_Generic_Video *ev)
> {
> +   int pipe_out[2];
> +   int pipe_in[2];
> +   char buf[PATH_MAX];
> +
> +   if (pipe(pipe_out) == -1)
> +     {
> +     ERR("could not create pipe for communication emotion -> player: %s", 
> strerror(errno));
> +     return EINA_FALSE;
> +     }
> +
> +   if (pipe(pipe_in) == -1)
> +     {
> +     ERR("could not create pipe for communication player -> emotion: %s", 
> strerror(errno));
> +     close(pipe_out[0]);
> +     close(pipe_out[1]);
> +     return EINA_FALSE;
> +     }
> +
> +   snprintf(buf, sizeof(buf), "%s %d %d\n", ev->cmdline, pipe_out[0], 
> pipe_in[1]);
> +
> +   ev->player.exe = ecore_exe_pipe_run(
> +      buf,
> +      ECORE_EXE_PIPE_READ | ECORE_EXE_PIPE_WRITE |
> +      ECORE_EXE_PIPE_READ_LINE_BUFFERED | ECORE_EXE_NOT_LEADER,
> +      ev);
> +
> +   INF("created pipe emotion -> player: %d -> %d\n", pipe_out[1], 
> pipe_out[0]);
> +   INF("created pipe player -> emotion: %d -> %d\n", pipe_in[1], pipe_in[0]);
> +
> +   close(pipe_in[1]);
> +   close(pipe_out[0]);
> +
> +   if (!ev->player.exe)
> +     {
> +     close(pipe_in[0]);
> +     close(pipe_out[1]);
> +     return EINA_FALSE;
> +     }
> +
> +   ev->fd_read = pipe_in[0];
> +   ev->fd_write = pipe_out[1];
> +
> +   ev->fd_handler = ecore_main_fd_handler_add(
> +      ev->fd_read, ECORE_FD_READ | ECORE_FD_ERROR, _player_cmd_handler_cb, 
> ev,
> +      NULL, NULL);
> +
> +   return EINA_TRUE;
> +}
> +
> +static Eina_Bool
> +_fork_and_exec(Evas_Object *obj, Emotion_Generic_Video *ev)
> +{
>    char shmname[256];
>    struct timeval tv;
>
> @@ -541,13 +680,8 @@
>    ev->player_data = ecore_event_handler_add(
>       ECORE_EXE_EVENT_DATA, _player_data_cb, ev);
>
> -   ev->player.exe = ecore_exe_pipe_run(
> -      ev->cmdline,
> -      ECORE_EXE_PIPE_READ | ECORE_EXE_PIPE_WRITE |
> -      ECORE_EXE_PIPE_READ_LINE_BUFFERED | ECORE_EXE_NOT_LEADER,
> -      ev);
>
> -   if (!ev->player.exe)
> +   if (!_player_exec(ev))
>      {
>         ERR("could not start player.");
>         return EINA_FALSE;
> @@ -571,6 +705,8 @@
>    ev = (Emotion_Generic_Video *)calloc(1, sizeof(*ev));
>    if (!ev) return 0;
>
> +   ev->fd_read = -1;
> +   ev->fd_write = -1;
>    ev->speed = 1.0;
>    ev->volume = 0.5;
>    ev->audio_mute = EINA_FALSE;
> @@ -599,6 +735,13 @@
>    if (ev->shared)
>      munmap(ev->shared, ev->shared->size);
>
> +   if (ev->fd_read >= 0)
> +     close(ev->fd_read);
> +   if (ev->fd_write >= 0)
> +     close(ev->fd_write);
> +   if (ev->fd_handler)
> +     ecore_main_fd_handler_del(ev->fd_handler);
> +
>    _audio_channels_free(ev);
>
>    eina_stringshare_del(ev->cmdline);
> @@ -681,13 +824,7 @@
>       return;
>      }
>
> -   ev->player.exe = ecore_exe_pipe_run(
> -      ev->cmdline,
> -      ECORE_EXE_PIPE_READ | ECORE_EXE_PIPE_WRITE |
> -      ECORE_EXE_PIPE_READ_LINE_BUFFERED | ECORE_EXE_NOT_LEADER,
> -      ev);
> -
> -   if (!ev->player.exe)
> +   if (!_player_exec(ev))
>      ERR("could not start player.");
> }
>
>
> Modified: trunk/emotion/src/modules/generic/emotion_generic.h
> ===================================================================
> --- trunk/emotion/src/modules/generic/emotion_generic.h       2011-09-05 
> 13:11:53 UTC (rev 63197)
> +++ trunk/emotion/src/modules/generic/emotion_generic.h       2011-09-05 
> 13:12:17 UTC (rev 63198)
> @@ -29,6 +29,8 @@
>    Emotion_Generic_Player    player;
>    Ecore_Event_Handler             *player_add, *player_del, *player_data;
>    int                             drop;
> +   int                            fd_read, fd_write;
> +   Ecore_Fd_Handler       *fd_handler;
>
>    const char              *filename;
>    volatile double         len;
>
>
> ------------------------------------------------------------------------------
> Special Offer -- Download ArcSight Logger for FREE!
> Finally, a world-class log management solution at an even better
> price-free! And you'll get a free "Love Thy Logs" t-shirt when you
> download Logger. Secure your free ArcSight Logger TODAY!
> http://p.sf.net/sfu/arcsisghtdev2dev
> _______________________________________________
> enlightenment-svn mailing list
> enlightenment-...@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/enlightenment-svn
>
>

------------------------------------------------------------------------------
Special Offer -- Download ArcSight Logger for FREE!
Finally, a world-class log management solution at an even better 
price-free! And you'll get a free "Love Thy Logs" t-shirt when you
download Logger. Secure your free ArcSight Logger TODAY!
http://p.sf.net/sfu/arcsisghtdev2dev
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to