diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/decoder_control.c | 15 | ||||
-rw-r--r-- | src/decoder_control.h | 4 | ||||
-rw-r--r-- | src/player_thread.c | 11 |
3 files changed, 18 insertions, 12 deletions
diff --git a/src/decoder_control.c b/src/decoder_control.c index 44bb63e15..618c78e7e 100644 --- a/src/decoder_control.c +++ b/src/decoder_control.c @@ -18,6 +18,7 @@ */ #include "decoder_control.h" +#include "pipe.h" #include <assert.h> @@ -58,22 +59,28 @@ static void dc_command_async(enum decoder_command cmd) } void -dc_start(struct notify *notify, struct song *song) +dc_start(struct notify *notify, struct song *song, struct music_pipe *pipe) { - assert(dc.pipe != NULL); + assert(dc.pipe == NULL); assert(song != NULL); + assert(pipe != NULL); + assert(music_pipe_empty(pipe)); dc.next_song = song; + dc.pipe = pipe; dc_command(notify, DECODE_COMMAND_START); } void -dc_start_async(struct song *song) +dc_start_async(struct song *song, struct music_pipe *pipe) { - assert(dc.pipe != NULL); + assert(dc.pipe == NULL); assert(song != NULL); + assert(pipe != NULL); + assert(music_pipe_empty(pipe)); dc.next_song = song; + dc.pipe = pipe; dc_command_async(DECODE_COMMAND_START); } diff --git a/src/decoder_control.h b/src/decoder_control.h index 6a04a1617..febf53335 100644 --- a/src/decoder_control.h +++ b/src/decoder_control.h @@ -118,10 +118,10 @@ void dc_command_wait(struct notify *notify); void -dc_start(struct notify *notify, struct song *song); +dc_start(struct notify *notify, struct song *song, struct music_pipe *pipe); void -dc_start_async(struct song *song); +dc_start_async(struct song *song, struct music_pipe *pipe); void dc_stop(struct notify *notify); diff --git a/src/player_thread.c b/src/player_thread.c index a827e7505..3d2ebcb42 100644 --- a/src/player_thread.c +++ b/src/player_thread.c @@ -324,10 +324,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 */ - dc_start_async(pc.next_song); + dc_start_async(pc.next_song, player->pipe); ret = player_wait_for_decoder(player); if (!ret) { /* decoder failure */ @@ -665,8 +664,7 @@ static void do_play(void) player.pipe = music_pipe_new(); dc.buffer = player_buffer; - dc.pipe = player.pipe; - dc_start(&pc.notify, pc.next_song); + dc_start(&pc.notify, pc.next_song, player.pipe); if (!player_wait_for_decoder(&player)) { player_dc_stop(&player); player_command_finished(); @@ -735,9 +733,10 @@ static void do_play(void) assert(pc.next_song != NULL); assert(!player_dc_at_next_song(&player)); + dc.pipe = NULL; + player.queued = false; - dc.pipe = music_pipe_new(); - dc_start_async(pc.next_song); + dc_start_async(pc.next_song, music_pipe_new()); } if (player_dc_at_next_song(&player) && |