Index: apps/plugins/lib/playback_control.c =================================================================== --- apps/plugins/lib/playback_control.c (revision 20543) +++ apps/plugins/lib/playback_control.c (working copy) @@ -48,6 +48,63 @@ return false; } +static int ff_rewind_action_callback(int action, struct gui_synclist *lists) +{ + (void) lists; + if (action == ACTION_STD_OK) + return ACTION_STD_CANCEL; + return action; +} +static char *ff_rewind_get_name(int selected, void* data, + char* buf, size_t buf_len) +{ + int *steps = (int *) data; + int val = steps[selected]; + if(val < 60) + rb->snprintf(buf, buf_len, "%d s", val); + else if(val % 60 == 0) + rb->snprintf(buf, buf_len, "%d min", val/60); + else + rb->snprintf(buf, buf_len, "%d min %d s", val/60, val%60); + return buf; +} +static bool ff_rewind(void* param) +{ + const int steps[] = { + 1,2,3,5,7,10,15,20,30,45,60,90,120,180,300,600,900, + }; + int direction = (int) param; + struct simplelist_info info; + + rb->simplelist_info_init(&info, direction<0?"Rewind":"Fastforward", + sizeof(steps)/sizeof(steps[0]), (void*)steps); + info.action_callback = ff_rewind_action_callback; + info.get_name = ff_rewind_get_name; + if(rb->simplelist_show_list(&info)) + return true; + if(info.selection >= 0 && (rb->audio_status() & AUDIO_STATUS_PLAY)) + { + struct mp3entry *entry = rb->audio_current_track(); + bool audio_paused = (rb->audio_status() & AUDIO_STATUS_PAUSE); + long newtime, val = steps[info.selection]*1000; + if(direction < 0) + val = -val; + newtime = entry->elapsed + val; + if(newtime > (signed long)entry->length-1000) + newtime = entry->length-1000; + if(newtime < 0) + newtime = 0; + + if (!audio_paused) + rb->audio_pause(); + rb->audio_ff_rewind(newtime); + rb->sleep(HZ/10); /* take affect ff/rewinding */ + if (!audio_paused) + rb->audio_resume(); + } + return false; +} + static bool stop(void) { rb->audio_stop(); @@ -92,6 +149,10 @@ prevtrack, NULL, NULL, Icon_NOICON); MENUITEM_FUNCTION(playpause_item, 0, "Pause / Play", play, NULL, NULL, Icon_NOICON); +MENUITEM_FUNCTION(rewind_item, MENU_FUNC_USEPARAM, "Rewind", + ff_rewind, (void *)-1, NULL, Icon_NOICON); +MENUITEM_FUNCTION(ff_item, MENU_FUNC_USEPARAM, "Fastforward", + ff_rewind, (void *) 1, NULL, Icon_NOICON); MENUITEM_FUNCTION(stop_item, 0, "Stop Playback", stop, NULL, NULL, Icon_NOICON); MENUITEM_FUNCTION(nexttrack_item, 0, "Next Track", @@ -103,7 +164,8 @@ MENUITEM_FUNCTION(repeat_mode_item, 0, "Change Repeat Mode", repeat_mode, NULL, NULL, Icon_NOICON); MAKE_MENU(playback_control_menu, "Playback Control", NULL, Icon_NOICON, - &prevtrack_item, &playpause_item, &stop_item, &nexttrack_item, + &prevtrack_item, &playpause_item, &rewind_item, &ff_item, + &stop_item, &nexttrack_item, &volume_item, &shuffle_item, &repeat_mode_item); void playback_control_init(struct viewport parent[NB_SCREENS])