Index: apps/lang/english.lang =================================================================== --- apps/lang/english.lang (Revision 20305) +++ apps/lang/english.lang (Arbeitskopie) @@ -12418,3 +12418,17 @@ speaker: "Enable Speaker" + + id: LANG_ENABLE_TRACKLOCK + desc: in Settings -> Playback Settings + user: core + + *: "Enable Tracklock" + + + *: "Enable Tracklock" + + + *: "Enable Tracklock" + + Index: apps/gui/gwps-common.c =================================================================== --- apps/gui/gwps-common.c (Revision 20305) +++ apps/gui/gwps-common.c (Arbeitskopie) @@ -62,7 +62,6 @@ #endif #include "backdrop.h" #include "viewport.h" -#include "pcmbuf.h" #define FF_REWIND_MAX_PERCENT 3 /* cap ff/rewind step size at max % of file */ /* 3% of 30min file == 54s step size */ @@ -151,36 +150,6 @@ return false; } -void play_hop(int direction) -{ - unsigned step = ((unsigned)global_settings.skip_length*1000); - unsigned long *elapsed = &(wps_state.id3->elapsed); - - if (direction == 1 && wps_state.id3->length - *elapsed < step+1000) { -#if CONFIG_CODEC == SWCODEC - if(global_settings.beep) - pcmbuf_beep(1000, 150, 1500*global_settings.beep); -#endif - return; - } else if ((direction == -1 && *elapsed < step)) { - *elapsed = 0; - } else { - *elapsed += step * direction; - } - if((audio_status() & AUDIO_STATUS_PLAY) && !wps_state.paused) { -#if (CONFIG_CODEC == SWCODEC) - audio_pre_ff_rewind(); -#else - audio_pause(); -#endif - } - audio_ff_rewind(*elapsed); -#if (CONFIG_CODEC != SWCODEC) - if (!wps_state.paused) - audio_resume(); -#endif -} - bool ffwd_rew(int button) { unsigned int step = 0; /* current ff/rewind step */ Index: apps/gui/gwps-common.h =================================================================== --- apps/gui/gwps-common.h (Revision 20305) +++ apps/gui/gwps-common.h (Arbeitskopie) @@ -29,7 +29,6 @@ bool gui_wps_display(void); bool update_onvol_change(struct gui_wps * gwps); bool update(struct gui_wps *gwps); -void play_hop(int direction); bool ffwd_rew(int button); void display_keylock_text(bool locked); Index: apps/gui/gwps.c =================================================================== --- apps/gui/gwps.c (Revision 20305) +++ apps/gui/gwps.c (Arbeitskopie) @@ -63,6 +63,7 @@ #include "pitchscreen.h" #include "appevents.h" #include "viewport.h" +#include "pcmbuf.h" /* currently only one wps_state is needed */ struct wps_state wps_state; @@ -74,10 +75,14 @@ static void prev_track(unsigned skip_thresh) { - if (!wps_state.id3 || (wps_state.id3->elapsed < skip_thresh*1000)) { + if (!wps_state.id3 || (wps_state.id3->elapsed < skip_thresh*1000)) + { audio_prev(); } - else { + else + { + if (global_settings.tracklock) + return; if (cuesheet_is_enabled() && wps_state.id3->cuesheet_type) { curr_cuesheet_skip(-1, wps_state.id3->elapsed); @@ -102,6 +107,8 @@ static void next_track(void) { + if (global_settings.tracklock) + return; /* take care of if we're playing a cuesheet */ if (cuesheet_is_enabled() && wps_state.id3->cuesheet_type) { @@ -115,6 +122,45 @@ audio_next(); } + +static void play_hop(int direction) +{ + unsigned step = ((unsigned)global_settings.skip_length*1000); + unsigned long *elapsed = &(wps_state.id3->elapsed); + bool tracklock = global_settings.tracklock; + + if (direction == 1 && wps_state.id3->length - *elapsed < step+1000) { +#if CONFIG_CODEC == SWCODEC + if(global_settings.beep) + pcmbuf_beep(1000, 150, 1500*global_settings.beep); +#endif + if (!tracklock) + next_track(); + return; + } else if ((direction == -1 && *elapsed < step)) { + if (!tracklock) + { + prev_track(3); + return; + } + *elapsed = 0; + } else { + *elapsed += step * direction; + } + if((audio_status() & AUDIO_STATUS_PLAY) && !wps_state.paused) { +#if (CONFIG_CODEC == SWCODEC) + audio_pre_ff_rewind(); +#else + audio_pause(); +#endif + } + audio_ff_rewind(*elapsed); +#if (CONFIG_CODEC != SWCODEC) + if (!wps_state.paused) + audio_resume(); +#endif +} + static int fix_wps_bars(void) { #ifdef HAVE_LCD_BITMAP Index: apps/settings.h =================================================================== --- apps/settings.h (Revision 20305) +++ apps/settings.h (Arbeitskopie) @@ -725,6 +725,7 @@ #ifdef HAVE_SPEAKER bool speaker_enabled; #endif + bool tracklock; /* If values are just added to the end, no need to bump plugin API version. */ Index: apps/menus/playback_menu.c =================================================================== --- apps/menus/playback_menu.c (Revision 20305) +++ apps/menus/playback_menu.c (Arbeitskopie) @@ -176,6 +176,7 @@ #endif MENUITEM_SETTING(skip_length, &global_settings.skip_length, NULL); +MENUITEM_SETTING(tracklock, &global_settings.tracklock, NULL); MAKE_MENU(playback_settings,ID2P(LANG_PLAYBACK),0, Icon_Playback_menu, @@ -197,7 +198,7 @@ #ifdef HAVE_HEADPHONE_DETECTION ,&unplug_menu #endif - ,&skip_length + ,&skip_length, &tracklock, ); static int playback_callback(int action,const struct menu_item_ex *this_item) Index: apps/settings_list.c =================================================================== --- apps/settings_list.c (Revision 20305) +++ apps/settings_list.c (Arbeitskopie) @@ -1462,6 +1462,7 @@ OFFON_SETTING(0, speaker_enabled, LANG_ENABLE_SPEAKER, false, "speaker", audiohw_enable_speaker), #endif + OFFON_SETTING(0, tracklock, LANG_ENABLE_TRACKLOCK, false, "tracklock", NULL), }; const int nb_settings = sizeof(settings)/sizeof(*settings);