diff options
Diffstat (limited to 'src/PlayerControl.hxx')
-rw-r--r-- | src/PlayerControl.hxx | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/PlayerControl.hxx b/src/PlayerControl.hxx index 2b25177fb..de05e17ab 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 */ |