/* main loop */ static void BarMainLoop (BarApp_t *app) { pthread_t playerThread; if (!BarMainGetLoginCredentials (&app->settings, &app->input)) { return; } if (!BarMainLoginUser (app)) { return; } if (!BarMainGetStations (app)) { return; } BarMainGetInitialStation (app); /* little hack, needed to signal: hey! we need a playlist, but don't * free anything (there is nothing to be freed yet) */ memset (&app->player, 0, sizeof (app->player)); while (!app->doQuit) { /* song finished playing, clean up things/scrobble song */ if (app->player.mode == PLAYER_FINISHED) { BarMainPlayerCleanup (app, &playerThread); } /* check whether player finished playing and start playing new * song */ if (app->player.mode == PLAYER_DEAD && app->curStation != NULL) { /* what's next? */ if (app->playlist != NULL) { PianoSong_t *histsong = app->playlist; app->playlist = PianoListNextP (app->playlist); histsong->head.next = NULL; BarUiHistoryPrepend (app, histsong); } if (app->playlist == NULL) { BarMainGetPlaylist (app); } /* song ready to play */ if (app->playlist != NULL) { BarMainStartPlayback (app, &playerThread); } } BarMainHandleUserInput (app); /* show time */ if (app->player.mode == PLAYER_PLAYING) { BarMainPrintTime (app); } } if (app->player.mode != PLAYER_DEAD) { pthread_join (playerThread, NULL); } }
/* prepend song to history */ void BarUiHistoryPrepend (BarApp_t *app, PianoSong_t *song) { assert (app != NULL); assert (song != NULL); /* make sure it's a single song */ assert (PianoListNextP (song) == NULL); if (app->settings.history != 0) { app->songHistory = PianoListPrependP (app->songHistory, song); PianoSong_t *del; do { del = PianoListGetP (app->songHistory, app->settings.history); if (del != NULL) { app->songHistory = PianoListDeleteP (app->songHistory, del); PianoDestroyPlaylist (del); } else { break; } } while (true); } else { PianoDestroyPlaylist (song); } }