aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/pipe.c12
-rw-r--r--src/pipe.h6
-rw-r--r--src/player_thread.c1
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;
}