aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/decoder_control.c21
-rw-r--r--src/decoder_control.h34
-rw-r--r--src/player_thread.c2
3 files changed, 42 insertions, 15 deletions
diff --git a/src/decoder_control.c b/src/decoder_control.c
index caa3705f5..2a2d8ac66 100644
--- a/src/decoder_control.c
+++ b/src/decoder_control.c
@@ -97,6 +97,27 @@ dc_command_async(struct decoder_control *dc, enum decoder_command cmd)
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
dc_start(struct decoder_control *dc, struct song *song,
unsigned start_ms, unsigned end_ms,
diff --git a/src/decoder_control.h b/src/decoder_control.h
index 743c8fb58..7305e5813 100644
--- a/src/decoder_control.h
+++ b/src/decoder_control.h
@@ -276,21 +276,27 @@ decoder_lock_has_failed(struct decoder_control *dc)
return ret;
}
-static inline const struct song *
-decoder_current_song(const struct decoder_control *dc)
-{
- switch (dc->state) {
- case DECODE_STATE_STOP:
- case DECODE_STATE_ERROR:
- return NULL;
-
- case DECODE_STATE_START:
- case DECODE_STATE_DECODE:
- return dc->song;
- }
+/**
+ * Check if the specified song is currently being decoded. If the
+ * decoder is not running currently (or being started), then this
+ * function returns false in any case.
+ *
+ * Caller must lock the object.
+ */
+gcc_pure
+bool
+decoder_is_current_song(const struct decoder_control *dc,
+ const struct song *song);
- assert(false);
- return NULL;
+gcc_pure
+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;
}
/**
diff --git a/src/player_thread.c b/src/player_thread.c
index 486a8c96e..15fc9d235 100644
--- a/src/player_thread.c
+++ b/src/player_thread.c
@@ -458,7 +458,7 @@ static bool player_seek_decoder(struct player *player)
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 -
stop it and start the previous song again */