aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/decoder_api.c8
-rw-r--r--src/decoder_control.c3
-rw-r--r--src/decoder_control.h20
-rw-r--r--src/decoder_thread.c2
-rw-r--r--src/player_thread.c4
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);
}
/**