void playlist_next(struct playlist *playlist, struct player_control *pc) { int next_order; int current; if (!playlist->playing) return; assert(!queue_is_empty(&playlist->queue)); assert(queue_valid_order(&playlist->queue, playlist->current)); current = playlist->current; playlist->stop_on_error = false; /* determine the next song from the queue's order list */ next_order = queue_next_order(&playlist->queue, playlist->current); if (next_order < 0) { /* no song after this one: stop playback */ playlist_stop(playlist, pc); /* reset "current song" */ playlist->current = -1; } else { if (next_order == 0 && playlist->queue.random) { /* The queue told us that the next song is the first song. This means we are in repeat mode. Shuffle the queue order, so this time, the user hears the songs in a different than before */ assert(playlist->queue.repeat); queue_shuffle_order(&playlist->queue); /* note that playlist->current and playlist->queued are now invalid, but playlist_play_order() will discard them anyway */ } playlist_play_order(playlist, pc, next_order); } /* Consume mode removes each played songs. */ if(playlist->queue.consume) playlist_delete(playlist, pc, queue_order_to_position(&playlist->queue, current)); }
/** * Queue a song, addressed by its order number. */ static void playlist_queue_song_order(struct playlist *playlist, unsigned order) { struct song *song; char *uri; assert(queue_valid_order(&playlist->queue, order)); playlist->queued = order; song = queue_get_order(&playlist->queue, order); uri = song_get_uri(song); g_debug("queue song %i:\"%s\"", playlist->queued, uri); g_free(uri); pc_enqueue_song(song); }
/** * Queue a song, addressed by its order number. */ static void playlist_queue_song_order(struct playlist *playlist, struct player_control *pc, unsigned order) { char *uri; assert(queue_valid_order(&playlist->queue, order)); playlist->queued = order; struct song *song = song_dup_detached(queue_get_order(&playlist->queue, order)); uri = song_get_uri(song); g_debug("queue song %i:\"%s\"", playlist->queued, uri); g_free(uri); pc_enqueue_song(pc, song); }