diff options
Diffstat (limited to '')
-rw-r--r-- | src/decoder_control.c | 9 | ||||
-rw-r--r-- | src/decoder_control.h | 6 | ||||
-rw-r--r-- | src/decoder_thread.c | 6 |
3 files changed, 16 insertions, 5 deletions
diff --git a/src/decoder_control.c b/src/decoder_control.c index b934d516f..6d2efd0d7 100644 --- a/src/decoder_control.c +++ b/src/decoder_control.c @@ -102,8 +102,13 @@ dc_seek(struct notify *notify, double where) } void -dc_quit(struct notify *notify) +dc_quit(void) { + assert(dc.thread != NULL); + dc.quit = true; - dc_command(notify, DECODE_COMMAND_STOP); + dc_command_async(DECODE_COMMAND_STOP); + + g_thread_join(dc.thread); + dc.thread = NULL; } diff --git a/src/decoder_control.h b/src/decoder_control.h index 4fd0f9edc..542cfe78a 100644 --- a/src/decoder_control.h +++ b/src/decoder_control.h @@ -45,6 +45,10 @@ enum decoder_state { }; struct decoder_control { + /** the handle of the decoder thread, or NULL if the decoder + thread isn't running */ + GThread *thread; + struct notify notify; volatile enum decoder_state state; @@ -124,6 +128,6 @@ bool dc_seek(struct notify *notify, double where); void -dc_quit(struct notify *notify); +dc_quit(void); #endif diff --git a/src/decoder_thread.c b/src/decoder_thread.c index 12449237f..97555f44d 100644 --- a/src/decoder_thread.c +++ b/src/decoder_thread.c @@ -258,8 +258,10 @@ static gpointer decoder_task(G_GNUC_UNUSED gpointer arg) void decoder_thread_start(void) { GError *e = NULL; - GThread *t; - if (!(t = g_thread_create(decoder_task, NULL, FALSE, &e))) + assert(dc.thread == NULL); + + dc.thread = g_thread_create(decoder_task, NULL, true, &e); + if (dc.thread == NULL) FATAL("Failed to spawn decoder task: %s\n", e->message); } |