diff --git a/src/audio/plugins/alsa.cpp b/src/audio/plugins/alsa.cpp index 9987ba3..61537f2 100644 --- a/src/audio/plugins/alsa.cpp +++ b/src/audio/plugins/alsa.cpp @@ -16,6 +16,7 @@ * along with this program. If not, see . */ #include "alsa.h" +#include #include #include #define ALSA_BUFFER_SIZE 1024 @@ -175,23 +176,26 @@ Format AlsaPlugin::deviceFormat(const DeviceInfo::Id &id, const Plugin::Directio Stream *AlsaPlugin::open(const DeviceInfo::Id &id, const Plugin::Direction &mode, const Format &format, QIODevice *endpoint) { - std::lock_guard lock(m_deviceListMutex); + std::unique_lock lock(m_deviceListMutex, std::defer_lock); if (id.isNull()) { return nullptr; } + assert(!lock.owns_lock()); + lock.lock(); AlsaPCMDevice *device = m_devices[ {mode, id}]; if (!device) { device = new AlsaPCMDevice(id, mode, format, m_deviceListMutex); connect (device, &AlsaPCMDevice::closed, this, [this, mode, id, device]() { - //mutex is locked here by device + std::lock_guard lock{m_deviceListMutex}; m_devices[ {mode, id}] = nullptr; device->deleteLater(); - m_deviceListMutex.unlock(); }); m_devices[ {mode, id}] = device; } + assert(lock.owns_lock()); + lock.unlock(); if (!device->start()) { return nullptr; } @@ -326,14 +330,18 @@ bool AlsaPCMDevice::start() } QCoreApplication::processEvents(); if (m_callbacks.empty()) { - m_mutex.lock(); + std::unique_lock lock{m_mutex}; if (m_keepAlive) { + lock.unlock(); QCoreApplication::processEvents(); + lock.lock(); } else { - m_threadActive = false; + assert(lock.owns_lock()); + lock.unlock(); break; } - m_mutex.unlock(); + assert(lock.owns_lock()); + lock.unlock(); } m_threadActive = true; m_keepAlive = false;