diff options
Diffstat (limited to 'src/util/playermgr.c')
-rw-r--r-- | src/util/playermgr.c | 214 |
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; } |