#define PART_MUSIC_BTN "control_btn"
#define PLAY_BTN_LOC 2
+enum _repeat_state {
+ REPEAT_ALL,
+ REPEAT_ONE,
+ REPEAT_NONE
+};
+
struct _list_data {
app_media *am;
Elm_Object_Item *item;
Eina_List *list_org;
int cur;
bool shuffle;
+ enum _repeat_state repeat;
};
struct _priv {
p->shuffle = shuffle;
}
+static void _playlist_set_repeat_mode(struct _priv *priv)
+{
+ struct _playlist *p;
+
+ p = &priv->playlist;
+ if (!p) {
+ _ERR("playlist is NULL");
+ return;
+ }
+
+ switch (p->repeat) {
+ case REPEAT_ALL:
+ p->repeat = REPEAT_ONE;
+ break;
+ case REPEAT_ONE:
+ p->repeat = REPEAT_NONE;
+ break;
+ case REPEAT_NONE:
+ p->repeat = REPEAT_ALL;
+ break;
+ default:
+ _ERR("Unknown repeat state");
+ p->repeat = REPEAT_ALL;
+ break;
+ }
+}
+
static void _update_info(struct _priv *priv, app_media_info *mi)
{
struct view_update_data vdata;
ctl->ops->hide(ctl->handle);
}
-static void _mplayer_prev(struct _priv *priv)
+static bool _mplayer_prev(struct _priv *priv)
{
int total;
total = eina_list_count(priv->playlist.list);
- if (priv->playlist.cur == 0)
- priv->playlist.cur = total - 1;
- else
- priv->playlist.cur--;
+ switch (priv->playlist.repeat) {
+ case REPEAT_ALL:
+ if (priv->playlist.cur != 0)
+ priv->playlist.cur--;
+ else
+ priv->playlist.cur = total - 1;
+ break;
+ case REPEAT_NONE:
+ if (priv->playlist.cur != 0)
+ priv->playlist.cur--;
+ break;
+ case REPEAT_ONE:
+ break;
+ default:
+ _ERR("Unknown repeat state");
+ break;
+ }
_mplayer_show(priv);
+
+ return true;
}
-static void _mplayer_next(struct _priv *priv)
+static bool _mplayer_next(struct _priv *priv)
{
int total;
+ bool r;
total = eina_list_count(priv->playlist.list);
- if (priv->playlist.cur == total - 1)
- priv->playlist.cur = 0;
- else
- priv->playlist.cur++;
+ r = true;
+
+ switch (priv->playlist.repeat) {
+ case REPEAT_ALL:
+ if (priv->playlist.cur != total - 1)
+ priv->playlist.cur++;
+ else
+ priv->playlist.cur = 0;
+ break;
+ case REPEAT_NONE:
+ if (priv->playlist.cur != total - 1)
+ priv->playlist.cur++;
+ else {
+ priv->playlist.cur = 0;
+ r = false;
+ }
+ break;
+ case REPEAT_ONE:
+ break;
+ default:
+ _ERR("Unknown repeat state");
+ break;
+ }
_mplayer_show(priv);
+
+ return r;
}
static void _mplayer_set_current(struct _priv *priv, int index)
static void _player_complete_cb(void *data)
{
struct _priv *priv;
+ bool r;
if (!data)
return;
priv = data;
- _mplayer_next(priv);
- _player_next(priv);
+ r = _mplayer_next(priv);
+ if (r)
+ _player_next(priv);
+ else
+ _player_stop(priv);
}
static struct progressbar_ops _progressbar_ops = {
static void _callback_music(void *data, const char *ev)
{
struct _priv *priv;
+ bool r;
if (!data || !ev)
return;
_mplayer_prev(priv);
_player_next(priv);
} else if (!strcmp(ev, SRC_BTN_MUSIC_NEXT)) {
- _mplayer_next(priv);
- _player_next(priv);
+ r = _mplayer_next(priv);
+ if (r)
+ _player_next(priv);
+ else
+ _player_stop(priv);
} else if (!strcmp(ev, SRC_BTN_MUSIC_PLAY)) {
_player_play_pause(priv);
} else if (!strcmp(ev, SRC_BTN_MUSIC_SHUFFLE)) {
_mplayer_set_current(priv, priv->playlist.cur);
_player_play(priv);
+ } else if (!strcmp(ev, SRC_BTN_MUSIC_REPEAT)) {
+ _playlist_set_repeat_mode(priv);
}
}
priv->playlist.list_org = NULL;
priv->playlist.cur = 0;
priv->playlist.shuffle = false;
+ priv->playlist.repeat = REPEAT_ALL;
player = playermgr_create(NULL);
if (!player) {