diff --git a/common/playlist.c b/common/playlist.c index 39c49a52309a9..1851d5c783f26 100644 --- a/common/playlist.c +++ b/common/playlist.c @@ -115,6 +115,8 @@ void playlist_clear(struct playlist *pl) playlist_remove(pl, pl->entries[n]); assert(!pl->current); pl->current_was_replaced = false; + pl->playlist_completed = false; + pl->playlist_started = false; } void playlist_clear_except_current(struct playlist *pl) @@ -123,6 +125,8 @@ void playlist_clear_except_current(struct playlist *pl) if (pl->entries[n] != pl->current) playlist_remove(pl, pl->entries[n]); } + pl->playlist_completed = false; + pl->playlist_started = false; } // Moves the entry so that it takes "at"'s place (or move to end, if at==NULL). @@ -205,8 +209,13 @@ struct playlist_entry *playlist_get_last(struct playlist *pl) struct playlist_entry *playlist_get_next(struct playlist *pl, int direction) { assert(direction == -1 || direction == +1); - if (!pl->current) + if (!pl->current && pl->playlist_completed && direction < 0) { + return playlist_entry_from_index(pl, pl->num_entries - 1); + } else if (!pl->current && !pl->playlist_started && direction > 0) { + return playlist_entry_from_index(pl, 0); + } else if (!pl->current) { return NULL; + } assert(pl->current->pl == pl); if (direction < 0) return playlist_entry_get_rel(pl->current, -1); @@ -333,6 +342,9 @@ int64_t playlist_transfer_entries_to(struct playlist *pl, int dst_index, playlist_update_indexes(pl, dst_index + count, -1); source_pl->num_entries = 0; + pl->playlist_completed = source_pl->playlist_completed; + pl->playlist_started = source_pl->playlist_started; + return first ? first->id : 0; } diff --git a/common/playlist.h b/common/playlist.h index 853cd311da74c..d14d8f3fa532c 100644 --- a/common/playlist.h +++ b/common/playlist.h @@ -70,6 +70,8 @@ struct playlist { // current_was_replaced is set to true. struct playlist_entry *current; bool current_was_replaced; + bool playlist_completed; + bool playlist_started; uint64_t id_alloc; }; diff --git a/player/loadfile.c b/player/loadfile.c index f12ee95a80ea8..06586d5d04e45 100644 --- a/player/loadfile.c +++ b/player/loadfile.c @@ -1024,6 +1024,8 @@ void prepare_playlist(struct MPContext *mpctx, struct playlist *pl) struct MPOpts *opts = mpctx->opts; pl->current = NULL; + pl->playlist_completed = false; + pl->playlist_started = false; if (opts->playlist_pos >= 0) pl->current = playlist_entry_from_index(pl, opts->playlist_pos); @@ -1752,6 +1754,8 @@ static void play_current_file(struct MPContext *mpctx) mpctx->playback_initialized = true; mpctx->playing->playlist_prev_attempt = false; + mpctx->playlist->playlist_completed = false; + mpctx->playlist->playlist_started = true; mp_notify(mpctx, MPV_EVENT_FILE_LOADED, NULL); update_screensaver_state(mpctx); clear_playlist_paths(mpctx); @@ -1992,6 +1996,9 @@ void mp_play_files(struct MPContext *mpctx) new_entry = mpctx->playlist->current; } + if (!new_entry) + mpctx->playlist->playlist_completed = true; + mpctx->playlist->current = new_entry; mpctx->playlist->current_was_replaced = false; mpctx->stop_play = new_entry ? PT_NEXT_ENTRY : PT_STOP;