diff options
-rw-r--r-- | src/main.c | 38 | ||||
-rw-r--r-- | src/ui.c | 30 | ||||
-rw-r--r-- | src/ui.h | 1 | ||||
-rw-r--r-- | src/ui_act.c | 10 |
4 files changed, 41 insertions, 38 deletions
@@ -157,40 +157,6 @@ static void BarMainHandleUserInput (BarApp_t *app) { } } -/* append current song to history list and move to the next song - */ -static void BarMainNextSong (BarApp_t *app) { - if (app->settings.history != 0) { - /* prepend song to history list */ - PianoSong_t *tmpSong = app->songHistory; - app->songHistory = app->playlist; - /* select next song */ - app->playlist = app->playlist->next; - app->songHistory->next = tmpSong; - - /* limit history's length */ - /* start with 1, so we're stopping at n-1 and have the - * chance to set ->next = NULL */ - unsigned int i = 1; - tmpSong = app->songHistory; - while (i < app->settings.history && tmpSong != NULL) { - tmpSong = tmpSong->next; - ++i; - } - /* if too many songs in history... */ - if (tmpSong != NULL) { - PianoSong_t *delSong = tmpSong->next; - tmpSong->next = NULL; - if (delSong != NULL) { - PianoDestroyPlaylist (delSong); - } - } - } else { - /* don't keep history */ - app->playlist = app->playlist->next; - } -} - /* fetch new playlist */ static void BarMainGetPlaylist (BarApp_t *app) { @@ -338,7 +304,9 @@ static void BarMainLoop (BarApp_t *app) { if (app->curStation != NULL) { /* what's next? */ if (app->playlist != NULL) { - BarMainNextSong (app); + PianoSong_t *histsong = app->playlist; + app->playlist = app->playlist->next; + BarUiHistoryPrepend (app, histsong); } if (app->playlist == NULL) { BarMainGetPlaylist (app); @@ -694,3 +694,33 @@ void BarUiStartEventCmd (const BarSettings_t *settings, const char *type, waitpid (chld, &status, 0); } } + +/* prepend song to history, must not be a list of songs as ->next is modified! + */ +void BarUiHistoryPrepend (BarApp_t *app, PianoSong_t *song) { + if (app->settings.history != 0) { + PianoSong_t *tmpSong; + + song->next = app->songHistory; + app->songHistory = song; + + /* limit history's length */ + /* start with 1, so we're stopping at n-1 and have the + * chance to set ->next = NULL */ + unsigned int i = 1; + tmpSong = app->songHistory; + while (i < app->settings.history && tmpSong != NULL) { + tmpSong = tmpSong->next; + ++i; + } + /* if too many songs in history... */ + if (tmpSong != NULL) { + PianoSong_t *delSong = tmpSong->next; + tmpSong->next = NULL; + if (delSong != NULL) { + PianoDestroyPlaylist (delSong); + } + } + } +} + @@ -53,5 +53,6 @@ void BarUiStartEventCmd (const BarSettings_t *, const char *, PianoStation_t *, PianoReturn_t, WaitressReturn_t); int BarUiPianoCall (BarApp_t * const, PianoRequestType_t, void *, PianoReturn_t *, WaitressReturn_t *); +void BarUiHistoryPrepend (BarApp_t *app, PianoSong_t *song); #endif /* _UI_H */ diff --git a/src/ui_act.c b/src/ui_act.c index a57cb01..096daa1 100644 --- a/src/ui_act.c +++ b/src/ui_act.c @@ -190,7 +190,8 @@ BarUiActCallback(BarUiActDeleteStation) { if (BarUiActDefaultPianoCall (PIANO_REQUEST_DELETE_STATION, selStation) && selStation == app->curStation) { BarUiDoSkipSong (&app->player); - PianoDestroyPlaylist (app->playlist); + PianoDestroyPlaylist (app->playlist->next); + BarUiHistoryPrepend (app, app->playlist); app->playlist = NULL; app->curStation = NULL; } @@ -381,8 +382,11 @@ BarUiActCallback(BarUiActSelectStation) { app->curStation = newStation; BarUiPrintStation (app->curStation); BarUiDoSkipSong (&app->player); - PianoDestroyPlaylist (app->playlist); - app->playlist = NULL; + if (app->playlist != NULL) { + PianoDestroyPlaylist (app->playlist->next); + BarUiHistoryPrepend (app, app->playlist); + app->playlist = NULL; + } } } |