aboutsummaryrefslogtreecommitdiffstats
path: root/src/decoder
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/decoder_api.c12
-rw-r--r--src/decoder_control.c5
-rw-r--r--src/decoder_control.h10
-rw-r--r--src/decoder_internal.c2
-rw-r--r--src/decoder_thread.c6
5 files changed, 22 insertions, 13 deletions
diff --git a/src/decoder_api.c b/src/decoder_api.c
index fe34ea34a..ccfbd3df6 100644
--- a/src/decoder_api.c
+++ b/src/decoder_api.c
@@ -65,7 +65,7 @@ decoder_initialized(struct decoder *decoder,
dc->state = DECODE_STATE_DECODE;
decoder_unlock(dc);
- player_lock_signal();
+ player_lock_signal(dc->player_control);
g_debug("audio_format=%s, seekable=%s",
audio_format_to_string(&dc->in_audio_format, &af_string),
@@ -117,7 +117,7 @@ decoder_command_finished(struct decoder *decoder)
dc->command = DECODE_COMMAND_NONE;
decoder_unlock(dc);
- player_lock_signal();
+ player_lock_signal(dc->player_control);
}
double decoder_seek_where(G_GNUC_UNUSED struct decoder * decoder)
@@ -214,7 +214,7 @@ do_send_tag(struct decoder *decoder, struct input_stream *is,
/* there is a partial chunk - flush it, we want the
tag in a new chunk */
decoder_flush_chunk(decoder);
- player_lock_signal();
+ player_lock_signal(decoder->dc->player_control);
}
assert(decoder->chunk == NULL);
@@ -329,7 +329,7 @@ decoder_data(struct decoder *decoder,
if (dest == NULL) {
/* the chunk is full, flush it */
decoder_flush_chunk(decoder);
- player_lock_signal();
+ player_lock_signal(dc->player_control);
continue;
}
@@ -348,7 +348,7 @@ decoder_data(struct decoder *decoder,
if (full) {
/* the chunk is full, flush it */
decoder_flush_chunk(decoder);
- player_lock_signal();
+ player_lock_signal(dc->player_control);
}
data += nbytes;
@@ -432,7 +432,7 @@ decoder_replay_gain(struct decoder *decoder,
replay gain values affect the following
samples */
decoder_flush_chunk(decoder);
- player_lock_signal();
+ player_lock_signal(decoder->dc->player_control);
}
} else
decoder->replay_gain_serial = 0;
diff --git a/src/decoder_control.c b/src/decoder_control.c
index a5e6e4ad3..6cc2849c5 100644
--- a/src/decoder_control.c
+++ b/src/decoder_control.c
@@ -28,8 +28,9 @@
#define G_LOG_DOMAIN "decoder_control"
void
-dc_init(struct decoder_control *dc)
+dc_init(struct decoder_control *dc, struct player_control *pc)
{
+ dc->player_control = pc;
dc->thread = NULL;
dc->mutex = g_mutex_new();
@@ -62,7 +63,7 @@ static void
dc_command_wait_locked(struct decoder_control *dc)
{
while (dc->command != DECODE_COMMAND_NONE)
- player_wait_decoder(dc);
+ player_wait_decoder(dc->player_control, dc);
}
void
diff --git a/src/decoder_control.h b/src/decoder_control.h
index 449e974b7..fafc6dea3 100644
--- a/src/decoder_control.h
+++ b/src/decoder_control.h
@@ -27,6 +27,8 @@
#include <assert.h>
+struct player_control;
+
enum decoder_state {
DECODE_STATE_STOP = 0,
DECODE_STATE_START,
@@ -42,6 +44,12 @@ enum decoder_state {
};
struct decoder_control {
+ /**
+ * The player thread which calls us. This pointer is used to
+ * signal command completion.
+ */
+ struct player_control *player_control;
+
/** the handle of the decoder thread, or NULL if the decoder
thread isn't running */
GThread *thread;
@@ -98,7 +106,7 @@ struct decoder_control {
};
void
-dc_init(struct decoder_control *dc);
+dc_init(struct decoder_control *dc, struct player_control *pc);
void
dc_deinit(struct decoder_control *dc);
diff --git a/src/decoder_internal.c b/src/decoder_internal.c
index 990d728e9..a4aadd4f0 100644
--- a/src/decoder_internal.c
+++ b/src/decoder_internal.c
@@ -65,7 +65,7 @@ need_chunks(struct decoder_control *dc, struct input_stream *is, bool do_wait)
if ((is == NULL || !decoder_input_buffer(dc, is)) && do_wait) {
decoder_wait(dc);
- player_signal();
+ player_signal(dc->player_control);
return dc->command;
}
diff --git a/src/decoder_thread.c b/src/decoder_thread.c
index 10a796967..a3af62376 100644
--- a/src/decoder_thread.c
+++ b/src/decoder_thread.c
@@ -383,7 +383,7 @@ decoder_run_song(struct decoder_control *dc,
dc->state = DECODE_STATE_START;
dc->command = DECODE_COMMAND_NONE;
- player_signal();
+ player_signal(dc->player_control);
pcm_convert_init(&decoder.conv_state);
@@ -464,13 +464,13 @@ decoder_task(gpointer arg)
dc->command = DECODE_COMMAND_NONE;
- player_signal();
+ player_signal(dc->player_control);
break;
case DECODE_COMMAND_STOP:
dc->command = DECODE_COMMAND_NONE;
- player_signal();
+ player_signal(dc->player_control);
break;
case DECODE_COMMAND_NONE: