struct _playlist {
Eina_List *list;
+ Eina_List *list_org;
int cur;
+ bool shuffle;
};
struct _priv {
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;
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;
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 */
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;
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;
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;
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;
.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);
}
}
}
+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;
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) {
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;
inputmgr_remove_callback(obj, &_btn_handler);
}
+ eina_list_free(priv->playlist.list);
+
_list_free(priv);
inputmgr_remove_callback(priv->list, &_list_handler);