summaryrefslogtreecommitdiffstats
path: root/apps/settings_list.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/settings_list.c')
-rw-r--r--apps/settings_list.c35
1 files changed, 27 insertions, 8 deletions
diff --git a/apps/settings_list.c b/apps/settings_list.c
index 134b93cf48..a830ea7428 100644
--- a/apps/settings_list.c
+++ b/apps/settings_list.c
@@ -622,14 +622,31 @@ static void eq_set_default(void* setting, void* defaultval)
/* perform shuffle/unshuffle of the current playlist based on the boolean provided */
static void shuffle_playlist_callback(bool shuffle)
{
- if (shuffle)
+ struct playlist_info *playlist = playlist_get_current();
+ if (playlist->started)
{
- playlist_randomise(NULL, current_tick, true);
+ if ((audio_status() & AUDIO_STATUS_PLAY) == AUDIO_STATUS_PLAY)
+ {
+ replaygain_update();
+ if (shuffle)
+ {
+ playlist_randomise(playlist, current_tick, true);
+ }
+ else
+ {
+ playlist_sort(playlist, true);
+ }
+ }
}
- else
+}
+
+static void repeat_mode_callback(int repeat)
+{
+ if ((audio_status() & AUDIO_STATUS_PLAY) == AUDIO_STATUS_PLAY)
{
- playlist_sort(NULL, true);
+ audio_flush_and_reload_tracks();
}
+ (void)repeat;
}
#ifdef HAVE_QUICKSCREEN
@@ -912,17 +929,19 @@ const struct settings_list settings[] = {
#endif
/* playback */
- OFFON_SETTING(0, playlist_shuffle, LANG_SHUFFLE, false, "shuffle", shuffle_playlist_callback),
+ OFFON_SETTING(F_CB_ON_SELECT_ONLY_IF_CHANGED, playlist_shuffle, LANG_SHUFFLE,
+ false, "shuffle", shuffle_playlist_callback),
+
SYSTEM_SETTING(NVRAM(4), resume_index, -1),
SYSTEM_SETTING(NVRAM(4), resume_crc32, -1),
SYSTEM_SETTING(NVRAM(4), resume_elapsed, -1),
SYSTEM_SETTING(NVRAM(4), resume_offset, -1),
- CHOICE_SETTING(0, repeat_mode, LANG_REPEAT, REPEAT_OFF, "repeat",
- "off,all,one,shuffle"
+ CHOICE_SETTING(F_CB_ON_SELECT_ONLY_IF_CHANGED, repeat_mode, LANG_REPEAT,
+ REPEAT_OFF, "repeat", "off,all,one,shuffle"
#ifdef AB_REPEAT_ENABLE
",ab"
#endif
- , NULL,
+ , repeat_mode_callback,
#ifdef AB_REPEAT_ENABLE
5,
#else