mplayer: adds support shuffling the list 91/46391/2
authorMinkyu Kang <mk7.kang@samsung.com>
Thu, 20 Aug 2015 04:19:52 +0000 (13:19 +0900)
committerMinkyu Kang <mk7.kang@samsung.com>
Thu, 20 Aug 2015 07:21:28 +0000 (16:21 +0900)
Change-Id: I6d301b24b8360903ceaed56d2cbb7dc40b575dd3
Signed-off-by: Minkyu Kang <mk7.kang@samsung.com>
res/edc/widgets/genlist.edc
src/view/mplayer.c

index 8ac6183..72b611e 100644 (file)
@@ -276,6 +276,7 @@ group {
                                        ellipsis: -1;
                                }
                                visible: 0;
+                               fixed: 1 1;
                        }
                        description {
                                state: "default" 0.1;
index 324cda0..692346b 100644 (file)
@@ -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);