From fcc5ffdfddee85e59e36621bbc8a1c3cb797ca51 Mon Sep 17 00:00:00 2001
From: MerryMage <MerryMage@users.noreply.github.com>
Date: Sun, 12 Aug 2018 20:41:46 +0100
Subject: [PATCH] cubeb_sink: Protect queue with a mutex

---
 src/audio_core/cubeb_sink.cpp | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/src/audio_core/cubeb_sink.cpp b/src/audio_core/cubeb_sink.cpp
index 1501ef1f48..5a1177d0c9 100644
--- a/src/audio_core/cubeb_sink.cpp
+++ b/src/audio_core/cubeb_sink.cpp
@@ -4,6 +4,7 @@
 
 #include <algorithm>
 #include <cstring>
+#include <mutex>
 
 #include "audio_core/cubeb_sink.h"
 #include "audio_core/stream.h"
@@ -66,6 +67,8 @@ public:
             return;
         }
 
+        std::lock_guard lock{queue_mutex};
+
         queue.reserve(queue.size() + samples.size() * GetNumChannels());
 
         if (is_6_channel) {
@@ -94,6 +97,7 @@ private:
     u32 num_channels{};
     bool is_6_channel{};
 
+    std::mutex queue_mutex;
     std::vector<s16> queue;
 
     static long DataCallback(cubeb_stream* stream, void* user_data, const void* input_buffer,
@@ -153,6 +157,8 @@ long SinkStreamImpl::DataCallback(cubeb_stream* stream, void* user_data, const v
         return {};
     }
 
+    std::lock_guard lock{impl->queue_mutex};
+
     const size_t frames_to_write{
         std::min(impl->queue.size() / impl->GetNumChannels(), static_cast<size_t>(num_frames))};