--- /dev/null
+/*
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdbool.h>
+#include <Elementary.h>
+#include <app_debug.h>
+#include <player.h>
+
+#include "define.h"
+
+struct playermgr {
+ Evas_Object *win;
+ player_h player;
+};
+
+int playermgr_get_duration(struct playermgr *m)
+{
+ int r;
+ int ms;
+
+ if (!m) {
+ _ERR("invalid parameter");
+ return 0;
+ }
+
+ r = player_get_duration(m->player, &ms);
+ if (r != PLAYER_ERROR_NONE) {
+ _ERR("player: get_position error (%d)", r);
+ return 0;
+ }
+
+ return ms;
+}
+
+int playermgr_get_position(struct playermgr *m)
+{
+ int r;
+ int ms;
+
+ if (!m) {
+ _ERR("invalid parameter");
+ return 0;
+ }
+
+ r = player_get_play_position(m->player, &ms);
+ if (r != PLAYER_ERROR_NONE) {
+ _ERR("player: get_position error (%d)", r);
+ return 0;
+ }
+
+ return ms;
+}
+
+bool playermgr_set_position(struct playermgr *m, int ms,
+ player_seek_completed_cb cb, void *data)
+{
+ int r;
+
+ if (!m) {
+ _ERR("invalid parameter");
+ return false;
+ }
+
+ r = player_set_play_position(m->player, ms, false, cb, data);
+ if (r != PLAYER_ERROR_NONE) {
+ _ERR("player: set_position error (%d)", r);
+ return false;
+ }
+
+ return true;
+}
+
+void playermgr_get_state(struct playermgr *m, player_state_e *state)
+{
+ int r;
+
+ if (!m) {
+ _ERR("invalid parameter");
+ return;
+ }
+
+ r = player_get_state(m->player, state);
+ if (r != PLAYER_ERROR_NONE) {
+ _ERR("player: get_state error (%d)", r);
+ *state = PLAYER_STATE_NONE;
+ }
+}
+
+bool playermgr_pause(struct playermgr *m)
+{
+ player_state_e state;
+ int r;
+
+ if (!m) {
+ _ERR("invalid parameter");
+ return false;
+ }
+
+ playermgr_get_state(m, &state);
+ if (state == PLAYER_STATE_PAUSED)
+ return true;
+
+ r = player_pause(m->player);
+ if (r != PLAYER_ERROR_NONE) {
+ _ERR("player: pause error (%d)", r);
+ return false;
+ }
+
+ return true;
+}
+
+bool playermgr_resume(struct playermgr *m)
+{
+ player_state_e state;
+ int r;
+
+ if (!m) {
+ _ERR("invalid parameter");
+ return false;
+ }
+
+ playermgr_get_state(m, &state);
+ if (state == PLAYER_STATE_PLAYING)
+ return true;
+
+ r = player_start(m->player);
+ if (r != PLAYER_ERROR_NONE) {
+ _ERR("player: start error (%d)", r);
+ return false;
+ }
+
+ return true;
+}
+
+void playermgr_stop(struct playermgr *m)
+{
+ if (!m) {
+ _ERR("invalid parameter");
+ return;
+ }
+
+ player_pause(m->player);
+ player_stop(m->player);
+ player_unprepare(m->player);
+}
+
+bool playermgr_play(struct playermgr *m, const char *path)
+{
+ int r;
+
+ if (!m || !path) {
+ _ERR("invalid parameter");
+ return false;
+ }
+
+ playermgr_stop(m);
+
+ r = player_set_uri(m->player, path);
+ if (r != PLAYER_ERROR_NONE) {
+ _ERR("player: set_uri error (%d)", r);
+ return false;
+ }
+
+ r = player_set_display(m->player, PLAYER_DISPLAY_TYPE_OVERLAY,
+ GET_DISPLAY(m->win));
+ if (r != PLAYER_ERROR_NONE) {
+ _ERR("player: set_display error (%d)", r);
+ return false;
+ }
+
+ r = player_set_display_mode(m->player, PLAYER_DISPLAY_MODE_FULL_SCREEN);
+ if (r != PLAYER_ERROR_NONE) {
+ _ERR("player: set_display_mode error (%d)", r);
+ return false;
+ }
+
+ r = player_prepare(m->player);
+ if (r != PLAYER_ERROR_NONE) {
+ _ERR("player: prepare error (%d)", r);
+ return false;
+ }
+
+ r = player_start(m->player);
+ if (r != PLAYER_ERROR_NONE) {
+ _ERR("player: start error (%d)", r);
+ return false;
+ }
+
+ return true;
+}
+
+bool playermgr_set_completed_cb(struct playermgr *m,
+ player_completed_cb cb, void *data)
+{
+ int r;
+
+ r = player_set_completed_cb(m->player, cb, data);
+ if (r != PLAYER_ERROR_NONE) {
+ _ERR("player: set callback error (%d)", r);
+ return false;
+ }
+
+ return true;
+}
+
+struct playermgr *playermgr_create(Evas_Object *win)
+{
+ struct playermgr *m;
+ int r;
+
+ if (!win) {
+ _ERR("invalid parameter");
+ return NULL;
+ }
+
+ m = calloc(1, sizeof(*m));
+ if (!m) {
+ _ERR("failed to allocate");
+ return NULL;
+ }
+
+ r = player_create(&m->player);
+ if (r != PLAYER_ERROR_NONE) {
+ _ERR("player: creation error (%d)", r);
+ free(m);
+ return NULL;
+ }
+
+ m->win = win;
+
+ return m;
+}
+
+void playermgr_destroy(struct playermgr *m)
+{
+ if (!m) {
+ _ERR("invalid parameter");
+ return;
+ }
+
+ if (m->player) {
+ playermgr_stop(m);
+ player_destroy(m->player);
+ }
+
+ free(m);
+}
#include <layoutmgr.h>
#include <media_content.h>
#include <media_info.h>
+#include <player.h>
#include <app_media.h>
#include "define.h"
#include "util/controller.h"
#include "util/timeout_handler.h"
+#include "util/playermgr.h"
+#include "util/util.h"
#define STYLE_VIEWER_BTN "viewer_btn"
#define PART_VIEWER_BTN "control_btn"
+#define PLAY_BTN_LOC 2
#define VIEWER_TIMEOUT 3.0
+#define VIEWER_INTERVAL 0.1
#define VIDEO_COPYRIGHT "Unknown"
Evas_Object *photo;
Evas_Object *photo_pre;
Evas_Object *favorite;
+ Evas_Object *timer;
struct _viewer viewer;
struct _playlist playlist;
struct timeout_handler *timeout;
+ struct playermgr *player;
bool bar_show;
};
void (*callback)(void *, const char *);
};
+static void _player_play(struct _priv *priv);
+
static void _callback_movie(void *data, const char *ev);
static void _callback_photo(void *data, const char *ev);
static void _callback_video(void *data, const char *ev);
}
}
-static void _draw_thumbnail(struct _priv *priv, int id, app_media_info *mi)
+static void _set_bg_color(struct _priv *priv, int r, int g, int b, int a)
+{
+ Evas_Object *bg;
+
+ bg = evas_object_rectangle_add(evas_object_evas_get(priv->base));
+ if (!bg) {
+ _ERR("failed to add rect");
+ return;
+ }
+
+ evas_object_color_set(bg, r, g, b, a);
+
+ 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;
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;
priv->photo_pre = NULL;
}
-static void _load_image_file(struct _priv *priv, int id, app_media_info *mi)
+static void _draw_contents(struct _priv *priv, int id, app_media_info *mi)
{
Evas_Object *obj;
if (id == VIEWER_MOVIE) {
- elm_object_part_content_unset(priv->base, PART_VIEWER_CONTENT);
+ _player_play(priv);
return;
} else if (id == VIEWER_VIDEO) {
- _draw_thumbnail(priv, id, mi);
+ _draw_thumbnail(priv, mi);
return;
}
priv->photo_pre = obj;
}
+ _set_bg_color(priv, 0, 0, 0, 255);
+
elm_photocam_file_set(obj, mi->file_path);
elm_photocam_zoom_mode_set(obj, ELM_PHOTOCAM_ZOOM_MODE_AUTO_FIT);
}
elm_object_part_text_set(priv->base, PART_VIEWER_TOTAL, total);
}
+static void _draw_progress_info(struct _priv *priv, int ms)
+{
+ char progress[32] = {0,};
+
+ _time_string(progress, sizeof(progress), ms);
+ elm_object_part_text_set(priv->base, PART_VIEWER_PROGRESS, progress);
+}
+
static void _draw_favorite_icon(struct _priv *priv, int id, app_media_info *mi)
{
if (!mi->favorite)
PART_VIEWER_FAVORITE, priv->favorite);
}
-static bool _viewer_show(struct _priv *priv, int cur, int foc)
+static app_media_info *_get_current_media_info(struct _priv *priv)
{
- struct _viewer_info *info;
- struct controller *ctl;
- int id;
- int loc;
app_media *am;
app_media_info *mi;
- am = eina_list_nth(priv->playlist.list, cur);
+ am = eina_list_nth(priv->playlist.list, priv->playlist.cur);
if (!am) {
_ERR("failed to get app_media");
- return false;
+ return NULL;
}
- priv->playlist.cur = cur;
-
mi = app_media_get_info(am);
if (!mi) {
_ERR("failed to getting media info");
+ return NULL;
+ }
+
+ return mi;
+}
+
+static bool _viewer_show(struct _priv *priv, int foc)
+{
+ struct _viewer_info *info;
+ struct controller *ctl;
+ int id;
+ int loc;
+ app_media_info *mi;
+
+ mi = _get_current_media_info(priv);
+ if (!mi) {
+ _ERR("failed to getting media info");
return false;
}
case DIR_NONE:
default:
loc = info->focus_loc;
+ if (id == VIEWER_MOVIE) {
+ ctl->ops->signal(ctl->handle,
+ PLAY_BTN_LOC, SIG_SET_PAUSE);
+ }
break;
}
ctl->ops->focus(ctl->handle, loc, true);
- _load_image_file(priv, id, mi);
+ _draw_contents(priv, id, mi);
_draw_title_bar(priv, id, mi);
_draw_time_info(priv, id, mi);
else
priv->playlist.cur--;
- r = _viewer_show(priv, priv->playlist.cur, DIR_PREV);
+ r = _viewer_show(priv, DIR_PREV);
return r;
}
else
priv->playlist.cur++;
- r = _viewer_show(priv, priv->playlist.cur, DIR_NEXT);
+ r = _viewer_show(priv, DIR_NEXT);
return r;
}
return false;
}
+static Eina_Bool _timer_cb(void *data)
+{
+ struct _priv *priv;
+ int ms;
+
+ if (!data)
+ return ECORE_CALLBACK_CANCEL;
+
+ priv = data;
+
+ ms = playermgr_get_position(priv->player);
+
+ _draw_progress_info(priv, ms);
+
+ return ECORE_CALLBACK_RENEW;
+}
+
+static void _timer_reset(struct _priv *priv)
+{
+ if (priv->timer)
+ ecore_timer_reset(priv->timer);
+ else
+ priv->timer = ecore_timer_add(VIEWER_INTERVAL, _timer_cb, priv);
+}
+
+static void _player_play(struct _priv *priv)
+{
+ app_media_info *mi;
+ player_state_e state;
+
+ playermgr_get_state(priv->player, &state);
+
+ switch (state) {
+ case PLAYER_STATE_PAUSED:
+ if (priv->timer)
+ ecore_timer_thaw(priv->timer);
+
+ playermgr_resume(priv->player);
+ break;
+ case PLAYER_STATE_PLAYING:
+ if (priv->timer)
+ ecore_timer_freeze(priv->timer);
+
+ playermgr_pause(priv->player);
+ break;
+ case PLAYER_STATE_IDLE:
+ case PLAYER_STATE_READY:
+ mi = _get_current_media_info(priv);
+ if (!mi) {
+ _ERR("failed to getting media info");
+ return;
+ }
+
+ _remove_thumbnail(priv);
+ _timer_reset(priv);
+
+ playermgr_play(priv->player, mi->file_path);
+
+ break;
+ default:
+ _ERR("player was not created");
+ break;
+ }
+}
+
+static void _player_stop(struct _priv *priv)
+{
+ struct controller *ctl;
+
+ ecore_timer_del(priv->timer);
+ priv->timer = NULL;
+
+ playermgr_stop(priv->player);
+
+ ctl = priv->viewer.ctl[priv->viewer.cur];
+ ctl->ops->signal(ctl->handle, PLAY_BTN_LOC, SIG_SET_PLAY);
+}
+
+static void _player_complete_cb(void *data)
+{
+ struct _priv *priv;
+
+ if (!data)
+ return;
+
+ priv = data;
+
+ ecore_timer_del(priv->timer);
+ priv->timer = NULL;
+}
+
+static void _player_set_position_cb(void *data)
+{
+ struct _priv *priv;
+ struct controller *ctl;
+ int ms;
+
+ if (!data)
+ return;
+
+ priv = data;
+
+ ms = playermgr_get_position(priv->player);
+ _draw_progress_info(priv, ms);
+
+ /* FIXME: what will you do here? */
+ playermgr_pause(priv->player);
+
+ if (priv->timer)
+ ecore_timer_freeze(priv->timer);
+
+ ctl = priv->viewer.ctl[priv->viewer.cur];
+ ctl->ops->signal(ctl->handle, PLAY_BTN_LOC, SIG_SET_PLAY);
+}
+
static void _callback_movie(void *data, const char *ev)
{
+ struct _priv *priv;
+ int ms;
+
+ if (!data || !ev)
+ return;
+
+ priv = data;
+
+ if (!strcmp(ev, SRC_BTN_PREV)) {
+ playermgr_set_position(priv->player, 0,
+ _player_set_position_cb, priv);
+ } else if (!strcmp(ev, SRC_BTN_NEXT)) {
+ ms = playermgr_get_duration(priv->player);
+ playermgr_set_position(priv->player, ms - 1000,
+ _player_set_position_cb, priv);
+ } else if (!strcmp(ev, SRC_BTN_PLAY)) {
+ _player_play(priv);
+ }
}
static void _callback_photo(void *data, const char *ev)
priv = data;
- if (!strcmp(ev, SRC_BTN_PHOTO_PREV)) {
+ if (!strcmp(ev, SRC_BTN_PHOTO_PREV))
_viewer_prev(priv);
- } else if (!strcmp(ev, SRC_BTN_PHOTO_NEXT)) {
+ else if (!strcmp(ev, SRC_BTN_PHOTO_NEXT))
_viewer_next(priv);
- }
}
static void _callback_video(void *data, const char *ev)
priv = data;
if (!strcmp(ev, SRC_BTN_PREV)) {
+ _player_stop(priv);
_viewer_prev(priv);
} else if (!strcmp(ev, SRC_BTN_NEXT)) {
+ _player_stop(priv);
_viewer_next(priv);
+ } else if (!strcmp(ev, SRC_BTN_PLAY)) {
+ _player_play(priv);
}
}
{
struct _priv *priv;
Evas_Object *base;
+ struct playermgr *player;
bool r;
if (!win) {
priv->playlist.list = NULL;
priv->playlist.cur = 0;
+ player = playermgr_create(win);
+ if (!player) {
+ _ERR("failed to create player");
+ return NULL;
+ }
+
+ r = playermgr_set_completed_cb(player, _player_complete_cb, priv);
+ if (!r) {
+ _ERR("failed to set callback");
+ playermgr_destroy(player);
+ return NULL;
+ }
+
+ priv->player = player;
+
r = _ui_init(priv);
if (!r) {
_ERR("failed to init UI");
+ playermgr_destroy(player);
return NULL;
}
priv = view_data;
/* FIXME: test code */
- _viewer_show(priv, priv->playlist.cur, DIR_NONE);
+ _viewer_show(priv, DIR_NONE);
timeout_handler_reset(priv->timeout);
timeout_handler_fini(priv->timeout);
+ ecore_timer_del(priv->timer);
+ priv->timer = NULL;
+
+ playermgr_destroy(priv->player);
+
evas_object_del(priv->base);
free(priv);