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