Emotion: remove unused var on generic
[profile/ivi/emotion.git] / src / modules / generic / emotion_generic.c
index a9f175c..b67a78b 100644 (file)
@@ -1,14 +1,18 @@
 #ifdef HAVE_CONFIG_H
 # include "config.h"
 #endif
+
 #include <sys/mman.h>
 #include <sys/stat.h>
 #include <sys/time.h>
 #include <sys/types.h>
 #include <fcntl.h>
 #include <unistd.h>
+#include <errno.h>
+
 #include <Eina.h>
 #include <Evas.h>
+#include <Ecore.h>
 
 #include "Emotion.h"
 #include "emotion_private.h"
@@ -103,19 +107,19 @@ _player_send_cmd(Emotion_Generic_Video *ev, int cmd)
        ERR("invalid command to player.");
        return;
      }
-   write(ev->fd_write, &cmd, sizeof(cmd));
+   if (write(ev->fd_write, &cmd, sizeof(cmd)) < 0) perror("write");
 }
 
 static void
 _player_send_int(Emotion_Generic_Video *ev, int number)
 {
-   write(ev->fd_write, &number, sizeof(number));
+   if (write(ev->fd_write, &number, sizeof(number)) < 0) perror("write");
 }
 
 static void
 _player_send_float(Emotion_Generic_Video *ev, float number)
 {
-   write(ev->fd_write, &number, sizeof(number));
+   if (write(ev->fd_write, &number, sizeof(number)) < 0) perror("write");
 }
 
 static void
@@ -127,8 +131,8 @@ _player_send_str(Emotion_Generic_Video *ev, const char *str, Eina_Bool stringsha
      len = eina_stringshare_strlen(str) + 1;
    else
      len = strlen(str) + 1;
-   write(ev->fd_write, &len, sizeof(len));
-   write(ev->fd_write, str, len);
+   if (write(ev->fd_write, &len, sizeof(len)) < 0) perror("write");
+   if (write(ev->fd_write, str, len) < 0) perror("write");
 }
 
 static Eina_Bool
@@ -161,7 +165,7 @@ _create_shm_data(Emotion_Generic_Video *ev, const char *shmname)
    vs = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED, shmfd, 0);
    if (vs == MAP_FAILED)
      {
-       ERR("error when mapping shared memory.\n");
+       ERR("error when mapping shared memory");
        return EINA_FALSE;
      }
 
@@ -174,7 +178,11 @@ _create_shm_data(Emotion_Generic_Video *ev, const char *shmname)
    vs->frame.last = 2;
    vs->frame.next = 2;
    vs->frame_drop = 0;
-   sem_init(&vs->lock, 1, 1);
+   if (!eina_semaphore_new(&vs->lock, 1))
+     {
+       ERR("can not create semaphore");
+       return EINA_FALSE;
+     }
    ev->frame.frames[0] = (unsigned char *)vs + sizeof(*vs);
    ev->frame.frames[1] = (unsigned char *)vs + sizeof(*vs) + vs->height * vs->width * vs->pitch;
    ev->frame.frames[2] = (unsigned char *)vs + sizeof(*vs) + 2 * vs->height * vs->width * vs->pitch;
@@ -238,42 +246,6 @@ _player_ready(Emotion_Generic_Video *ev)
    _file_open(ev);
 }
 
-static int
-_em_read_safe(int fd, void *buf, ssize_t size)
-{
-   ssize_t todo;
-   char *p;
-
-   todo = size;
-   p = buf;
-
-   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)
-              return size - todo;
-             else
-               {
-                  ERR("could not read from fd %d: %s", fd, strerror(errno));
-                  return -1;
-               }
-          }
-     }
-
-   return size;
-}
-
 static Eina_Bool
 _player_cmd_param_read(Emotion_Generic_Video *ev, void *param, size_t size)
 {
@@ -321,38 +293,6 @@ _player_cmd_param_read(Emotion_Generic_Video *ev, void *param, size_t size)
    return EINA_FALSE;
 }
 
-static Eina_Bool
-_player_int_read(Emotion_Generic_Video *ev, int *i)
-{
-   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 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)
 {
@@ -392,7 +332,7 @@ _player_position_changed(Emotion_Generic_Video *ev)
 
    ev->pos = position;
    _emotion_video_pos_update(ev->obj, ev->pos, ev->len);
-
+/* hmmm. no _emotion_progress_set() is for "buffering" progress.
    if (ev->len == 0)
      return;
 
@@ -401,6 +341,7 @@ _player_position_changed(Emotion_Generic_Video *ev)
    snprintf(buf, sizeof(buf), "%0.1f%%", progress * 100);
 
    _emotion_progress_set(ev->obj, buf, progress);
+ */
 }
 
 static void
@@ -416,20 +357,6 @@ _player_seekable_changed(Emotion_Generic_Video *ev)
 }
 
 static void
-_player_volume(Emotion_Generic_Video *ev)
-{
-   float vol, oldvol;
-   _player_float_read(ev, &vol);
-
-   INF("received volume: %0.3f", vol);
-
-   oldvol = ev->volume;
-   ev->volume = vol;
-   if (vol != oldvol && !ev->opening)
-     _emotion_audio_level_change(ev->obj);
-}
-
-static void
 _audio_channels_free(Emotion_Generic_Video *ev)
 {
    int i;
@@ -465,20 +392,14 @@ _player_tracks_info(Emotion_Generic_Video *ev, Emotion_Generic_Channel **channel
    Emotion_Generic_Channel *pchannels;
    int i;
 
-   _player_int_read(ev, current);
-   _player_int_read(ev, count);
+   *count = ev->cmd.param.track.total;
+   *current = ev->cmd.param.track.current;
+   pchannels = ev->cmd.param.track.channels;
 
    INF("number of tracks: %d (current = %d):", *count, *current);
-   pchannels = calloc(*count, sizeof(Emotion_Generic_Channel));
    for (i = 0; i < *count; i++)
      {
-       int tid, len;
-       char buf[PATH_MAX];
-       _player_int_read(ev, &tid);
-       _player_str_read(ev, buf, &len);
-       pchannels[i].id = tid;
-       pchannels[i].name = eina_stringshare_add_length(buf, len);
-       INF("\tchannel %d: %s", tid, buf);
+       INF("\tchannel %d: %s", pchannels[i].id, pchannels[i].name);
      }
 
    *channels = pchannels;
@@ -518,15 +439,6 @@ _player_spu_tracks_info(Emotion_Generic_Video *ev)
 }
 
 static void
-_player_helper_str_read(Emotion_Generic_Video *ev, const char **pstr)
-{
-   int len;
-   char buf[PATH_MAX];
-   if (_player_str_read(ev, buf, &len))
-     *pstr = eina_stringshare_add_length(buf, len);
-}
-
-static void
 _player_meta_info_free(Emotion_Generic_Video *ev)
 {
    eina_stringshare_replace(&ev->meta.title, NULL);
@@ -544,14 +456,14 @@ _player_meta_info_read(Emotion_Generic_Video *ev)
 {
    INF("Receiving meta info:");
    _player_meta_info_free(ev);
-   _player_helper_str_read(ev, &ev->meta.title);
-   _player_helper_str_read(ev, &ev->meta.artist);
-   _player_helper_str_read(ev, &ev->meta.album);
-   _player_helper_str_read(ev, &ev->meta.year);
-   _player_helper_str_read(ev, &ev->meta.genre);
-   _player_helper_str_read(ev, &ev->meta.comment);
-   _player_helper_str_read(ev, &ev->meta.disc_id);
-   _player_helper_str_read(ev, &ev->meta.count);
+   ev->meta.title = ev->cmd.param.meta.title;
+   ev->meta.artist = ev->cmd.param.meta.artist;
+   ev->meta.album = ev->cmd.param.meta.album;
+   ev->meta.year = ev->cmd.param.meta.year;
+   ev->meta.genre = ev->cmd.param.meta.genre;
+   ev->meta.comment = ev->cmd.param.meta.comment;
+   ev->meta.disc_id = ev->cmd.param.meta.disc_id;
+   ev->meta.count = ev->cmd.param.meta.count;
    INF("title: '%s'", ev->meta.title);
    INF("artist: '%s'", ev->meta.artist);
    INF("album: '%s'", ev->meta.album);
@@ -566,8 +478,7 @@ static void
 _player_file_closed(Emotion_Generic_Video *ev)
 {
    INF("Closed previous file.");
-   sem_destroy(&ev->shared->lock);
-
+   eina_semaphore_free(&ev->shared->lock);
    ev->closing = EINA_FALSE;
 
    if (ev->opening)
@@ -725,14 +636,139 @@ _player_cmd_double_int_process(Emotion_Generic_Video *ev)
 }
 
 static void
+_player_cmd_track_info(Emotion_Generic_Video *ev)
+{
+   int param;
+   int i;
+
+   if (ev->cmd.num_params == 0)
+     {
+       ev->cmd.cur_param = 0;
+       ev->cmd.num_params = 2;
+       ev->cmd.param.track.channels = NULL;
+       ev->cmd.s_len = -1;
+     }
+
+   while (ev->cmd.cur_param < 2)
+     {
+       if (!_player_cmd_param_read(ev, &param, sizeof(param)))
+         return;
+
+       if (ev->cmd.cur_param == 0)
+         ev->cmd.param.track.current = param;
+       else
+         {
+            ev->cmd.param.track.total = param;
+            ev->cmd.num_params += param * 2;
+            ev->cmd.param.track.channels =
+               calloc(param, sizeof(*ev->cmd.param.track.channels));
+         }
+       ev->cmd.cur_param++;
+     }
+
+   if (ev->cmd.cur_param == ev->cmd.num_params)
+     {
+       _player_cmd_process(ev);
+       return;
+     }
+
+   i = (ev->cmd.cur_param - 2) / 2;
+   if ((ev->cmd.cur_param % 2) == 0) // reading track id
+     {
+       if (!_player_cmd_param_read(ev, &param, sizeof(param)))
+         return;
+       ev->cmd.param.track.channels[i].id = param;
+       ev->cmd.cur_param++;
+     }
+   else // reading track name
+     {
+       char buf[PATH_MAX];
+
+       if (ev->cmd.s_len == -1)
+         {
+            if (!_player_cmd_param_read(ev, &param, sizeof(param)))
+              return;
+            ev->cmd.s_len = param;
+         }
+
+       if (!_player_cmd_param_read(ev, buf, ev->cmd.s_len))
+         return;
+       ev->cmd.param.track.channels[i].name = 
+          eina_stringshare_add_length(buf, ev->cmd.s_len);
+       ev->cmd.cur_param++;
+       ev->cmd.s_len = -1;
+     }
+
+   if (ev->cmd.cur_param == ev->cmd.num_params)
+     _player_cmd_process(ev);
+}
+
+static void
+_player_cmd_meta_info(Emotion_Generic_Video *ev)
+{
+   int param;
+   const char *info;
+   char buf[PATH_MAX];
+
+   if (ev->cmd.num_params == 0)
+     {
+       ev->cmd.cur_param = 0;
+       ev->cmd.num_params = 8;
+       ev->cmd.param.meta.title = NULL;
+       ev->cmd.param.meta.artist = NULL;
+       ev->cmd.param.meta.album = NULL;
+       ev->cmd.param.meta.year = NULL;
+       ev->cmd.param.meta.genre = NULL;
+       ev->cmd.param.meta.comment = NULL;
+       ev->cmd.param.meta.disc_id = NULL;
+       ev->cmd.param.meta.count = NULL;
+       ev->cmd.s_len = -1;
+     }
+
+   if (ev->cmd.s_len == -1)
+     {
+       if (!_player_cmd_param_read(ev, &param, sizeof(param)))
+         return;
+       ev->cmd.s_len = param;
+     }
+
+   if (!_player_cmd_param_read(ev, buf, ev->cmd.s_len))
+     return;
+
+   info = eina_stringshare_add_length(buf, ev->cmd.s_len);
+   ev->cmd.s_len = -1;
+
+   if (ev->cmd.cur_param == 0)
+     ev->cmd.param.meta.title = info;
+   else if (ev->cmd.cur_param == 1)
+     ev->cmd.param.meta.artist = info;
+   else if (ev->cmd.cur_param == 2)
+     ev->cmd.param.meta.album = info;
+   else if (ev->cmd.cur_param == 3)
+     ev->cmd.param.meta.year = info;
+   else if (ev->cmd.cur_param == 4)
+     ev->cmd.param.meta.genre = info;
+   else if (ev->cmd.cur_param == 5)
+     ev->cmd.param.meta.comment = info;
+   else if (ev->cmd.cur_param == 6)
+     ev->cmd.param.meta.disc_id = info;
+   else if (ev->cmd.cur_param == 7)
+     ev->cmd.param.meta.count = info;
+
+   ev->cmd.cur_param++;
+
+   if (ev->cmd.cur_param == 8)
+     _player_cmd_process(ev);
+}
+
+static void
 _player_cmd_read(Emotion_Generic_Video *ev)
 {
    if (ev->cmd.type < 0)
      {
        if (!_player_cmd_param_read(ev, &ev->cmd.type, sizeof(ev->cmd.type)))
          return;
-       else
-         ev->cmd.num_params = 0;
+       ev->cmd.num_params = 0;
      }
 
    switch (ev->cmd.type) {
@@ -754,6 +790,14 @@ _player_cmd_read(Emotion_Generic_Video *ev)
       case EM_RESULT_FRAME_SIZE:
         _player_cmd_double_int_process(ev);
         break;
+      case EM_RESULT_AUDIO_TRACK_INFO:
+      case EM_RESULT_VIDEO_TRACK_INFO:
+      case EM_RESULT_SPU_TRACK_INFO:
+        _player_cmd_track_info(ev);
+        break;
+      case EM_RESULT_META_INFO:
+        _player_cmd_meta_info(ev);
+        break;
 
       default:
         WRN("received wrong command: %d", ev->cmd.type);
@@ -863,8 +907,8 @@ _player_exec(Emotion_Generic_Video *ev)
       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]);
+   INF("created pipe emotion -> player: %d -> %d", pipe_out[1], pipe_out[0]);
+   INF("created pipe player -> emotion: %d -> %d", pipe_in[1], pipe_in[0]);
 
    close(pipe_in[1]);
    close(pipe_out[0]);
@@ -887,7 +931,7 @@ _player_exec(Emotion_Generic_Video *ev)
 }
 
 static Eina_Bool
-_fork_and_exec(Evas_Object *obj, Emotion_Generic_Video *ev)
+_fork_and_exec(Evas_Object *obj __UNUSED__, Emotion_Generic_Video *ev)
 {
    char shmname[256];
    struct timeval tv;
@@ -1119,6 +1163,12 @@ em_len_get(void *data)
    return ev->len;
 }
 
+static double
+em_buffer_size_get(void *data __UNUSED__)
+{
+   return 1.0;
+}
+
 static int
 em_fps_num_get(void *data)
 {
@@ -1205,10 +1255,11 @@ em_bgra_data_get(void *data, unsigned char **bgra_data)
    Emotion_Generic_Video *ev = data;
 
    if (!ev || !ev->file_ready)
-     return;
+     return 0;
 
    // lock frame here
-   sem_wait(&ev->shared->lock);
+   if (!eina_semaphore_lock(&ev->shared->lock))
+     return 0;
 
    // send current frame to emotion
    if (ev->shared->frame.emotion != ev->shared->frame.last)
@@ -1223,7 +1274,7 @@ em_bgra_data_get(void *data, unsigned char **bgra_data)
    ev->shared->frame_drop = 0;
 
    // unlock frame here
-   sem_post(&ev->shared->lock);
+   eina_semaphore_release(&ev->shared->lock, 1);
    ev->drop = 0;
 
    return 1;
@@ -1553,6 +1604,7 @@ static Emotion_Video_Module em_module =
    em_size_get, /* size_get */
    em_pos_set, /* pos_set */
    em_len_get, /* len_get */
+   em_buffer_size_get, /* buffer_size_get */
    em_fps_num_get, /* fps_num_get */
    em_fps_den_get, /* fps_den_get */
    em_fps_get, /* fps_get */
@@ -1600,6 +1652,8 @@ static Emotion_Video_Module em_module =
    em_speed_get, /* speed_get */
    em_eject, /* eject */
    em_meta_get, /* meta_get */
+   NULL, /* priority_set */
+   NULL, /* priority_get */
    NULL /* handle */
 };