From e709561a62bdc752025ff23b7cd15e2832b2bcdc Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Wed, 13 Dec 2017 12:14:49 -0700 Subject: [PATCH 1/3] Fix getActiveDevice deadlocks on Linux --- libraries/ui/src/ui/OffscreenQmlSurface.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/libraries/ui/src/ui/OffscreenQmlSurface.cpp b/libraries/ui/src/ui/OffscreenQmlSurface.cpp index 942c9f71a5..12220a8079 100644 --- a/libraries/ui/src/ui/OffscreenQmlSurface.cpp +++ b/libraries/ui/src/ui/OffscreenQmlSurface.cpp @@ -679,7 +679,9 @@ void OffscreenQmlSurface::create() { // Setup the update of the QML media components with the current audio output device QObject::connect(&_audioOutputUpdateTimer, &QTimer::timeout, this, [this]() { - new AudioHandler(sharedFromThis(), _currentAudioOutputDevice); + if (_currentAudioOutputDevice.size() > 0) { + new AudioHandler(sharedFromThis(), _currentAudioOutputDevice); + } }); int waitForAudioQmlMs = 200; _audioOutputUpdateTimer.setInterval(waitForAudioQmlMs); @@ -695,6 +697,7 @@ void OffscreenQmlSurface::create() { } void OffscreenQmlSurface::changeAudioOutputDevice(const QString& deviceName, bool isHtmlUpdate) { + _currentAudioOutputDevice = deviceName; if (_rootItem != nullptr && !isHtmlUpdate) { QMetaObject::invokeMethod(this, "forceQmlAudioOutputDeviceUpdate", Qt::QueuedConnection); } @@ -702,18 +705,16 @@ void OffscreenQmlSurface::changeAudioOutputDevice(const QString& deviceName, boo } void OffscreenQmlSurface::forceHtmlAudioOutputDeviceUpdate() { - auto audioIO = DependencyManager::get(); - QString deviceName = audioIO->getActiveAudioDevice(QAudio::AudioOutput).deviceName(); - QMetaObject::invokeMethod(this, "changeAudioOutputDevice", Qt::QueuedConnection, - Q_ARG(QString, deviceName), Q_ARG(bool, true)); + if (_currentAudioOutputDevice.size() > 0) { + QMetaObject::invokeMethod(this, "changeAudioOutputDevice", Qt::QueuedConnection, + Q_ARG(QString, _currentAudioOutputDevice), Q_ARG(bool, true)); + } } void OffscreenQmlSurface::forceQmlAudioOutputDeviceUpdate() { if (QThread::currentThread() != qApp->thread()) { QMetaObject::invokeMethod(this, "forceQmlAudioOutputDeviceUpdate", Qt::QueuedConnection); } else { - auto audioIO = DependencyManager::get(); - _currentAudioOutputDevice = audioIO->getActiveAudioDevice(QAudio::AudioOutput).deviceName(); if (_audioOutputUpdateTimer.isActive()) { _audioOutputUpdateTimer.stop(); } From e581c66b5696ea27f73cdc5962623ea6542952b9 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Wed, 13 Dec 2017 16:11:46 -0700 Subject: [PATCH 2/3] added mutex for audio handler --- libraries/ui/src/ui/OffscreenQmlSurface.cpp | 4 +++- libraries/ui/src/ui/OffscreenQmlSurface.h | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/libraries/ui/src/ui/OffscreenQmlSurface.cpp b/libraries/ui/src/ui/OffscreenQmlSurface.cpp index 12220a8079..112d70c394 100644 --- a/libraries/ui/src/ui/OffscreenQmlSurface.cpp +++ b/libraries/ui/src/ui/OffscreenQmlSurface.cpp @@ -680,7 +680,9 @@ void OffscreenQmlSurface::create() { // Setup the update of the QML media components with the current audio output device QObject::connect(&_audioOutputUpdateTimer, &QTimer::timeout, this, [this]() { if (_currentAudioOutputDevice.size() > 0) { - new AudioHandler(sharedFromThis(), _currentAudioOutputDevice); + QMutexLocker lock(&_audioHandlerMutex); + QString audioDeviceName = _currentAudioOutputDevice; + new AudioHandler(sharedFromThis(), audioDeviceName); } }); int waitForAudioQmlMs = 200; diff --git a/libraries/ui/src/ui/OffscreenQmlSurface.h b/libraries/ui/src/ui/OffscreenQmlSurface.h index 4c23c62c12..370ddb4f2f 100644 --- a/libraries/ui/src/ui/OffscreenQmlSurface.h +++ b/libraries/ui/src/ui/OffscreenQmlSurface.h @@ -173,6 +173,7 @@ private: uint64_t _lastRenderTime { 0 }; uvec2 _size; + QMutex _audioHandlerMutex; QTimer _audioOutputUpdateTimer; QString _currentAudioOutputDevice; From 483443d2181f74f14b1c8b370afd047e995e6c04 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Wed, 13 Dec 2017 17:02:36 -0700 Subject: [PATCH 3/3] No mutex --- libraries/ui/src/ui/OffscreenQmlSurface.cpp | 4 +--- libraries/ui/src/ui/OffscreenQmlSurface.h | 1 - 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/libraries/ui/src/ui/OffscreenQmlSurface.cpp b/libraries/ui/src/ui/OffscreenQmlSurface.cpp index 112d70c394..12220a8079 100644 --- a/libraries/ui/src/ui/OffscreenQmlSurface.cpp +++ b/libraries/ui/src/ui/OffscreenQmlSurface.cpp @@ -680,9 +680,7 @@ void OffscreenQmlSurface::create() { // Setup the update of the QML media components with the current audio output device QObject::connect(&_audioOutputUpdateTimer, &QTimer::timeout, this, [this]() { if (_currentAudioOutputDevice.size() > 0) { - QMutexLocker lock(&_audioHandlerMutex); - QString audioDeviceName = _currentAudioOutputDevice; - new AudioHandler(sharedFromThis(), audioDeviceName); + new AudioHandler(sharedFromThis(), _currentAudioOutputDevice); } }); int waitForAudioQmlMs = 200; diff --git a/libraries/ui/src/ui/OffscreenQmlSurface.h b/libraries/ui/src/ui/OffscreenQmlSurface.h index 370ddb4f2f..4c23c62c12 100644 --- a/libraries/ui/src/ui/OffscreenQmlSurface.h +++ b/libraries/ui/src/ui/OffscreenQmlSurface.h @@ -173,7 +173,6 @@ private: uint64_t _lastRenderTime { 0 }; uvec2 _size; - QMutex _audioHandlerMutex; QTimer _audioOutputUpdateTimer; QString _currentAudioOutputDevice;