aboutsummaryrefslogtreecommitdiff
path: root/src/PlayerControl.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'src/PlayerControl.hxx')
-rw-r--r--src/PlayerControl.hxx32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/PlayerControl.hxx b/src/PlayerControl.hxx
index 2b25177f..de05e17a 100644
--- a/src/PlayerControl.hxx
+++ b/src/PlayerControl.hxx
@@ -108,6 +108,13 @@ struct player_control {
*/
Cond cond;
+ /**
+ * This object gets signalled when the player thread has
+ * finished the #command. It wakes up the client that waits
+ * (i.e. the main thread).
+ */
+ Cond client_cond;
+
enum player_command command;
enum player_state state;
@@ -191,10 +198,35 @@ struct player_control {
* prior to calling this function.
*/
void Wait() {
+ assert(thread == g_thread_self());
+
cond.wait(mutex);
}
/**
+ * Wake up the client waiting for command completion.
+ *
+ * Caller must lock the object.
+ */
+ void ClientSignal() {
+ assert(thread == g_thread_self());
+
+ client_cond.signal();
+ }
+
+ /**
+ * The client calls this method to wait for command
+ * completion.
+ *
+ * Caller must lock the object.
+ */
+ void ClientWait() {
+ assert(thread != g_thread_self());
+
+ client_cond.wait(mutex);
+ }
+
+ /**
* @param song the song to be queued; the given instance will
* be owned and freed by the player
*/