diff options
author | wm4 <wm4@nowhere> | 2014-09-09 00:38:38 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2014-09-09 01:23:10 +0200 |
commit | c0fbab7a7cfcca8c1fa6ac5ea532924b35938923 (patch) | |
tree | 12830798510d03bbdef2c8663a7a1c63c92619ad /common/playlist.c | |
parent | 9cb1e2c58ca21f12b65167eb8a3640bda8eadfd5 (diff) | |
download | mpv-c0fbab7a7cfcca8c1fa6ac5ea532924b35938923.tar.bz2 mpv-c0fbab7a7cfcca8c1fa6ac5ea532924b35938923.tar.xz |
player: deal with some corner cases with playlist navigation
The purpose is making accessing the current playlist entry saner when
commands are executed during initialization, termination, or after
playlist navigation commands.
For example, the "playlist_remove current" command will invalidate
playlist->current - but some things still access the playlist entry even
on uninit. Until now, checking stop_play implicitly took care of it, so
it worked, but it was still messy.
Introduce the mpctx->playing field, which points to the current playlist
entry, even if the entry was removed and/or the playlist's current entry
was moved (e.g. due to playlist navigation).
Diffstat (limited to 'common/playlist.c')
-rw-r--r-- | common/playlist.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/common/playlist.c b/common/playlist.c index 46ae36d643..857f5cb030 100644 --- a/common/playlist.c +++ b/common/playlist.c @@ -106,10 +106,18 @@ static void playlist_unlink(struct playlist *pl, struct playlist_entry *entry) entry->pl = NULL; } +void playlist_entry_unref(struct playlist_entry *e) +{ + e->reserved--; + if (e->reserved < 0) + talloc_free(e); +} + void playlist_remove(struct playlist *pl, struct playlist_entry *entry) { playlist_unlink(pl, entry); - talloc_free(entry); + entry->removed = true; + playlist_entry_unref(entry); } void playlist_clear(struct playlist *pl) |