diff options
author | Max Kellermann <max@duempel.org> | 2008-11-13 02:09:33 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2008-11-13 02:09:33 +0100 |
commit | 709640422c07b8f79c9ffad6ffde0d1f5f317523 (patch) | |
tree | 373a331f0ff09a67487d4525e8a3fb9b8b7e3dc0 | |
parent | 66ce1495f07cd065346cdc2067b034e142a0fa96 (diff) | |
download | mpd-709640422c07b8f79c9ffad6ffde0d1f5f317523.tar.gz mpd-709640422c07b8f79c9ffad6ffde0d1f5f317523.tar.xz mpd-709640422c07b8f79c9ffad6ffde0d1f5f317523.zip |
player: chop the tail of the music pipe after CANCEL
When a CANCEL command is received, the player should drop all chunks
of the next song. Added new funciton music_pipe_chop() which is used
for that.
-rw-r--r-- | src/pipe.c | 12 | ||||
-rw-r--r-- | src/pipe.h | 6 | ||||
-rw-r--r-- | src/player_thread.c | 1 |
3 files changed, 19 insertions, 0 deletions
diff --git a/src/pipe.c b/src/pipe.c index 7afbefcb1..23a23469c 100644 --- a/src/pipe.c +++ b/src/pipe.c @@ -301,6 +301,18 @@ void music_pipe_skip(unsigned num) music_pipe_shift(); } +void music_pipe_chop(unsigned first) +{ + for (unsigned i = first; i != music_pipe.end; i = successor(i)) + music_chunk_free(&music_pipe.chunks[i]); + + music_chunk_free(&music_pipe.chunks[music_pipe.end]); + + music_pipe.end = first; + music_chunk_init(&music_pipe.chunks[first]); + +} + #ifndef NDEBUG void music_pipe_check_format(const struct audio_format *current, int next_index, const struct audio_format *next) diff --git a/src/pipe.h b/src/pipe.h index 78389d062..7d82c1693 100644 --- a/src/pipe.h +++ b/src/pipe.h @@ -164,6 +164,12 @@ bool music_pipe_tag(const struct tag *tag); void music_pipe_skip(unsigned num); +/** + * Chop off the tail of the music pipe, starting with the chunk at + * index "first". + */ +void music_pipe_chop(unsigned first); + #ifndef NDEBUG void music_pipe_check_format(const struct audio_format *current, int next_index, const struct audio_format *next); diff --git a/src/player_thread.c b/src/player_thread.c index 9a606d7d9..9f2ff4389 100644 --- a/src/player_thread.c +++ b/src/player_thread.c @@ -203,6 +203,7 @@ static void player_process_command(struct player *player) /* the decoder is already decoding the song - stop it and reset the position */ dc_stop(&pc.notify); + music_pipe_chop(player->next_song_chunk); player->next_song_chunk = -1; } |