aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/decoder_control.c9
-rw-r--r--src/decoder_control.h6
-rw-r--r--src/decoder_thread.c6
-rw-r--r--src/player_thread.c2
4 files changed, 17 insertions, 6 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);
}
diff --git a/src/player_thread.c b/src/player_thread.c
index c5060fcb4..dc263b6ad 100644
--- a/src/player_thread.c
+++ b/src/player_thread.c
@@ -526,7 +526,7 @@ static gpointer player_task(G_GNUC_UNUSED gpointer arg)
break;
case PLAYER_COMMAND_EXIT:
- dc_quit(&pc.notify);
+ dc_quit();
closeAudioDevice();
player_command_finished();
g_thread_exit(NULL);