From 1bc0c17a8ac78f2d9fc0a19f70e16449d3e55736 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Wed, 22 Jul 2015 21:44:14 +0900 Subject: musicplayer: implement the complete callback at progressbar (workaround) Since the complete callback of player have bug, we implemented it on progressbar Change-Id: I69f1afd6751b49a3523daf6fe80e5301a2049523 Signed-off-by: Minkyu Kang --- include/util/progressbar.h | 1 + src/util/progressbar.c | 27 +++++++++++++++++++++++++++ src/view/mplayer.c | 20 ++++++++------------ 3 files changed, 36 insertions(+), 12 deletions(-) diff --git a/include/util/progressbar.h b/include/util/progressbar.h index 884761e..b788a3c 100644 --- a/include/util/progressbar.h +++ b/include/util/progressbar.h @@ -22,6 +22,7 @@ struct progressbar; struct progressbar_ops { int (*get_value)(void *data); int (*set_value)(void *data); + void (*complete_cb)(void *data); }; enum progressbar_time_format { diff --git a/src/util/progressbar.c b/src/util/progressbar.c index ed0a28f..3623016 100644 --- a/src/util/progressbar.c +++ b/src/util/progressbar.c @@ -26,6 +26,8 @@ #define SLIDER_STEP 0.03 #define PROGRESSBAR_INTERVAL 0.1 +#define COMPLETE_INTERVAL 1.0 +#define COMPLETE_BUFFER 500 struct progressbar { Evas_Object *base; @@ -41,6 +43,7 @@ struct progressbar { char *str_separator; enum progressbar_time_format fmt; + int duration; }; static void _update_progress_info(struct progressbar *m, int position) @@ -64,6 +67,21 @@ static void _update_time_info(struct progressbar *m, int position, int duration) _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; @@ -79,6 +97,13 @@ static Eina_Bool _timer_cb(void *data) 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; } @@ -167,6 +192,8 @@ void progressbar_reset(struct progressbar *m, int position, int duration) return; } + m->duration = duration; + elm_slider_min_max_set(m->slider, 0, duration); elm_slider_step_set(m->slider, SLIDER_STEP); elm_slider_value_set(m->slider, position); diff --git a/src/view/mplayer.c b/src/view/mplayer.c index a438cf1..c5c77f8 100644 --- a/src/view/mplayer.c +++ b/src/view/mplayer.c @@ -124,7 +124,6 @@ static void _draw_music_info(struct _priv *priv, app_media_info *mi) static void _draw_progressbar(struct _priv *priv, app_media_info *mi) { - progressbar_reset(priv->progress, 0, mi->audio->duration); progressbar_show(priv->progress); } @@ -152,6 +151,9 @@ static void _update_info(struct _priv *priv, app_media_info *mi) { struct view_update_data vdata; + /* update progressbar */ + progressbar_reset(priv->progress, 0, mi->audio->duration); + /* update history */ app_contents_recent_add(CONTENTS_MEDIA, mi->media_id); @@ -250,10 +252,6 @@ static int _player_get_position(void *data) return playermgr_get_position(priv->player); } -static struct progressbar_ops _progressbar_ops = { - .get_value = _player_get_position, -}; - static void _player_play_pause(struct _priv *priv) { app_media_info *mi; @@ -388,6 +386,11 @@ static void _player_complete_cb(void *data) _player_next(priv); } +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) { struct _priv *priv; @@ -713,13 +716,6 @@ static Evas_Object *_create(Evas_Object *win, void *data) 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); -- cgit v1.2.3