Add option to prevent rewinding to the beginning of a track to prevent
loosing the current resume position.
Initially contributed by Dave Slusher
---
apps/cuesheet.c | 14 +++++++++++---
apps/gui/wps.c | 8 +++++++-
apps/lang/english.lang | 42 ++++++++++++++++++++++++++++++++++++++++++
apps/menus/settings_menu.c | 4 +++-
apps/metadata.c | 10 ++++++++++
apps/metadata.h | 1 +
apps/settings.h | 5 +++++
apps/settings_list.c | 6 ++++++
8 files changed, 85 insertions(+), 5 deletions(-)
diff --git a/apps/cuesheet.c b/apps/cuesheet.c
index a6831fa..aa16e64 100644
--- a/apps/cuesheet.c
+++ b/apps/cuesheet.c
@@ -319,7 +319,14 @@ bool display_cuesheet_content(char* filename)
bool curr_cuesheet_skip(struct cuesheet *cue, int direction, unsigned long curr_pos)
{
int track = cue_find_current_track(cue, curr_pos);
-
+ bool prevent_skipback = false;
+
+#if defined(HAVE_TAGCACHE) && CONFIG_CODEC == SWCODEC
+ /* Protect resume position by disallowing skipback to 00:00 of
+ current track? */
+ prevent_skipback = disallow_skipback(audio_current_track());
+#endif
+
if (direction >= 0 && track == cue->track_count - 1)
{
/* we want to get out of the cuesheet */
@@ -334,8 +341,9 @@ bool curr_cuesheet_skip(struct cuesheet *cue, int direction, unsigned long curr_
to previous cuesheet segment. If skipping backward after
DEFAULT_SKIP_TRESH seconds have elapsed, skip to the start of the
current cuesheet segment */
- if (direction == 1 ||
- ((curr_pos - cue->tracks[track].offset) < DEFAULT_SKIP_TRESH))
+ if (direction == 1
+ || ((curr_pos - cue->tracks[track].offset) < DEFAULT_SKIP_TRESH)
+ || prevent_skipback)
{
track += direction;
}
diff --git a/apps/gui/wps.c b/apps/gui/wps.c
index 44e4adb..f83f8d2 100644
--- a/apps/gui/wps.c
+++ b/apps/gui/wps.c
@@ -458,7 +458,13 @@ static void change_dir(int direction)
static void prev_track(unsigned long skip_thresh)
{
struct wps_state *state = skin_get_global_state();
- if (state->id3->elapsed < skip_thresh)
+ bool prevent_skipback = false;
+
+#if defined(HAVE_TAGCACHE) && CONFIG_CODEC == SWCODEC
+ prevent_skipback = disallow_skipback(state->id3);
+#endif
+
+ if (state->id3->elapsed < skip_thresh || prevent_skipback)
{
audio_prev();
return;
diff --git a/apps/lang/english.lang b/apps/lang/english.lang
index 30fb003..d74e5b0 100644
--- a/apps/lang/english.lang
+++ b/apps/lang/english.lang
@@ -12744,3 +12744,45 @@
*: "In custom directories only"
+
+ id: LANG_AUTORESUME_SKIPBACK
+ desc: Skipback settings menu to enable/disable resume
+ user: core
+
+ *: "Allow skip back to intro"
+
+
+ *: "Allow skip back to intro"
+
+
+ *: "Allow skip back to intro"
+
+
+
+ id: LANG_AUTORESUME_SKIPBACK_ALWAYS
+ desc: Skipback settings menu to enable/disable resume
+ user: core
+
+ *: "Always (may lose resume position)"
+
+
+ *: "Always (may lose resume position)"
+
+
+ *: "Always. May lose resume position"
+
+
+
+ id: LANG_AUTORESUME_SKIPBACK_NONRESUME
+ desc: Skipback settings menu to enable/disable resume
+ user: core
+
+ *: "Not when resumable on automatic track change"
+
+
+ *: "Not when resumable on automatic track change"
+
+
+ *: "Not when resumable on automatic track change"
+
+
diff --git a/apps/menus/settings_menu.c b/apps/menus/settings_menu.c
index b3003bf..4c266b2 100644
--- a/apps/menus/settings_menu.c
+++ b/apps/menus/settings_menu.c
@@ -416,10 +416,12 @@ MENUITEM_SETTING(autoresume_enable, &global_settings.autoresume_enable,
autoresume_callback);
MENUITEM_SETTING(autoresume_automatic, &global_settings.autoresume_automatic,
autoresume_nexttrack_callback);
+MENUITEM_SETTING(autoresume_skipback, &global_settings.autoresume_skipback,
+ NULL);
MAKE_MENU(autoresume_menu, ID2P(LANG_AUTORESUME),
0, Icon_NOICON,
- &autoresume_enable, &autoresume_automatic);
+ &autoresume_enable, &autoresume_automatic, &autoresume_skipback);
#endif /* CONFIG_CODEC == SWCODEC */
#endif /* HAVE_TAGCACHE */
diff --git a/apps/metadata.c b/apps/metadata.c
index 46b9482..22cb027 100644
--- a/apps/metadata.c
+++ b/apps/metadata.c
@@ -474,6 +474,16 @@ bool autoresumable(struct mp3entry *id3)
return is_resumable;
}
+bool disallow_skipback(struct mp3entry *id3)
+{
+ return global_settings.autoresume_enable
+ && global_settings.autoresume_skipback != AUTORESUME_SKIPBACK_ALWAYS
+ && (global_settings.autoresume_skipback == AUTORESUME_SKIPBACK_NEVER
+ || global_settings.autoresume_automatic == AUTORESUME_NEXTTRACK_ALWAYS
+ || (global_settings.autoresume_automatic == AUTORESUME_NEXTTRACK_CUSTOM
+ && autoresumable(id3)));
+}
+
#endif /* SWCODEC */
#endif /* HAVE_TAGCACHE */
#endif /* __PCTOOL__ */
diff --git a/apps/metadata.h b/apps/metadata.h
index 4c7e94f..d17478d 100644
--- a/apps/metadata.h
+++ b/apps/metadata.h
@@ -312,6 +312,7 @@ void strip_tags(int handle_id);
#ifdef HAVE_TAGCACHE
bool autoresumable(struct mp3entry *id3);
+bool disallow_skipback(struct mp3entry *id3);
#endif
#endif
diff --git a/apps/settings.h b/apps/settings.h
index 0734cf0..0723d30 100644
--- a/apps/settings.h
+++ b/apps/settings.h
@@ -129,6 +129,9 @@ enum { SCROLLBAR_OFF = 0, SCROLLBAR_LEFT, SCROLLBAR_RIGHT };
enum { AUTORESUME_NEXTTRACK_NEVER = 0, AUTORESUME_NEXTTRACK_ALWAYS,
AUTORESUME_NEXTTRACK_CUSTOM};
+enum { AUTORESUME_SKIPBACK_ALWAYS = 0, AUTORESUME_SKIPBACK_NONRESUME,
+ AUTORESUME_SKIPBACK_NEVER };
+
/* Alarm settings */
#ifdef HAVE_RTC_ALARM
enum { ALARM_START_WPS = 0,
@@ -584,6 +587,8 @@ struct user_settings
int autoresume_automatic; /* resume next track? 0=never, 1=always,
2=custom */
unsigned char autoresume_paths[MAX_PATHNAME+1]; /* colon-separated list */
+ int autoresume_skipback; /* skipback for resumable tracks? 0=do skip back,
+ 1=only for nonresumable tracks, 2=always */
bool runtimedb; /* runtime database active? */
#endif /* HAVE_TAGCACHE */
diff --git a/apps/settings_list.c b/apps/settings_list.c
index 2d73028..616b0c3 100644
--- a/apps/settings_list.c
+++ b/apps/settings_list.c
@@ -1270,6 +1270,12 @@ const struct settings_list settings[] = {
ID2P(LANG_AUTORESUME_CUSTOM)),
TEXT_SETTING(0, autoresume_paths, "autoresume next track paths",
"/podcast:/podcasts", NULL, NULL),
+ CHOICE_SETTING(0, autoresume_skipback, LANG_AUTORESUME_SKIPBACK,
+ AUTORESUME_SKIPBACK_NONRESUME,
+ "autoresume skipback", "always,nonresumable,never", NULL, 3,
+ ID2P(LANG_AUTORESUME_SKIPBACK_ALWAYS),
+ ID2P(LANG_AUTORESUME_SKIPBACK_NONRESUME),
+ ID2P(LANG_SET_BOOL_NO)),
#endif
OFFON_SETTING(0, runtimedb, LANG_RUNTIMEDB_ACTIVE, false,
--
1.7.1