Commit b5fde6df authored by Max Kellermann's avatar Max Kellermann

decoder_control: add function _is_current_song()

Replaces _current_song().
parent 784d666a
...@@ -97,6 +97,27 @@ dc_command_async(struct decoder_control *dc, enum decoder_command cmd) ...@@ -97,6 +97,27 @@ dc_command_async(struct decoder_control *dc, enum decoder_command cmd)
decoder_unlock(dc); decoder_unlock(dc);
} }
bool
decoder_is_current_song(const struct decoder_control *dc,
const struct song *song)
{
assert(dc != NULL);
assert(song != NULL);
switch (dc->state) {
case DECODE_STATE_STOP:
case DECODE_STATE_ERROR:
return false;
case DECODE_STATE_START:
case DECODE_STATE_DECODE:
return dc->song == song;
}
assert(false);
return false;
}
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, unsigned start_ms, unsigned end_ms,
......
...@@ -276,21 +276,27 @@ decoder_lock_has_failed(struct decoder_control *dc) ...@@ -276,21 +276,27 @@ decoder_lock_has_failed(struct decoder_control *dc)
return ret; return ret;
} }
static inline const struct song * /**
decoder_current_song(const struct decoder_control *dc) * Check if the specified song is currently being decoded. If the
{ * decoder is not running currently (or being started), then this
switch (dc->state) { * function returns false in any case.
case DECODE_STATE_STOP: *
case DECODE_STATE_ERROR: * Caller must lock the object.
return NULL; */
gcc_pure
case DECODE_STATE_START: bool
case DECODE_STATE_DECODE: decoder_is_current_song(const struct decoder_control *dc,
return dc->song; const struct song *song);
}
assert(false); gcc_pure
return NULL; static inline bool
decoder_lock_is_current_song(struct decoder_control *dc,
const struct song *song)
{
decoder_lock(dc);
const bool result = decoder_is_current_song(dc, song);
decoder_unlock(dc);
return result;
} }
/** /**
......
...@@ -458,7 +458,7 @@ static bool player_seek_decoder(struct player *player) ...@@ -458,7 +458,7 @@ static bool player_seek_decoder(struct player *player)
assert(pc->next_song != NULL); assert(pc->next_song != NULL);
if (decoder_current_song(dc) != song) { if (!decoder_lock_is_current_song(dc, song)) {
/* the decoder is already decoding the "next" song - /* the decoder is already decoding the "next" song -
stop it and start the previous song again */ stop it and start the previous song again */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment