From e02e81039976ba32feb7c266e4331f9bb7eaab29 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Thu, 30 Nov 2017 15:06:02 -0700 Subject: [PATCH] Audio Handler fix --- libraries/ui/src/ui/OffscreenQmlSurface.cpp | 69 +++++++++++---------- 1 file changed, 37 insertions(+), 32 deletions(-) diff --git a/libraries/ui/src/ui/OffscreenQmlSurface.cpp b/libraries/ui/src/ui/OffscreenQmlSurface.cpp index a585b80090..7c100ebb1b 100644 --- a/libraries/ui/src/ui/OffscreenQmlSurface.cpp +++ b/libraries/ui/src/ui/OffscreenQmlSurface.cpp @@ -121,10 +121,10 @@ uint64_t uvec2ToUint64(const uvec2& v) { class AudioHandler : public QObject, QRunnable { Q_OBJECT public: - AudioHandler(QObject* container, const QString& deviceName, int runDelayMs = 0, QObject* parent = nullptr) : QObject(parent) { - _container = container; + AudioHandler(OffscreenQmlSurface* surface, const QString& deviceName, int runDelayMs = 0, QObject* parent = nullptr) : QObject(parent) { _newTargetDevice = deviceName; _runDelayMs = runDelayMs; + _surface = surface; setAutoDelete(true); QThreadPool::globalInstance()->start(this); } @@ -139,35 +139,40 @@ public: QThread::msleep(_runDelayMs); } auto audioIO = DependencyManager::get(); - for (auto player : _container->findChildren()) { - auto mediaState = player->state(); - QMediaService *svc = player->service(); - if (nullptr == svc) { - return; - } - QAudioOutputSelectorControl *out = qobject_cast - (svc->requestControl(QAudioOutputSelectorControl_iid)); - if (nullptr == out) { - return; - } - QString deviceOuput; - auto outputs = out->availableOutputs(); - for (int i = 0; i < outputs.size(); i++) { - QString output = outputs[i]; - QString description = out->outputDescription(output); - if (description == _newTargetDevice) { - deviceOuput = output; - break; + + auto rootItem = _surface->getRootItem(); + if (rootItem) { + for (auto player : rootItem->findChildren()) { + auto mediaState = player->state(); + QMediaService *svc = player->service(); + if (nullptr == svc) { + return; + } + QAudioOutputSelectorControl *out = qobject_cast + (svc->requestControl(QAudioOutputSelectorControl_iid)); + if (nullptr == out) { + return; + } + QString deviceOuput; + auto outputs = out->availableOutputs(); + for (int i = 0; i < outputs.size(); i++) { + QString output = outputs[i]; + QString description = out->outputDescription(output); + if (description == _newTargetDevice) { + deviceOuput = output; + break; + } + } + out->setActiveOutput(deviceOuput); + svc->releaseControl(out); + // if multimedia was paused, it will start playing automatically after changing audio device + // this will reset it back to a paused state + if (mediaState == QMediaPlayer::State::PausedState) { + player->pause(); + } + else if (mediaState == QMediaPlayer::State::StoppedState) { + player->stop(); } - } - out->setActiveOutput(deviceOuput); - svc->releaseControl(out); - // if multimedia was paused, it will start playing automatically after changing audio device - // this will reset it back to a paused state - if (mediaState == QMediaPlayer::State::PausedState) { - player->pause(); - } else if (mediaState == QMediaPlayer::State::StoppedState) { - player->stop(); } } qDebug() << "QML Audio changed to " << _newTargetDevice; @@ -175,7 +180,7 @@ public: private: QString _newTargetDevice; - QObject* _container; + OffscreenQmlSurface* _surface; int _runDelayMs; }; @@ -701,7 +706,7 @@ void OffscreenQmlSurface::forceQmlAudioOutputDeviceUpdate() { QString deviceName = audioIO->getActiveAudioDevice(QAudio::AudioOutput).deviceName(); int waitForAudioQmlMs = 200; // The audio device need to be change using oth - new AudioHandler(_rootItem, deviceName, waitForAudioQmlMs); + new AudioHandler(this, deviceName, waitForAudioQmlMs); } }