From: Minkyu Kang Date: Thu, 20 Aug 2015 04:19:52 +0000 (+0900) Subject: mplayer: adds support shuffling the list X-Git-Tag: accepted/tizen/tv/20150821.130441~5 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=70875af707430879dee58a611590c2ba74bf1acf;p=profile%2Ftv%2Fapps%2Fnative%2Fair_mediahub.git mplayer: adds support shuffling the list Change-Id: I6d301b24b8360903ceaed56d2cbb7dc40b575dd3 Signed-off-by: Minkyu Kang --- diff --git a/res/edc/widgets/genlist.edc b/res/edc/widgets/genlist.edc index 8ac6183..72b611e 100644 --- a/res/edc/widgets/genlist.edc +++ b/res/edc/widgets/genlist.edc @@ -276,6 +276,7 @@ group { ellipsis: -1; } visible: 0; + fixed: 1 1; } description { state: "default" 0.1; diff --git a/src/view/mplayer.c b/src/view/mplayer.c index 324cda0..692346b 100644 --- a/src/view/mplayer.c +++ b/src/view/mplayer.c @@ -45,7 +45,9 @@ struct _list_data { struct _playlist { Eina_List *list; + Eina_List *list_org; int cur; + bool shuffle; }; struct _priv { @@ -156,7 +158,20 @@ static void _draw_progressbar(struct _priv *priv, app_media_info *mi) progressbar_show(priv->progress); } -static app_media_info *_get_current_media_info(struct _priv *priv) +static app_media *_playlist_get_media(Eina_List *list, int index) +{ + app_media *am; + + am = eina_list_nth(list, index); + if (!am) { + _ERR("failed to get app_media"); + return NULL; + } + + return am; +} + +static app_media_info *_playlist_get_current_media_info(struct _priv *priv) { app_media *am; app_media_info *mi; @@ -176,6 +191,38 @@ static app_media_info *_get_current_media_info(struct _priv *priv) return mi; } +static int _playlist_get_index(Eina_List *dest, Eina_List *src, int index) +{ + app_media *am; + + am = _playlist_get_media(src, index); + + return util_get_media_index(dest, am); +} + +static void _playlist_set_list(struct _priv *priv, bool shuffle, int index) +{ + struct _playlist *p; + app_media *am; + + p = &priv->playlist; + if (!p) { + _ERR("playlist is NULL"); + return; + } + + am = _playlist_get_media(p->list, index); + eina_list_free(p->list); + + p->list = eina_list_clone(p->list_org); + + if (shuffle) + p->list = eina_list_shuffle(p->list, NULL); + + p->cur = util_get_media_index(p->list, am); + p->shuffle = shuffle; +} + static void _update_info(struct _priv *priv, app_media_info *mi) { struct view_update_data vdata; @@ -184,7 +231,8 @@ static void _update_info(struct _priv *priv, app_media_info *mi) progressbar_reset(priv->progress, 0, mi->audio->duration); /* update play info */ - vdata.index = priv->playlist.cur; + vdata.index = _playlist_get_index(priv->playlist.list_org, + priv->playlist.list, priv->playlist.cur); viewmgr_update_view(VIEW_BASE, UPDATE_PLAY_INFO, &vdata); /* update history */ @@ -196,7 +244,7 @@ static void _mplayer_show(struct _priv *priv) struct controller *ctl; app_media_info *mi; - mi = _get_current_media_info(priv); + mi = _playlist_get_current_media_info(priv); if (!mi) { _ERR("failed to getting media info"); return; @@ -301,7 +349,7 @@ static void _player_play_pause(struct _priv *priv) break; case PLAYER_STATE_IDLE: case PLAYER_STATE_READY: - mi = _get_current_media_info(priv); + mi = _playlist_get_current_media_info(priv); if (!mi) { _ERR("failed to getting media info"); return; @@ -331,7 +379,7 @@ static void _player_next(struct _priv *priv) playermgr_stop(priv->player); break; case PLAYER_STATE_PLAYING: - mi = _get_current_media_info(priv); + mi = _playlist_get_current_media_info(priv); if (!mi) { _ERR("failed to getting media info"); return; @@ -353,7 +401,7 @@ static void _player_play(struct _priv *priv) const char *path; struct controller *ctl; - mi = _get_current_media_info(priv); + mi = _playlist_get_current_media_info(priv); if (!mi) { _ERR("failed to getting media info"); return; @@ -421,32 +469,14 @@ static struct progressbar_ops _progressbar_ops = { .get_value = _player_get_position, }; -static void _callback_music(void *data, const char *ev) -{ - struct _priv *priv; - - if (!data || !ev) - return; - - priv = data; - - if (!strcmp(ev, SRC_BTN_MUSIC_PREV)) { - _mplayer_prev(priv); - _player_next(priv); - } else if (!strcmp(ev, SRC_BTN_MUSIC_NEXT)) { - _mplayer_next(priv); - _player_next(priv); - } else if (!strcmp(ev, SRC_BTN_MUSIC_PLAY)) { - _player_play_pause(priv); - } -} - static void _pop_view(struct _priv *priv) { struct view_update_data vdata; if (viewmgr_active_view_count() > 1) { - vdata.index = priv->playlist.cur; + vdata.index = _playlist_get_index(priv->playlist.list_org, + priv->playlist.list, priv->playlist.cur); + viewmgr_update_view(VIEW_BASE, UPDATE_FOCUS, &vdata); } @@ -686,6 +716,33 @@ static void _add_playlist_item(struct _priv *priv) } } +static void _callback_music(void *data, const char *ev) +{ + struct _priv *priv; + + if (!data || !ev) + return; + + priv = data; + + if (!strcmp(ev, SRC_BTN_MUSIC_PREV)) { + _mplayer_prev(priv); + _player_next(priv); + } else if (!strcmp(ev, SRC_BTN_MUSIC_NEXT)) { + _mplayer_next(priv); + _player_next(priv); + } else if (!strcmp(ev, SRC_BTN_MUSIC_PLAY)) { + _player_play_pause(priv); + } else if (!strcmp(ev, SRC_BTN_MUSIC_SHUFFLE)) { + _playlist_set_list(priv, !priv->playlist.shuffle, + priv->playlist.cur); + _add_playlist_item(priv); + + _mplayer_set_current(priv, priv->playlist.cur); + _player_play(priv); + } +} + static bool _ui_init(struct _priv *priv) { struct controller *ctl; @@ -783,7 +840,9 @@ static Evas_Object *_create(Evas_Object *win, void *data) priv->base = base; priv->playlist.list = NULL; + priv->playlist.list_org = NULL; priv->playlist.cur = 0; + priv->playlist.shuffle = false; player = playermgr_create(NULL); if (!player) { @@ -873,8 +932,17 @@ static void _update(void *view_data, int update_type, void *data) if (!vdata) break; - priv->playlist.list = vdata->list; - priv->playlist.cur = vdata->index; + if (priv->playlist.list_org != vdata->list) { + priv->playlist.list_org = vdata->list; + priv->playlist.list = eina_list_clone(vdata->list); + + _playlist_set_list(priv, + priv->playlist.shuffle, vdata->index); + } else { + priv->playlist.cur = _playlist_get_index( + priv->playlist.list, + vdata->list, vdata->index); + } _add_playlist_item(priv); break; @@ -922,6 +990,8 @@ static void _destroy(void *view_data) inputmgr_remove_callback(obj, &_btn_handler); } + eina_list_free(priv->playlist.list); + _list_free(priv); inputmgr_remove_callback(priv->list, &_list_handler);