mplayer: make advancing the playlist respect looping

Explicitly advancing the playlist with input commands ("playlist_next")
didn't jump back to the first file, if the current file was the last on
the playlist and looping was enabled.

Fix this and make the behavior with explicit input and playback EOF the
same.

Also add a minor feature: if looping is enabled, and the current file is
the first on the playlist, going back one entry jumps to the last
playlist entry (without changing loop count).

Fixes #22.
This commit is contained in:
wm4
2013-02-03 16:52:48 +01:00
parent 3b37fadc5d
commit 5f28c34962
3 changed files with 23 additions and 10 deletions
+1 -1
View File
@@ -1871,7 +1871,7 @@ void run_command(MPContext *mpctx, mp_cmd_t *cmd)
int dir = cmd->id == MP_CMD_PLAYLIST_PREV ? -1 : +1;
int force = cmd->args[0].v.i;
struct playlist_entry *e = playlist_get_next(mpctx->playlist, dir);
struct playlist_entry *e = mp_next_file(mpctx, dir);
if (!e && !force)
break;
mpctx->playlist->current = e;
+1
View File
@@ -293,6 +293,7 @@ void mp_switch_track(struct MPContext *mpctx, enum stream_type type,
struct track *mp_track_by_tid(struct MPContext *mpctx, enum stream_type type,
int tid);
bool mp_remove_track(struct MPContext *mpctx, struct track *track);
struct playlist_entry *mp_next_file(struct MPContext *mpctx, int direction);
// timeline/tl_matroska.c
void build_ordered_chapter_timeline(struct MPContext *mpctx);
+21 -9
View File
@@ -4191,6 +4191,26 @@ terminate_playback: // don't jump here after ao/vo/getch initialization!
#endif
}
// Determine the next file to play. Note that if this function returns non-NULL,
// it can have side-effects and mutate mpctx.
struct playlist_entry *mp_next_file(struct MPContext *mpctx, int direction)
{
struct playlist_entry *next = playlist_get_next(mpctx->playlist, direction);
if (!next && mpctx->opts.loop_times >= 0) {
if (direction > 0) {
next = mpctx->playlist->first;
if (next && mpctx->opts.loop_times > 0) {
mpctx->opts.loop_times--;
if (mpctx->opts.loop_times == 0)
mpctx->opts.loop_times = -1;
}
} else {
next = mpctx->playlist->last;
}
}
return next;
}
// Play all entries on the playlist, starting from the current entry.
// Return if all done.
static void play_files(struct MPContext *mpctx)
@@ -4210,15 +4230,7 @@ static void play_files(struct MPContext *mpctx)
struct playlist_entry *new_entry = NULL;
if (mpctx->stop_play == PT_NEXT_ENTRY) {
new_entry = playlist_get_next(mpctx->playlist, +1);
if (!new_entry && mpctx->opts.loop_times >= 0) {
new_entry = mpctx->playlist->first;
if (mpctx->opts.loop_times > 0) {
mpctx->opts.loop_times--;
if (mpctx->opts.loop_times == 0)
mpctx->opts.loop_times = -1;
}
}
new_entry = mp_next_file(mpctx, +1);
} else if (mpctx->stop_play == PT_CURRENT_ENTRY) {
new_entry = mpctx->playlist->current;
} else if (mpctx->stop_play == PT_RESTART) {