diff --git a/inc/common/queue.h b/inc/common/queue.h
index f1ea5eb194b5889521201cb5c2baf5005137d4ba..fc3809ae205af4aa4dc43fa1eaf6491f13bbde95 100644
--- a/inc/common/queue.h
+++ b/inc/common/queue.h
@@ -1,13 +1,16 @@
 #pragma once
 
 #include <pthread.h>
+#include <common/common.h>
 
 enum lkt_event_type {
-    lkt_event_null = 0,         /* NULL         */
-    lkt_event_play_pos = 10,    /* size_t       */
-    lkt_event_play_file = 11,   /* const char*  */
+    lkt_event_null      = 0,            /* NULL         */
+    lkt_event_play_pos  = (1 << 1),     /* size_t       */
+    lkt_event_play_file = (1 << 2),     /* const char*  */
 } type;
 
+#define lkt_event_play (lkt_event_play_pos | lkt_event_play_file)
+
 typedef struct {
     unsigned int type;
     void *attr;
@@ -19,6 +22,8 @@ struct queue {
     volatile lkt_event *contents;
     volatile size_t size;
     volatile size_t last;
+
+    volatile int available;
 };
 
 int lkt_queue_new(struct queue *);
@@ -26,3 +31,5 @@ void lkt_queue_free(struct queue *);
 
 void lkt_queue_send(struct queue *, enum lkt_event_type, void *attr);
 lkt_event lkt_queue_handle(struct queue *);
+
+void lkt_queue_make_available(struct queue *, enum lkt_event_type);
diff --git a/src/queue.c b/src/queue.c
index dff8fb43c5eafde08d60d9ac0a4b55463c09bbea..c872e1f43f88ef9e4e22b3ca97e58f37b616cd5e 100644
--- a/src/queue.c
+++ b/src/queue.c
@@ -15,10 +15,13 @@ lkt_queue_new(struct queue *ret)
     if (!ret)
         return 1;
 
+    pthread_mutex_t mxt = PTHREAD_MUTEX_INITIALIZER;
     struct queue _ret = {
         .contents = malloc(LKT_DEFAULT_LIST_SIZE * sizeof(lkt_event)),
         .size = LKT_DEFAULT_LIST_SIZE,
         .last = 0,
+        .available = 0,
+        .lock = mxt,
     };
 
     if (_ret.contents == NULL)
@@ -31,22 +34,25 @@ lkt_queue_new(struct queue *ret)
 void
 lkt_queue_free(struct queue *queue)
 {
+    pthread_mutex_lock(&queue->lock);
     if (queue && queue->contents)
         free((void *) queue->contents);
+    pthread_mutex_unlock(&queue->lock);
 }
 
 void
 lkt_queue_send(struct queue *queue, enum lkt_event_type _type, void *_attr)
 {
+    pthread_mutex_lock(&queue->lock);
     if (!queue)
-        return;
+        goto end;
 
     volatile lkt_event *new;
     if (queue->size == queue->last) {
         new = realloc((void *) queue->contents, queue->size * 2 * sizeof(lkt_event));
 
         if (NULL == new)
-            return;
+            goto end;
 
         queue->contents = new;
         queue->size *= 2;
@@ -57,17 +63,31 @@ lkt_queue_send(struct queue *queue, enum lkt_event_type _type, void *_attr)
         .attr = _attr,
     };
     queue->contents[(queue->last)++] = evt;
+end:
+    pthread_mutex_unlock(&queue->lock);
 }
 
 lkt_event
 lkt_queue_handle(struct queue *queue)
 {
+    pthread_mutex_lock(&queue->lock);
     lkt_event ret = {0};
 
-    if (!queue || !queue->last)
-        return ret;
+    if (!queue || !queue->last ||
+        !(queue->contents[0].type & queue->available))
+        goto end;
 
     ret = queue->contents[0];
     memmove((void *) queue->contents, (void *) (queue->contents + 1), --(queue->last));
+end:
+    pthread_mutex_unlock(&queue->lock);
     return ret;
 }
+
+void
+lkt_queue_make_available(struct queue *queue, enum lkt_event_type type)
+{
+    pthread_mutex_lock(&queue->lock);
+    queue->available |= type;
+    pthread_mutex_unlock(&queue->lock);
+}