diff options
Diffstat (limited to '')
-rw-r--r-- | src/decoder_api.c | 12 | ||||
-rw-r--r-- | src/decoder_control.c | 5 | ||||
-rw-r--r-- | src/decoder_control.h | 10 | ||||
-rw-r--r-- | src/decoder_internal.c | 2 | ||||
-rw-r--r-- | src/decoder_thread.c | 6 |
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: |