diff options
-rw-r--r-- | src/playlist.c | 4 | ||||
-rw-r--r-- | src/playlist.h | 7 | ||||
-rw-r--r-- | src/playlist_control.c | 10 |
3 files changed, 15 insertions, 6 deletions
diff --git a/src/playlist.c b/src/playlist.c index 79f6022a5..35c09329a 100644 --- a/src/playlist.c +++ b/src/playlist.c @@ -61,12 +61,16 @@ playlist_init(struct playlist *playlist) playlist->queued = -1; playlist->current = -1; + + playlist->prev_elapsed = g_timer_new(); } void playlist_finish(struct playlist *playlist) { queue_finish(&playlist->queue); + + g_timer_destroy(playlist->prev_elapsed); } /** diff --git a/src/playlist.h b/src/playlist.h index 4237cea98..57b2450fa 100644 --- a/src/playlist.h +++ b/src/playlist.h @@ -82,6 +82,13 @@ struct playlist { * This variable is only valid if #playing is true. */ int queued; + + /** + * This timer tracks the time elapsed since the last "prev" + * command. If that is less than one second ago, "prev" jumps + * to the previous song instead of rewinding the current song. + */ + GTimer *prev_elapsed; }; /** the global playlist object */ diff --git a/src/playlist_control.c b/src/playlist_control.c index 4f51345c3..f1702149a 100644 --- a/src/playlist_control.c +++ b/src/playlist_control.c @@ -185,15 +185,11 @@ nextSongInPlaylist(struct playlist *playlist) void previousSongInPlaylist(struct playlist *playlist) { - static time_t lastTime; - time_t diff = time(NULL) - lastTime; - - lastTime += diff; - if (!playlist->playing) return; - if (diff && getPlayerElapsedTime() > PLAYLIST_PREV_UNLESS_ELAPSED) { + if (g_timer_elapsed(playlist->prev_elapsed, NULL) >= 1.0 && + getPlayerElapsedTime() > PLAYLIST_PREV_UNLESS_ELAPSED) { /* re-start playing the current song (just like the "prev" button on CD players) */ @@ -213,6 +209,8 @@ void previousSongInPlaylist(struct playlist *playlist) playPlaylistOrderNumber(playlist, playlist->current); } } + + g_timer_start(playlist->prev_elapsed); } enum playlist_result |