#include "define.h"
#define EVENT_INTERVAL 0.1
+#define SEEK_INTERVAL 0.5
+
+#define SPEED_MAX 3
+
+static int _speed[] = {
+ 0,
+ 2,
+ 4,
+ 8
+};
struct _player_cb {
void (*func)(void *data);
void *data;
};
+struct _wind {
+ int ff;
+ int rew;
+};
+
struct playermgr {
Evas_Object *win;
Ecore_Timer *event_loop;
player_h player;
char *path;
struct _player_cb complete_cb;
+ struct _player_cb seek_set_cb;
+ struct _player_cb seek_cb;
+ struct _wind wind;
};
static Eina_Bool _event_cb(void *data)
static void _event_loop_stop(struct playermgr *m)
{
- ecore_timer_del(m->event_loop);
- m->event_loop = NULL;
+ if (m->event_loop) {
+ ecore_timer_del(m->event_loop);
+ m->event_loop = NULL;
+ }
}
static void _event_loop_start(struct playermgr *m)
return false;
}
- _event_loop_stop(m);
-
return true;
}
return false;
}
- _event_loop_start(m);
-
return true;
}
}
bool playermgr_set_completed_cb(struct playermgr *m,
- player_completed_cb cb, void *data)
+ void (*func)(void *data), void *data)
{
int r;
+ if (!m) {
+ _ERR("invalid parameter");
+ return false;
+ }
+
r = player_set_completed_cb(m->player, _player_complete_cb, m);
if (r != PLAYER_ERROR_NONE) {
_ERR("player: set callback error (%d)", r);
return false;
}
- m->complete_cb.func = cb;
+ m->complete_cb.func = func;
m->complete_cb.data = data;
return true;
}
+bool playermgr_set_seek_cb(struct playermgr *m,
+ void (*func)(void *data), void *data)
+{
+ if (!m) {
+ _ERR("invalid parameter");
+ return false;
+ }
+
+ m->seek_cb.func = func;
+ m->seek_cb.data = data;
+
+ return true;
+}
+
+void playermgr_stop_wind(struct playermgr *m)
+{
+ if (!m) {
+ _ERR("invalid parameter");
+ return;
+ }
+
+ m->wind.ff = 0;
+ m->wind.rew = 0;
+}
+
+static void _player_seek_cb(void *data)
+{
+ struct playermgr *m;
+
+ if (!data)
+ return;
+
+ m = data;
+
+ m->cb_list = eina_list_append(m->cb_list, &m->seek_set_cb);
+}
+
+static void _seek(void *data)
+{
+ struct playermgr *m;
+ int position;
+ int duration;
+ bool fin;
+
+ if (!data)
+ return;
+
+ m = data;
+
+ position = playermgr_get_position(m);
+ duration = playermgr_get_duration(m);
+
+ fin = false;
+
+ if (m->wind.ff) {
+ position += _speed[m->wind.ff] * 500;
+ if (position > duration) {
+ position = duration;
+ fin = true;
+ }
+ } else if (m->wind.rew) {
+ position -= _speed[m->wind.rew] * 500;
+ if (position < 0) {
+ position = 0;
+ fin = true;
+ }
+ } else {
+ return;
+ }
+
+ playermgr_set_position(m, position, _player_seek_cb, m);
+
+ if (fin) {
+ m->wind.ff = 0;
+ m->wind.rew = 0;
+
+ if (m->seek_cb.func)
+ m->seek_cb.func(m->seek_cb.data);
+ }
+}
+
+static Eina_Bool _seek_set_cb(void *data)
+{
+ struct playermgr *m;
+
+ if (!data)
+ return EINA_FALSE;
+
+ m = data;
+
+ _seek(m);
+
+ return EINA_FALSE;
+}
+
+static void _seek_set(void *data)
+{
+ struct playermgr *m;
+
+ if (!data)
+ return;
+
+ m = data;
+
+ ecore_timer_add(SEEK_INTERVAL, _seek_set_cb, m);
+}
+
+static void _start_wind(struct playermgr *m)
+{
+ bool r;
+
+ m->seek_set_cb.func = _seek_set;
+ m->seek_set_cb.data = m;
+
+ r = playermgr_pause(m);
+ if (!r)
+ return;
+
+ _seek_set(m);
+}
+
+bool playermgr_set_rew(struct playermgr *m)
+{
+ if (!m) {
+ _ERR("invalid parameter");
+ return false;
+ }
+
+ m->wind.ff = 0;
+
+ if (m->wind.rew == SPEED_MAX)
+ m->wind.rew = 1;
+ else
+ m->wind.rew++;
+
+ _start_wind(m);
+
+ return true;
+}
+
+bool playermgr_set_ff(struct playermgr *m)
+{
+ if (!m) {
+ _ERR("invalid parameter");
+ return false;
+ }
+
+ m->wind.rew = 0;
+
+ if (m->wind.ff == SPEED_MAX)
+ m->wind.ff = 1;
+ else
+ m->wind.ff++;
+
+ _start_wind(m);
+
+ return true;
+}
+
+int playermgr_get_wind(struct playermgr *m)
+{
+ if (!m) {
+ _ERR("invalid parameter");
+ return false;
+ }
+
+ if (m->wind.ff)
+ return _speed[m->wind.ff];
+ else if (m->wind.rew)
+ return _speed[m->wind.rew];
+
+ return 0;
+}
+
struct playermgr *playermgr_create(Evas_Object *win)
{
struct playermgr *m;
m->path = NULL;
m->event_loop = NULL;
+ m->wind.ff = 0;
+ m->wind.rew = 0;
+
return m;
}
#define PART_VIEWER_BTN "control_btn"
#define POSITION_MARGIN 500
-#define VIEWER_TIMEOUT 3.0
+#define VIEWER_TIMEOUT 5.0
#define VIEWER_SEPARATOR "/ "
#define SLIDE_SHOW_INTERVAL 3.0
#define ERROR_MESSAGE "Something went wrong."
#define BTN_LOC_NONE -1
#define BTN_LOC_PREV 0
+#define BTN_LOC_REW 1
#define BTN_LOC_PLAY 2
+#define BTN_LOC_FF 3
#define BTN_LOC_NEXT 4
#define BTN_LOC_ROTATE 5
#define BTN_LOC_ZOOM 5
#define BTN_LOC_SLIDE 8
enum {
+ WIND_NONE,
+ WIND_FF,
+ WIND_REW,
+};
+
+enum {
VIEWER_MOVIE,
VIEWER_PHOTO,
VIEWER_VIDEO,
.loc = BTN_LOC_PREV,
},
{
+ .name = SRC_BTN_REW,
+ .loc = BTN_LOC_REW,
+ },
+ {
.name = SRC_BTN_PLAY,
.loc = BTN_LOC_PLAY,
},
{
+ .name = SRC_BTN_FF,
+ .loc = BTN_LOC_FF,
+ },
+ {
.name = SRC_BTN_NEXT,
.loc = BTN_LOC_NEXT,
},
.loc = BTN_LOC_PREV,
},
{
+ .name = SRC_BTN_REW,
+ .loc = BTN_LOC_REW,
+ },
+ {
.name = SRC_BTN_PLAY,
.loc = BTN_LOC_PLAY,
},
.loc = BTN_LOC_NEXT,
},
{
+ .name = SRC_BTN_FF,
+ .loc = BTN_LOC_FF,
+ },
+ {
.name = SRC_BTN_SLIDE,
.loc = BTN_LOC_SLIDE,
},
static void _player_play(struct _priv *priv);
static void _player_stop(struct _priv *priv);
+static void _player_pause(struct _priv *priv);
static void _callback_movie(void *data, const char *ev);
static void _callback_photo(void *data, const char *ev);
static struct _viewer_info viewer_info[] = {
{
.btns = btn_movie,
- .btn_count = 3,
+ .btn_count = 5,
.focus_loc = BTN_LOC_PLAY,
.callback = _callback_movie,
},
},
{
.btns = btn_video,
- .btn_count = 4,
+ .btn_count = 6,
.focus_loc = BTN_LOC_NEXT,
.callback = _callback_video,
},
elm_object_part_content_set(priv->base, PART_VIEWER_BG, bg);
}
-static void _draw_thumbnail(struct _priv *priv, app_media_info *mi)
-{
- Evas_Object *obj;
-
- if (priv->photo_pre) {
- evas_object_del(priv->photo_pre);
- priv->photo_pre = NULL;
- }
-
- if (priv->photo) {
- evas_object_del(priv->photo);
- priv->photo = NULL;
- }
-
- obj = elm_image_add(priv->base);
- if (!obj) {
- _ERR("failed to adding image");
- return;
- }
-
- elm_image_file_set(obj, mi->thumbnail_path, NULL);
- elm_object_part_content_set(priv->base, PART_VIEWER_CONTENT, obj);
-
- priv->photo = obj;
-}
-
-static void _remove_thumbnail(struct _priv *priv)
-{
- if (priv->photo_pre) {
- evas_object_del(priv->photo_pre);
- priv->photo_pre = NULL;
- }
-
- if (priv->photo) {
- evas_object_del(priv->photo);
- priv->photo = NULL;
- }
-
- _set_bg_color(priv, 0, 0, 0, 0);
-
- elm_object_part_content_unset(priv->base, PART_VIEWER_CONTENT);
-}
-
static void _image_loaded(void *data, Evas_Object *obj, void *ev)
{
struct _priv *priv;
_player_play(priv);
return;
} else if (id == VIEWER_VIDEO) {
- if (priv->slideshow.enable)
- _player_play(priv);
- else
- _draw_thumbnail(priv, mi);
+ _player_play(priv);
+
+ if (!priv->slideshow.enable)
+ _player_pause(priv);
+
return;
} else if (id == VIEWER_PHOTO) {
if (priv->slideshow.enable)
elm_object_signal_emit(priv->base, SIG_VIEWER_HIDE_FAV, "");
}
+static void _draw_wind(struct _priv *priv, int speed)
+{
+ char buf[32] = {0,};
+
+ if (speed) {
+ snprintf(buf, sizeof(buf), "x%d", speed);
+ elm_object_part_text_set(priv->base, PART_VIEWER_WIND, buf);
+ } else {
+ elm_object_part_text_set(priv->base, PART_VIEWER_WIND, "");
+ }
+}
+
static app_media_info *_get_current_media_info(struct _priv *priv)
{
app_media *am;
}
}
- ctl->ops->signal(ctl->handle, loc, SIG_SET_FOCUS);
- ctl->ops->focus(ctl->handle, loc, true);
-
_draw_title_bar(priv, id, mi);
_draw_progressbar(priv, id, mi);
_draw_favorite_icon(priv, id, mi);
_draw_contents(priv, id, mi);
+ ctl->ops->signal(ctl->handle, loc, SIG_SET_FOCUS);
+ ctl->ops->focus(ctl->handle, loc, true);
+
return true;
}
ctl = priv->viewer.ctl[priv->viewer.cur];
ctl->ops->hide(ctl->handle);
- _remove_thumbnail(priv);
elm_object_signal_emit(priv->base, SIG_VIEWER_HIDE_FAV, "");
}
break;
case PLAYER_STATE_PLAYING:
progressbar_pause(priv->progress);
+ playermgr_stop_wind(priv->player);
r = playermgr_pause(priv->player);
if (!r) {
_error_exit(priv);
return;
}
- _remove_thumbnail(priv);
_update_to_player(priv);
+ playermgr_stop_wind(priv->player);
r = playermgr_play(priv->player, mi->file_path,
mi->video->position);
if (!r) {
return;
}
- _remove_thumbnail(priv);
_update_to_player(priv);
+ playermgr_stop_wind(priv->player);
r = playermgr_play(priv->player, mi->file_path,
mi->video->position);
if (!r) {
}
}
+static void _player_set_wind(struct _priv *priv, int wind)
+{
+ struct controller *ctl;
+
+ switch (wind) {
+ case WIND_FF:
+ elm_object_signal_emit(priv->base, SIG_VIEWER_SHOW_FF, "");
+ playermgr_set_ff(priv->player);
+ timeout_handler_enable(priv->timeout, false);
+ progressbar_resume(priv->progress);
+
+ ctl = priv->viewer.ctl[priv->viewer.cur];
+ ctl->ops->signal(ctl->handle, BTN_LOC_PLAY, SIG_SET_PLAY);
+ break;
+ case WIND_REW:
+ elm_object_signal_emit(priv->base, SIG_VIEWER_SHOW_REW, "");
+ playermgr_set_rew(priv->player);
+ timeout_handler_enable(priv->timeout, false);
+ progressbar_resume(priv->progress);
+
+ ctl = priv->viewer.ctl[priv->viewer.cur];
+ ctl->ops->signal(ctl->handle, BTN_LOC_PLAY, SIG_SET_PLAY);
+ break;
+ case WIND_NONE:
+ default:
+ elm_object_signal_emit(priv->base, SIG_VIEWER_HIDE_WIND, "");
+ playermgr_stop_wind(priv->player);
+ timeout_handler_enable(priv->timeout, true);
+ break;
+ }
+
+ _draw_wind(priv, playermgr_get_wind(priv->player));
+}
+
+static void _player_seek_cb(void *data)
+{
+ struct _priv *priv;
+
+ if (!data)
+ return;
+
+ priv = data;
+
+ _player_set_wind(priv, WIND_NONE);
+}
+
static struct progressbar_ops _progressbar_ops = {
.get_value = _player_get_position,
};
priv = data;
- if (!strcmp(ev, SRC_BTN_PREV))
+ if (!strcmp(ev, SRC_BTN_PREV)) {
+ _player_set_wind(priv, WIND_NONE);
_player_set_position(priv, 0);
- else if (!strcmp(ev, SRC_BTN_NEXT))
+ } else if (!strcmp(ev, SRC_BTN_NEXT)) {
+ _player_set_wind(priv, WIND_NONE);
_player_set_position(priv, -1);
- else if (!strcmp(ev, SRC_BTN_PLAY))
+ } else if (!strcmp(ev, SRC_BTN_PLAY)) {
+ _player_set_wind(priv, WIND_NONE);
_player_play_pause(priv);
+ } else if (!strcmp(ev, SRC_BTN_REW)) {
+ _player_set_wind(priv, WIND_REW);
+ } else if (!strcmp(ev, SRC_BTN_FF)) {
+ _player_set_wind(priv, WIND_FF);
+ }
}
static void _callback_photo(void *data, const char *ev)
priv = data;
if (!strcmp(ev, SRC_BTN_GALLERY_PREV)) {
+ _player_set_wind(priv, WIND_NONE);
_player_stop(priv);
_viewer_prev(priv);
} else if (!strcmp(ev, SRC_BTN_GALLERY_NEXT)) {
+ _player_set_wind(priv, WIND_NONE);
_player_stop(priv);
_viewer_next(priv);
} else if (!strcmp(ev, SRC_BTN_PLAY)) {
+ _player_set_wind(priv, WIND_NONE);
_player_play_pause(priv);
} else if (!strcmp(ev, SRC_BTN_SLIDE)) {
+ _player_set_wind(priv, WIND_NONE);
_slideshow_enable(priv);
_hide_bar(priv);
_viewer_show(priv);
+ } else if (!strcmp(ev, SRC_BTN_REW)) {
+ _player_set_wind(priv, WIND_REW);
+ } else if (!strcmp(ev, SRC_BTN_FF)) {
+ _player_set_wind(priv, WIND_FF);
}
}
goto err;
}
+ r = playermgr_set_seek_cb(player, _player_seek_cb, priv);
+ if (!r) {
+ _ERR("failed to set callback");
+ evas_object_del(base);
+ playermgr_destroy(player);
+ goto err;
+ }
+
priv->player = player;
r = _ui_init(priv);