aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/decoder_control.c8
-rw-r--r--src/decoder_control.h16
-rw-r--r--src/player_thread.c15
3 files changed, 25 insertions, 14 deletions
diff --git a/src/decoder_control.c b/src/decoder_control.c
index 058cd3f33..7fe18088b 100644
--- a/src/decoder_control.c
+++ b/src/decoder_control.c
@@ -84,12 +84,16 @@ dc_command_async(struct decoder_control *dc, enum decoder_command cmd)
}
void
-dc_start(struct decoder_control *dc, struct song *song)
+dc_start(struct decoder_control *dc, struct song *song,
+ struct music_buffer *buffer, struct music_pipe *pipe)
{
- assert(dc->pipe != NULL);
assert(song != NULL);
+ assert(buffer != NULL);
+ assert(pipe != NULL);
dc->song = song;
+ dc->buffer = buffer;
+ dc->pipe = pipe;
dc_command(dc, DECODE_COMMAND_START);
}
diff --git a/src/decoder_control.h b/src/decoder_control.h
index 635855e17..38c4f0d83 100644
--- a/src/decoder_control.h
+++ b/src/decoder_control.h
@@ -84,7 +84,10 @@ struct decoder_control {
/** the #music_chunk allocator */
struct music_buffer *buffer;
- /** the destination pipe for decoded chunks */
+ /**
+ * The destination pipe for decoded chunks. The caller thread
+ * owns this object, and is responsible for freeing it.
+ */
struct music_pipe *pipe;
};
@@ -211,8 +214,17 @@ decoder_current_song(const struct decoder_control *dc)
void
dc_command_wait(struct decoder_control *dc);
+/**
+ * Start the decoder.
+ *
+ * @param the decoder
+ * @param song the song to be decoded
+ * @param pipe the pipe which receives the decoded chunks (owned by
+ * the caller)
+ */
void
-dc_start(struct decoder_control *dc, struct song *song);
+dc_start(struct decoder_control *dc, struct song *song,
+ struct music_buffer *buffer, struct music_pipe *pipe);
void
dc_stop(struct decoder_control *dc);
diff --git a/src/player_thread.c b/src/player_thread.c
index 91b373380..b6599ed0d 100644
--- a/src/player_thread.c
+++ b/src/player_thread.c
@@ -129,14 +129,14 @@ static void player_command_finished(void)
* Player lock is not held.
*/
static void
-player_dc_start(struct player *player)
+player_dc_start(struct player *player, struct music_pipe *pipe)
{
struct decoder_control *dc = player->dc;
assert(player->queued);
assert(pc.next_song != NULL);
- dc_start(dc, pc.next_song);
+ dc_start(dc, pc.next_song, player_buffer, pipe);
}
/**
@@ -346,10 +346,9 @@ static bool player_seek_decoder(struct player *player)
/* clear music chunks which might still reside in the
pipe */
music_pipe_clear(player->pipe, player_buffer);
- dc->pipe = player->pipe;
/* re-start the decoder */
- player_dc_start(player);
+ player_dc_start(player, player->pipe);
ret = player_wait_for_decoder(player);
if (!ret) {
/* decoder failure */
@@ -726,9 +725,7 @@ static void do_play(struct decoder_control *dc)
player.pipe = music_pipe_new();
- dc->buffer = player_buffer;
- dc->pipe = player.pipe;
- player_dc_start(&player);
+ player_dc_start(&player, player.pipe);
if (!player_wait_for_decoder(&player)) {
player_dc_stop(&player);
player_command_finished();
@@ -804,11 +801,9 @@ static void do_play(struct decoder_control *dc)
if (decoder_lock_is_idle(dc) && player.queued) {
/* the decoder has finished the current song;
make it decode the next song */
- assert(pc.next_song != NULL);
assert(dc->pipe == NULL || dc->pipe == player.pipe);
- dc->pipe = music_pipe_new();
- player_dc_start(&player);
+ player_dc_start(&player, music_pipe_new());
}
if (dc->pipe != NULL && dc->pipe != player.pipe &&