decoder_control: add attributes start_ms, end_ms
Don't read song.start_ms and song.end_ms, let the player thread manage this logic instead.
This commit is contained in:
@ -132,7 +132,7 @@ decoder_command_finished(struct decoder *decoder)
|
|||||||
assert(music_pipe_empty(dc->pipe));
|
assert(music_pipe_empty(dc->pipe));
|
||||||
|
|
||||||
decoder->initial_seek_running = false;
|
decoder->initial_seek_running = false;
|
||||||
decoder->timestamp = dc->song->start_ms / 1000.;
|
decoder->timestamp = dc->start_ms / 1000.;
|
||||||
decoder_unlock(dc);
|
decoder_unlock(dc);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -165,7 +165,7 @@ double decoder_seek_where(G_GNUC_UNUSED struct decoder * decoder)
|
|||||||
assert(dc->pipe != NULL);
|
assert(dc->pipe != NULL);
|
||||||
|
|
||||||
if (decoder->initial_seek_running)
|
if (decoder->initial_seek_running)
|
||||||
return dc->song->start_ms / 1000.;
|
return dc->start_ms / 1000.;
|
||||||
|
|
||||||
assert(dc->command == DECODE_COMMAND_SEEK);
|
assert(dc->command == DECODE_COMMAND_SEEK);
|
||||||
|
|
||||||
@ -407,8 +407,8 @@ decoder_data(struct decoder *decoder,
|
|||||||
decoder->timestamp += (double)nbytes /
|
decoder->timestamp += (double)nbytes /
|
||||||
audio_format_time_to_size(&dc->out_audio_format);
|
audio_format_time_to_size(&dc->out_audio_format);
|
||||||
|
|
||||||
if (dc->song->end_ms > 0 &&
|
if (dc->end_ms > 0 &&
|
||||||
decoder->timestamp >= dc->song->end_ms / 1000.0)
|
decoder->timestamp >= dc->end_ms / 1000.0)
|
||||||
/* the end of this range has been reached:
|
/* the end of this range has been reached:
|
||||||
stop decoding */
|
stop decoding */
|
||||||
return DECODE_COMMAND_STOP;
|
return DECODE_COMMAND_STOP;
|
||||||
|
@ -102,6 +102,7 @@ dc_command_async(struct decoder_control *dc, enum decoder_command cmd)
|
|||||||
|
|
||||||
void
|
void
|
||||||
dc_start(struct decoder_control *dc, struct song *song,
|
dc_start(struct decoder_control *dc, struct song *song,
|
||||||
|
unsigned start_ms, unsigned end_ms,
|
||||||
struct music_buffer *buffer, struct music_pipe *pipe)
|
struct music_buffer *buffer, struct music_pipe *pipe)
|
||||||
{
|
{
|
||||||
assert(song != NULL);
|
assert(song != NULL);
|
||||||
@ -110,6 +111,8 @@ dc_start(struct decoder_control *dc, struct song *song,
|
|||||||
assert(music_pipe_empty(pipe));
|
assert(music_pipe_empty(pipe));
|
||||||
|
|
||||||
dc->song = song;
|
dc->song = song;
|
||||||
|
dc->start_ms = start_ms;
|
||||||
|
dc->end_ms = end_ms;
|
||||||
dc->buffer = buffer;
|
dc->buffer = buffer;
|
||||||
dc->pipe = pipe;
|
dc->pipe = pipe;
|
||||||
dc_command(dc, DECODE_COMMAND_START);
|
dc_command(dc, DECODE_COMMAND_START);
|
||||||
|
@ -79,6 +79,23 @@ struct decoder_control {
|
|||||||
*/
|
*/
|
||||||
const struct song *song;
|
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;
|
float total_time;
|
||||||
|
|
||||||
/** the #music_chunk allocator */
|
/** the #music_chunk allocator */
|
||||||
@ -225,11 +242,14 @@ dc_command_wait(struct decoder_control *dc);
|
|||||||
*
|
*
|
||||||
* @param the decoder
|
* @param the decoder
|
||||||
* @param song the song to be decoded
|
* @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
|
* @param pipe the pipe which receives the decoded chunks (owned by
|
||||||
* the caller)
|
* the caller)
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
dc_start(struct decoder_control *dc, struct song *song,
|
dc_start(struct decoder_control *dc, struct song *song,
|
||||||
|
unsigned start_ms, unsigned end_ms,
|
||||||
struct music_buffer *buffer, struct music_pipe *pipe);
|
struct music_buffer *buffer, struct music_pipe *pipe);
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -369,7 +369,7 @@ decoder_run_song(struct decoder_control *dc,
|
|||||||
{
|
{
|
||||||
struct decoder decoder = {
|
struct decoder decoder = {
|
||||||
.dc = dc,
|
.dc = dc,
|
||||||
.initial_seek_pending = song->start_ms > 0,
|
.initial_seek_pending = dc->start_ms > 0,
|
||||||
.initial_seek_running = false,
|
.initial_seek_running = false,
|
||||||
};
|
};
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -145,7 +145,9 @@ player_dc_start(struct player *player, struct music_pipe *pipe)
|
|||||||
assert(player->queued || pc.command == PLAYER_COMMAND_SEEK);
|
assert(player->queued || pc.command == PLAYER_COMMAND_SEEK);
|
||||||
assert(pc.next_song != NULL);
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user