diff options
-rw-r--r-- | src/decoder_api.c | 8 | ||||
-rw-r--r-- | src/decoder_control.c | 3 | ||||
-rw-r--r-- | src/decoder_control.h | 20 | ||||
-rw-r--r-- | src/decoder_thread.c | 2 | ||||
-rw-r--r-- | src/player_thread.c | 4 |
5 files changed, 31 insertions, 6 deletions
diff --git a/src/decoder_api.c b/src/decoder_api.c index bbe93eef0..bec271179 100644 --- a/src/decoder_api.c +++ b/src/decoder_api.c @@ -132,7 +132,7 @@ decoder_command_finished(struct decoder *decoder) assert(music_pipe_empty(dc->pipe)); decoder->initial_seek_running = false; - decoder->timestamp = dc->song->start_ms / 1000.; + decoder->timestamp = dc->start_ms / 1000.; decoder_unlock(dc); return; } @@ -165,7 +165,7 @@ double decoder_seek_where(G_GNUC_UNUSED struct decoder * decoder) assert(dc->pipe != NULL); if (decoder->initial_seek_running) - return dc->song->start_ms / 1000.; + return dc->start_ms / 1000.; assert(dc->command == DECODE_COMMAND_SEEK); @@ -407,8 +407,8 @@ decoder_data(struct decoder *decoder, decoder->timestamp += (double)nbytes / audio_format_time_to_size(&dc->out_audio_format); - if (dc->song->end_ms > 0 && - decoder->timestamp >= dc->song->end_ms / 1000.0) + if (dc->end_ms > 0 && + decoder->timestamp >= dc->end_ms / 1000.0) /* the end of this range has been reached: stop decoding */ return DECODE_COMMAND_STOP; diff --git a/src/decoder_control.c b/src/decoder_control.c index a5e6e4ad3..85c2e5ba8 100644 --- a/src/decoder_control.c +++ b/src/decoder_control.c @@ -102,6 +102,7 @@ dc_command_async(struct decoder_control *dc, enum decoder_command cmd) void dc_start(struct decoder_control *dc, struct song *song, + unsigned start_ms, unsigned end_ms, struct music_buffer *buffer, struct music_pipe *pipe) { assert(song != NULL); @@ -110,6 +111,8 @@ dc_start(struct decoder_control *dc, struct song *song, assert(music_pipe_empty(pipe)); dc->song = song; + dc->start_ms = start_ms; + dc->end_ms = end_ms; 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 449e974b7..64c7c302e 100644 --- a/src/decoder_control.h +++ b/src/decoder_control.h @@ -79,6 +79,23 @@ struct decoder_control { */ const struct song *song; + /** + * The initial seek position (in milliseconds), e.g. to the + * start of a sub-track described by a CUE file. + * + * This attribute is set by dc_start(). + */ + unsigned start_ms; + + /** + * The decoder will stop when it reaches this position (in + * milliseconds). 0 means don't stop before the end of the + * file. + * + * This attribute is set by dc_start(). + */ + unsigned end_ms; + float total_time; /** the #music_chunk allocator */ @@ -225,11 +242,14 @@ dc_command_wait(struct decoder_control *dc); * * @param the decoder * @param song the song to be decoded + * @param start_ms see #decoder_control + * @param end_ms see #decoder_control * @param pipe the pipe which receives the decoded chunks (owned by * the caller) */ void dc_start(struct decoder_control *dc, struct song *song, + unsigned start_ms, unsigned end_ms, struct music_buffer *buffer, struct music_pipe *pipe); void diff --git a/src/decoder_thread.c b/src/decoder_thread.c index ce849df47..201cd5acd 100644 --- a/src/decoder_thread.c +++ b/src/decoder_thread.c @@ -369,7 +369,7 @@ decoder_run_song(struct decoder_control *dc, { struct decoder decoder = { .dc = dc, - .initial_seek_pending = song->start_ms > 0, + .initial_seek_pending = dc->start_ms > 0, .initial_seek_running = false, }; int ret; diff --git a/src/player_thread.c b/src/player_thread.c index be08aa32d..b63758544 100644 --- a/src/player_thread.c +++ b/src/player_thread.c @@ -145,7 +145,9 @@ player_dc_start(struct player *player, struct music_pipe *pipe) assert(player->queued || pc.command == PLAYER_COMMAND_SEEK); assert(pc.next_song != NULL); - dc_start(dc, pc.next_song, player_buffer, pipe); + dc_start(dc, pc.next_song, + pc.next_song->start_ms, pc.next_song->end_ms, + player_buffer, pipe); } /** |