summaryrefslogtreecommitdiff
path: root/src/util/playermgr.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/playermgr.c')
-rw-r--r--src/util/playermgr.c214
1 files changed, 206 insertions, 8 deletions
diff --git a/src/util/playermgr.c b/src/util/playermgr.c
index d4d8967..8e406d2 100644
--- a/src/util/playermgr.c
+++ b/src/util/playermgr.c
@@ -22,12 +22,27 @@
#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;
@@ -35,6 +50,9 @@ struct playermgr {
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)
@@ -63,8 +81,10 @@ 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)
@@ -201,8 +221,6 @@ bool playermgr_pause(struct playermgr *m)
return false;
}
- _event_loop_stop(m);
-
return true;
}
@@ -226,8 +244,6 @@ bool playermgr_resume(struct playermgr *m)
return false;
}
- _event_loop_start(m);
-
return true;
}
@@ -308,22 +324,201 @@ bool playermgr_play(struct playermgr *m, const char *path, int ms)
}
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;
@@ -346,6 +541,9 @@ struct playermgr *playermgr_create(Evas_Object *win)
m->path = NULL;
m->event_loop = NULL;
+ m->wind.ff = 0;
+ m->wind.rew = 0;
+
return m;
}