diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/decoder_control.c | 8 | ||||
-rw-r--r-- | src/decoder_control.h | 16 | ||||
-rw-r--r-- | src/player_thread.c | 15 |
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 && |