#include "define.h"
+#define EVENT_INTERVAL 0.1
+
+struct _player_cb {
+ void (*func)(void *data);
+ void *data;
+};
+
struct playermgr {
Evas_Object *win;
+ Ecore_Timer *event_loop;
+ Eina_List *cb_list;
player_h player;
char *path;
+ struct _player_cb complete_cb;
};
+static Eina_Bool _event_cb(void *data)
+{
+ struct playermgr *m;
+ struct _player_cb *cb;
+ Eina_List *l;
+
+ if (!data)
+ return ECORE_CALLBACK_CANCEL;
+
+ m = data;
+
+ if (!eina_list_count(m->cb_list))
+ return ECORE_CALLBACK_RENEW;
+
+ EINA_LIST_FOREACH(m->cb_list, l, cb) {
+ if (cb && cb->func)
+ cb->func(cb->data);
+ }
+
+ m->cb_list = eina_list_free(m->cb_list);
+
+ return ECORE_CALLBACK_RENEW;
+}
+
+static void _event_loop_stop(struct playermgr *m)
+{
+ ecore_timer_del(m->event_loop);
+ m->event_loop = NULL;
+}
+
+static void _event_loop_start(struct playermgr *m)
+{
+ if (m->event_loop)
+ ecore_timer_reset(m->event_loop);
+ else
+ m->event_loop = ecore_timer_add(EVENT_INTERVAL, _event_cb, m);
+}
+
+static void _player_complete_cb(void *data)
+{
+ struct playermgr *m;
+
+ if (!data)
+ return;
+
+ m = data;
+
+ m->cb_list = eina_list_append(m->cb_list, &m->complete_cb);
+}
+
static void _set_path(struct playermgr *m, const char *path)
{
free(m->path);
r = player_pause(m->player);
if (r != PLAYER_ERROR_NONE) {
_ERR("player: pause error (%d)", r);
+ _event_loop_stop(m);
return false;
}
+ _event_loop_stop(m);
+
return true;
}
return false;
}
+ _event_loop_start(m);
+
return true;
}
player_unprepare(m->player);
_set_path(m, NULL);
+ _event_loop_stop(m);
}
bool playermgr_play(struct playermgr *m, const char *path, int ms)
}
}
+ _event_loop_start(m);
+
return true;
}
{
int r;
- r = player_set_completed_cb(m->player, cb, data);
+ 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.data = data;
+
return true;
}
m->win = win;
m->path = NULL;
+ m->event_loop = NULL;
return m;
}
return;
}
+ _event_loop_stop(m);
+
+ eina_list_free(m->cb_list);
+
if (m->player) {
playermgr_stop(m);
player_destroy(m->player);
#define SLIDER_STEP 0.03
#define PROGRESSBAR_INTERVAL 0.1
-#define COMPLETE_INTERVAL 1.0
-#define COMPLETE_BUFFER 500
struct progressbar {
Evas_Object *base;
_update_progress_info(m, position);
}
-static Eina_Bool _complete_cb(void *data)
-{
- struct progressbar *m;
-
- if (!data)
- return ECORE_CALLBACK_CANCEL;
-
- m = data;
-
- if (m->ops->complete_cb)
- m->ops->complete_cb(m->ops_data);
-
- return ECORE_CALLBACK_CANCEL;
-}
-
static Eina_Bool _timer_cb(void *data)
{
struct progressbar *m;
elm_slider_value_set(m->slider, position);
_update_progress_info(m, position);
- if (position + COMPLETE_BUFFER > m->duration) {
- ecore_timer_add(COMPLETE_INTERVAL, _complete_cb, m);
- m->timer = NULL;
-
- return ECORE_CALLBACK_CANCEL;
- }
-
return ECORE_CALLBACK_RENEW;
}
static struct progressbar_ops _progressbar_ops = {
.get_value = _player_get_position,
- .complete_cb = _player_complete_cb,
};
static void _callback_music(void *data, const char *ev)
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);
static struct progressbar_ops _progressbar_ops = {
.get_value = _player_get_position,
- .complete_cb = _player_complete_cb,
};
static void _callback_movie(void *data, const char *ev)
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);