From c7e1fdaeacac2d5ea2f4099a7f150f8cd3577f1d Mon Sep 17 00:00:00 2001 From: amerhifi Date: Tue, 15 Oct 2019 08:55:53 -0700 Subject: [PATCH 01/10] adding hmd audio device info to deviceslist changing locations one more merge working on the threading issue changing offices, working on qml simple qml filtering fixed spacing problem when item is removed --- .../simplifiedUI/settingsApp/audio/Audio.qml | 12 +++--- .../hifi/simplifiedUI/settingsApp/vr/VR.qml | 13 +++--- interface/src/scripting/AudioDevices.cpp | 37 +++++++++++++--- interface/src/scripting/AudioDevices.h | 1 + libraries/audio-client/CMakeLists.txt | 2 +- libraries/audio-client/src/AudioClient.cpp | 42 +++++++++++++++---- .../audio-client/src/HifiAudioDeviceInfo.cpp | 1 + .../audio-client/src/HifiAudioDeviceInfo.h | 19 +++++++-- .../plugins/src/plugins/PluginManager.cpp | 16 ++++++- libraries/plugins/src/plugins/PluginManager.h | 2 +- 10 files changed, 111 insertions(+), 34 deletions(-) diff --git a/interface/resources/qml/hifi/simplifiedUI/settingsApp/audio/Audio.qml b/interface/resources/qml/hifi/simplifiedUI/settingsApp/audio/Audio.qml index 108016ef8c..345c124725 100644 --- a/interface/resources/qml/hifi/simplifiedUI/settingsApp/audio/Audio.qml +++ b/interface/resources/qml/hifi/simplifiedUI/settingsApp/audio/Audio.qml @@ -258,13 +258,12 @@ Flickable { Layout.preferredHeight: contentItem.height Layout.topMargin: simplifiedUI.margins.settings.settingsGroupTopMargin interactive: false - spacing: simplifiedUI.margins.settings.spacingBetweenRadiobuttons clip: true model: AudioScriptingInterface.devices.input delegate: Item { - width: parent.width - height: inputDeviceCheckbox.height - + width: parent.width + height: model.type != "hmd" ? inputDeviceCheckbox.height + simplifiedUI.margins.settings.spacingBetweenRadiobuttons : 0 + visible: model.type != "hmd" SimplifiedControls.RadioButton { id: inputDeviceCheckbox anchors.left: parent.left @@ -354,13 +353,12 @@ Flickable { Layout.preferredHeight: contentItem.height Layout.topMargin: simplifiedUI.margins.settings.settingsGroupTopMargin interactive: false - spacing: simplifiedUI.margins.settings.spacingBetweenRadiobuttons clip: true model: AudioScriptingInterface.devices.output delegate: Item { width: parent.width - height: outputDeviceCheckbox.height - + height: model.type != "hmd" ? outputDeviceCheckbox.height +simplifiedUI.margins.settings.spacingBetweenRadiobuttons : 0 + visible: model.type != "hmd" SimplifiedControls.RadioButton { id: outputDeviceCheckbox anchors.left: parent.left diff --git a/interface/resources/qml/hifi/simplifiedUI/settingsApp/vr/VR.qml b/interface/resources/qml/hifi/simplifiedUI/settingsApp/vr/VR.qml index 420ee11a05..cc64f8bd9f 100644 --- a/interface/resources/qml/hifi/simplifiedUI/settingsApp/vr/VR.qml +++ b/interface/resources/qml/hifi/simplifiedUI/settingsApp/vr/VR.qml @@ -259,13 +259,13 @@ Flickable { Layout.preferredHeight: contentItem.height Layout.topMargin: simplifiedUI.margins.settings.settingsGroupTopMargin interactive: false - spacing: simplifiedUI.margins.settings.spacingBetweenRadiobuttons clip: true model: AudioScriptingInterface.devices.input delegate: Item { - width: parent.width - height: inputDeviceCheckbox.height - + width: parent.width + height: model.type != "desktop" ? inputDeviceCheckbox.height + simplifiedUI.margins.settings.spacingBetweenRadiobuttons : 0 + visible: model.type != "desktop" + SimplifiedControls.RadioButton { id: inputDeviceCheckbox anchors.left: parent.left @@ -355,13 +355,12 @@ Flickable { Layout.preferredHeight: contentItem.height Layout.topMargin: simplifiedUI.margins.settings.settingsGroupTopMargin interactive: false - spacing: simplifiedUI.margins.settings.spacingBetweenRadiobuttons clip: true model: AudioScriptingInterface.devices.output delegate: Item { width: parent.width - height: outputDeviceCheckbox.height - + height: model.type != "desktop" ? outputDeviceCheckbox.height + simplifiedUI.margins.settings.spacingBetweenRadiobuttons : 0 + visible: model.type != "desktop" SimplifiedControls.RadioButton { id: outputDeviceCheckbox anchors.left: parent.left diff --git a/interface/src/scripting/AudioDevices.cpp b/interface/src/scripting/AudioDevices.cpp index 8cc45a3bf5..f4cae04a5e 100644 --- a/interface/src/scripting/AudioDevices.cpp +++ b/interface/src/scripting/AudioDevices.cpp @@ -44,7 +44,8 @@ enum AudioDeviceRole { SelectedDesktopRole, SelectedHMDRole, PeakRole, - InfoRole + InfoRole, + TypeRole }; QHash AudioDeviceList::_roles { @@ -52,7 +53,8 @@ QHash AudioDeviceList::_roles { { SelectedDesktopRole, "selectedDesktop" }, { SelectedHMDRole, "selectedHMD" }, { PeakRole, "peak" }, - { InfoRole, "info" } + { InfoRole, "info" }, + { TypeRole, "type"} }; static QString getTargetDevice(bool hmd, QAudio::Mode mode) { @@ -144,6 +146,8 @@ QVariant AudioDeviceList::data(const QModelIndex& index, int role) const { return _devices.at(index.row())->selectedHMD; } else if (role == InfoRole) { return QVariant::fromValue(_devices.at(index.row())->info); + } else if (role == TypeRole) { + return _devices.at(index.row())->type; } else { return QVariant(); } @@ -281,10 +285,18 @@ void AudioDeviceList::onDevicesChanged(const QList& devices device.info = deviceInfo; if (deviceInfo.isDefault()) { - if (deviceInfo.getMode() == QAudio::AudioInput) { - device.display = "Computer's default microphone (recommended)"; - } else { - device.display = "Computer's default audio (recommended)"; + if (deviceInfo.getDeviceType() == HifiAudioDeviceInfo::desktop) { + if (deviceInfo.getMode() == QAudio::AudioInput) { + device.display = "Computer's default microphone (recommended)"; + } else { + device.display = "Computer's default audio (recommended)"; + } + } else if (deviceInfo.getDeviceType() == HifiAudioDeviceInfo::hmd) { + if (deviceInfo.getMode() == QAudio::AudioInput) { + device.display = "Headset's default mic (recommended)"; + } else { + device.display = "Headset's default audio (recommended)"; + } } } else { device.display = device.info.deviceName() @@ -292,6 +304,19 @@ void AudioDeviceList::onDevicesChanged(const QList& devices .remove("Device") .replace(" )", ")"); } + + switch (deviceInfo.getDeviceType()) { + case HifiAudioDeviceInfo::hmd: + device.type = "hmd"; + break; + case HifiAudioDeviceInfo::desktop: + device.type = "desktop"; + break; + case HifiAudioDeviceInfo::both: + device.type = "both"; + break; + } + for (bool isHMD : {false, true}) { HifiAudioDeviceInfo& selectedDevice = isHMD ? _selectedHMDDevice : _selectedDesktopDevice; diff --git a/interface/src/scripting/AudioDevices.h b/interface/src/scripting/AudioDevices.h index 13d97d53dd..3dc1949f80 100644 --- a/interface/src/scripting/AudioDevices.h +++ b/interface/src/scripting/AudioDevices.h @@ -29,6 +29,7 @@ public: QString display; bool selectedDesktop { false }; bool selectedHMD { false }; + QString type; }; class AudioDeviceList : public QAbstractListModel { diff --git a/libraries/audio-client/CMakeLists.txt b/libraries/audio-client/CMakeLists.txt index 6b88292dd4..03279b08f6 100644 --- a/libraries/audio-client/CMakeLists.txt +++ b/libraries/audio-client/CMakeLists.txt @@ -6,7 +6,7 @@ setup_hifi_library(Network Multimedia ${PLATFORM_QT_COMPONENTS}) link_hifi_libraries(audio plugins) include_hifi_library_headers(shared) include_hifi_library_headers(networking) - +include_hifi_library_headers(gpu) if (ANDROID) else () target_webrtc() diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index d29045c99b..344f52fc5a 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -47,7 +47,7 @@ #include #include #include - +#include #include "AudioClientLogging.h" #include "AudioLogging.h" #include "AudioHelpers.h" @@ -81,6 +81,21 @@ Mutex _recordMutex; HifiAudioDeviceInfo defaultAudioDeviceForMode(QAudio::Mode mode); +#include +static QString getHmdAudioDeviceName(QAudio::Mode mode) { + foreach(DisplayPluginPointer displayPlugin, PluginManager::getInstance()->getAllDisplayPlugins()) { + if (displayPlugin && displayPlugin->isHmd()) { + if (mode == QAudio::AudioInput) { + return displayPlugin->getPreferredAudioInDevice(); + } else { + return displayPlugin->getPreferredAudioOutDevice(); + } + break; + } + } + return QString(); +} + // thread-safe QList getAvailableDevices(QAudio::Mode mode) { // NOTE: availableDevices() clobbers the Qt internal device list @@ -88,13 +103,26 @@ QList getAvailableDevices(QAudio::Mode mode) { auto devices = QAudioDeviceInfo::availableDevices(mode); QList newDevices; - for (auto& device : devices) { newDevices.push_back(HifiAudioDeviceInfo(device, false, mode)); } newDevices.push_front(defaultAudioDeviceForMode(mode)); - + + QString hmdDeviceName = getHmdAudioDeviceName(mode); + if (!hmdDeviceName.isNull() && !hmdDeviceName.isEmpty()) { + HifiAudioDeviceInfo hmdDevice; + foreach(auto device, newDevices) { + if (device.getDevice().deviceName() == hmdDeviceName) { + hmdDevice = HifiAudioDeviceInfo(device.getDevice(), true, mode, HifiAudioDeviceInfo::hmd); + break; + } + } + + if (!hmdDevice.getDevice().isNull()) { + newDevices.push_front(hmdDevice); + } + } return newDevices; } @@ -477,7 +505,7 @@ HifiAudioDeviceInfo defaultAudioDeviceForMode(QAudio::Mode mode) { // find a device in the list that matches the name we have and return it foreach(QAudioDeviceInfo audioDevice, devices){ if (audioDevice.deviceName() == CFStringGetCStringPtr(deviceName, kCFStringEncodingMacRoman)) { - return HifiAudioDeviceInfo(audioDevice, true, mode); + return HifiAudioDeviceInfo(audioDevice, true, mode, HifiAudioDeviceInfo::desktop); } } } @@ -532,7 +560,7 @@ HifiAudioDeviceInfo defaultAudioDeviceForMode(QAudio::Mode mode) { HifiAudioDeviceInfo foundDevice; foreach(QAudioDeviceInfo audioDevice, devices) { if (audioDevice.deviceName().trimmed() == deviceName.trimmed()) { - foundDevice=HifiAudioDeviceInfo(audioDevice,true,mode); + foundDevice=HifiAudioDeviceInfo(audioDevice,true,mode, HifiAudioDeviceInfo::desktop); break; } } @@ -558,8 +586,8 @@ HifiAudioDeviceInfo defaultAudioDeviceForMode(QAudio::Mode mode) { } #endif // fallback for failed lookup is the default device - return (mode == QAudio::AudioInput) ? HifiAudioDeviceInfo(QAudioDeviceInfo::defaultInputDevice(), true,mode) : - HifiAudioDeviceInfo(QAudioDeviceInfo::defaultOutputDevice(), true, mode); + return (mode == QAudio::AudioInput) ? HifiAudioDeviceInfo(QAudioDeviceInfo::defaultInputDevice(), true,mode, HifiAudioDeviceInfo::desktop) : + HifiAudioDeviceInfo(QAudioDeviceInfo::defaultOutputDevice(), true, mode, HifiAudioDeviceInfo::desktop); } bool AudioClient::getNamedAudioDeviceForModeExists(QAudio::Mode mode, const QString& deviceName) { diff --git a/libraries/audio-client/src/HifiAudioDeviceInfo.cpp b/libraries/audio-client/src/HifiAudioDeviceInfo.cpp index 6e2d5fbe92..df18a2376e 100644 --- a/libraries/audio-client/src/HifiAudioDeviceInfo.cpp +++ b/libraries/audio-client/src/HifiAudioDeviceInfo.cpp @@ -22,6 +22,7 @@ HifiAudioDeviceInfo& HifiAudioDeviceInfo::operator=(const HifiAudioDeviceInfo& o _audioDeviceInfo = other.getDevice(); _mode = other.getMode(); _isDefault = other.isDefault(); + _deviceType = other.getDeviceType(); return *this; } diff --git a/libraries/audio-client/src/HifiAudioDeviceInfo.h b/libraries/audio-client/src/HifiAudioDeviceInfo.h index 99520f1643..fadbbb6917 100644 --- a/libraries/audio-client/src/HifiAudioDeviceInfo.h +++ b/libraries/audio-client/src/HifiAudioDeviceInfo.h @@ -23,19 +23,28 @@ class HifiAudioDeviceInfo : public QObject { Q_OBJECT public: + enum deviceType { + desktop, + hmd, + both + }; + HifiAudioDeviceInfo() : QObject() {} HifiAudioDeviceInfo(const HifiAudioDeviceInfo &deviceInfo) : QObject(){ _audioDeviceInfo = deviceInfo.getDevice(); _mode = deviceInfo.getMode(); _isDefault = deviceInfo.isDefault(); + _deviceType = deviceInfo.getDeviceType(); } - HifiAudioDeviceInfo(QAudioDeviceInfo deviceInfo, bool isDefault, QAudio::Mode mode) : + + HifiAudioDeviceInfo(QAudioDeviceInfo deviceInfo, bool isDefault, QAudio::Mode mode, deviceType devType=both) : _audioDeviceInfo(deviceInfo), _isDefault(isDefault), - _mode(mode){ + _mode(mode), + _deviceType(devType){ } - + void setMode(QAudio::Mode mode) { _mode = mode; } void setIsDefault() { _isDefault = true; } void setDevice(QAudioDeviceInfo devInfo); @@ -52,15 +61,17 @@ public: QAudioDeviceInfo getDevice() const { return _audioDeviceInfo; } bool isDefault() const { return _isDefault; } QAudio::Mode getMode() const { return _mode; } - + deviceType getDeviceType() const { return _deviceType; } HifiAudioDeviceInfo& operator=(const HifiAudioDeviceInfo& other); bool operator==(const HifiAudioDeviceInfo& rhs) const; bool operator!=(const HifiAudioDeviceInfo& rhs) const; + private: QAudioDeviceInfo _audioDeviceInfo; bool _isDefault { false }; QAudio::Mode _mode { QAudio::AudioInput }; + deviceType _deviceType{ both }; public: static const QString DEFAULT_DEVICE_NAME; diff --git a/libraries/plugins/src/plugins/PluginManager.cpp b/libraries/plugins/src/plugins/PluginManager.cpp index 8f1184904e..1ecc4f1d45 100644 --- a/libraries/plugins/src/plugins/PluginManager.cpp +++ b/libraries/plugins/src/plugins/PluginManager.cpp @@ -221,7 +221,21 @@ const OculusPlatformPluginPointer PluginManager::getOculusPlatformPlugin() { return oculusPlatformPlugin; } -const DisplayPluginList& PluginManager::getDisplayPlugins() { +#include +#include + + +DisplayPluginList PluginManager::getAllDisplayPlugins() { + if (thread() != QThread::currentThread()) { + DisplayPluginList list; + QMetaObject::invokeMethod(this, "getAllDisplayPlugins", Qt::BlockingQueuedConnection, Q_RETURN_ARG(DisplayPluginList, list)); + return list; + } else { + return _displayPlugins; + } +} + + const DisplayPluginList& PluginManager::getDisplayPlugins() { static std::once_flag once; static auto deviceAddedCallback = [](QString deviceName) { qCDebug(plugins) << "Added device: " << deviceName; diff --git a/libraries/plugins/src/plugins/PluginManager.h b/libraries/plugins/src/plugins/PluginManager.h index eb377a2c8e..5ec82ea743 100644 --- a/libraries/plugins/src/plugins/PluginManager.h +++ b/libraries/plugins/src/plugins/PluginManager.h @@ -51,7 +51,7 @@ public: using PluginFilter = std::function; void setPluginFilter(PluginFilter pluginFilter) { _pluginFilter = pluginFilter; } - + Q_INVOKABLE DisplayPluginList getAllDisplayPlugins(); signals: void inputDeviceRunningChanged(const QString& pluginName, bool isRunning, const QStringList& runningDevices); From 421cff1cb21a7f75fe79232780adbc8a6e5f9b7c Mon Sep 17 00:00:00 2001 From: amerhifi Date: Fri, 18 Oct 2019 15:16:37 -0700 Subject: [PATCH 02/10] fixed naming to match standards --- interface/src/scripting/AudioDevices.cpp | 18 +++++++++--------- .../audio-client/src/HifiAudioDeviceInfo.cpp | 1 - .../audio-client/src/HifiAudioDeviceInfo.h | 8 ++++---- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/interface/src/scripting/AudioDevices.cpp b/interface/src/scripting/AudioDevices.cpp index f4cae04a5e..7cabd49e93 100644 --- a/interface/src/scripting/AudioDevices.cpp +++ b/interface/src/scripting/AudioDevices.cpp @@ -306,15 +306,15 @@ void AudioDeviceList::onDevicesChanged(const QList& devices } switch (deviceInfo.getDeviceType()) { - case HifiAudioDeviceInfo::hmd: - device.type = "hmd"; - break; - case HifiAudioDeviceInfo::desktop: - device.type = "desktop"; - break; - case HifiAudioDeviceInfo::both: - device.type = "both"; - break; + case HifiAudioDeviceInfo::hmd: + device.type = "hmd"; + break; + case HifiAudioDeviceInfo::desktop: + device.type = "desktop"; + break; + case HifiAudioDeviceInfo::both: + device.type = "both"; + break; } diff --git a/libraries/audio-client/src/HifiAudioDeviceInfo.cpp b/libraries/audio-client/src/HifiAudioDeviceInfo.cpp index df18a2376e..5cbb15ff73 100644 --- a/libraries/audio-client/src/HifiAudioDeviceInfo.cpp +++ b/libraries/audio-client/src/HifiAudioDeviceInfo.cpp @@ -26,7 +26,6 @@ HifiAudioDeviceInfo& HifiAudioDeviceInfo::operator=(const HifiAudioDeviceInfo& o return *this; } - bool HifiAudioDeviceInfo::operator==(const HifiAudioDeviceInfo& rhs) const { //Does the QAudioDeviceinfo match as well as is this the default device or return getDevice() == rhs.getDevice() && isDefault() == rhs.isDefault(); diff --git a/libraries/audio-client/src/HifiAudioDeviceInfo.h b/libraries/audio-client/src/HifiAudioDeviceInfo.h index fadbbb6917..9b77f77c9e 100644 --- a/libraries/audio-client/src/HifiAudioDeviceInfo.h +++ b/libraries/audio-client/src/HifiAudioDeviceInfo.h @@ -23,7 +23,7 @@ class HifiAudioDeviceInfo : public QObject { Q_OBJECT public: - enum deviceType { + enum DeviceType { desktop, hmd, both @@ -38,7 +38,7 @@ public: } - HifiAudioDeviceInfo(QAudioDeviceInfo deviceInfo, bool isDefault, QAudio::Mode mode, deviceType devType=both) : + HifiAudioDeviceInfo(QAudioDeviceInfo deviceInfo, bool isDefault, QAudio::Mode mode, DeviceType devType=both) : _audioDeviceInfo(deviceInfo), _isDefault(isDefault), _mode(mode), @@ -61,7 +61,7 @@ public: QAudioDeviceInfo getDevice() const { return _audioDeviceInfo; } bool isDefault() const { return _isDefault; } QAudio::Mode getMode() const { return _mode; } - deviceType getDeviceType() const { return _deviceType; } + DeviceType getDeviceType() const { return _deviceType; } HifiAudioDeviceInfo& operator=(const HifiAudioDeviceInfo& other); bool operator==(const HifiAudioDeviceInfo& rhs) const; bool operator!=(const HifiAudioDeviceInfo& rhs) const; @@ -71,7 +71,7 @@ private: QAudioDeviceInfo _audioDeviceInfo; bool _isDefault { false }; QAudio::Mode _mode { QAudio::AudioInput }; - deviceType _deviceType{ both }; + DeviceType _deviceType{ both }; public: static const QString DEFAULT_DEVICE_NAME; From ec7c8ce13c096705da241c97a281e622f397fa06 Mon Sep 17 00:00:00 2001 From: amerhifi Date: Fri, 18 Oct 2019 16:50:36 -0700 Subject: [PATCH 03/10] updated default changes check to account for multiple devicetypes --- libraries/audio-client/src/AudioClient.cpp | 12 ++++++++++-- libraries/audio-client/src/AudioClient.h | 1 + 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 344f52fc5a..418a45e5e9 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -138,8 +138,8 @@ void AudioClient::checkDevices() { auto inputDevices = getAvailableDevices(QAudio::AudioInput); auto outputDevices = getAvailableDevices(QAudio::AudioOutput); - QMetaObject::invokeMethod(this, "changeDefault", Q_ARG(HifiAudioDeviceInfo, inputDevices.first()), Q_ARG(QAudio::Mode, QAudio::AudioInput)); - QMetaObject::invokeMethod(this, "changeDefault", Q_ARG(HifiAudioDeviceInfo, outputDevices.first()), Q_ARG(QAudio::Mode, QAudio::AudioOutput)); + checkDefaultChanges(inputDevices); + checkDefaultChanges(outputDevices); Lock lock(_deviceMutex); if (inputDevices != _inputDevices) { @@ -153,6 +153,14 @@ void AudioClient::checkDevices() { } } +void AudioClient::checkDefaultChanges(QList& devices) { + foreach(auto device, devices) { + if (device.isDefault()) { + QMetaObject::invokeMethod(this, "changeDefault", Q_ARG(HifiAudioDeviceInfo, device), Q_ARG(QAudio::Mode, device.getMode())); + } + } +} + HifiAudioDeviceInfo AudioClient::getActiveAudioDevice(QAudio::Mode mode) const { Lock lock(_deviceMutex); diff --git a/libraries/audio-client/src/AudioClient.h b/libraries/audio-client/src/AudioClient.h index b4ddb1018e..301b4d0fa5 100644 --- a/libraries/audio-client/src/AudioClient.h +++ b/libraries/audio-client/src/AudioClient.h @@ -238,6 +238,7 @@ public slots: bool shouldLoopbackInjectors() override { return _shouldEchoToServer; } Q_INVOKABLE void changeDefault(HifiAudioDeviceInfo newDefault, QAudio::Mode mode); + void checkDefaultChanges(QList& devices); // calling with a null QAudioDevice will use the system default bool switchAudioDevice(QAudio::Mode mode, const HifiAudioDeviceInfo& deviceInfo = HifiAudioDeviceInfo()); From a8602195d4cb5c602672dbb186415245202d6772 Mon Sep 17 00:00:00 2001 From: amerhifi Date: Tue, 22 Oct 2019 07:17:57 -0700 Subject: [PATCH 04/10] addressing comments --- interface/src/scripting/AudioDevices.cpp | 22 ++++++++----------- libraries/audio-client/CMakeLists.txt | 1 + libraries/audio-client/src/AudioClient.cpp | 8 ++++--- .../audio-client/src/HifiAudioDeviceInfo.cpp | 3 +-- .../audio-client/src/HifiAudioDeviceInfo.h | 2 -- .../plugins/src/plugins/PluginManager.cpp | 6 ++--- libraries/plugins/src/plugins/PluginManager.h | 1 + 7 files changed, 19 insertions(+), 24 deletions(-) diff --git a/interface/src/scripting/AudioDevices.cpp b/interface/src/scripting/AudioDevices.cpp index 7cabd49e93..4aa1018c23 100644 --- a/interface/src/scripting/AudioDevices.cpp +++ b/interface/src/scripting/AudioDevices.cpp @@ -62,12 +62,6 @@ static QString getTargetDevice(bool hmd, QAudio::Mode mode) { auto& setting = getSetting(hmd, mode); if (setting.isSet()) { deviceName = setting.get(); - } else if (hmd) { - if (mode == QAudio::AudioInput) { - deviceName = qApp->getActiveDisplayPlugin()->getPreferredAudioInDevice(); - } else { // if (_mode == QAudio::AudioOutput) - deviceName = qApp->getActiveDisplayPlugin()->getPreferredAudioOutDevice(); - } } else { deviceName = HifiAudioDeviceInfo::DEFAULT_DEVICE_NAME; } @@ -269,13 +263,15 @@ void AudioDeviceList::onDevicesChanged(const QList& devices bool hmdIsSelected = false; bool desktopIsSelected = false; - foreach(const HifiAudioDeviceInfo& deviceInfo, devices) { - for (bool isHMD : {false, true}) { - auto& backupSelectedDeviceName = isHMD ? _backupSelectedHMDDeviceName : _backupSelectedDesktopDeviceName; - if (deviceInfo.deviceName() == backupSelectedDeviceName) { - HifiAudioDeviceInfo& selectedDevice = isHMD ? _selectedHMDDevice : _selectedDesktopDevice; - selectedDevice = deviceInfo; - backupSelectedDeviceName.clear(); + if (!_backupSelectedDesktopDeviceName.isEmpty() && !_backupSelectedHMDDeviceName.isEmpty()) { + foreach(const HifiAudioDeviceInfo& deviceInfo, devices) { + for (bool isHMD : {false, true}) { + auto& backupSelectedDeviceName = isHMD ? _backupSelectedHMDDeviceName : _backupSelectedDesktopDeviceName; + if (deviceInfo.deviceName() == backupSelectedDeviceName) { + HifiAudioDeviceInfo& selectedDevice = isHMD ? _selectedHMDDevice : _selectedDesktopDevice; + selectedDevice = deviceInfo; + backupSelectedDeviceName.clear(); + } } } } diff --git a/libraries/audio-client/CMakeLists.txt b/libraries/audio-client/CMakeLists.txt index 03279b08f6..e1d90334ff 100644 --- a/libraries/audio-client/CMakeLists.txt +++ b/libraries/audio-client/CMakeLists.txt @@ -7,6 +7,7 @@ link_hifi_libraries(audio plugins) include_hifi_library_headers(shared) include_hifi_library_headers(networking) include_hifi_library_headers(gpu) + if (ANDROID) else () target_webrtc() diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 418a45e5e9..cb8128bbc9 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -39,6 +39,7 @@ #include #include +#include #include #include #include @@ -48,6 +49,7 @@ #include #include #include + #include "AudioClientLogging.h" #include "AudioLogging.h" #include "AudioHelpers.h" @@ -81,7 +83,7 @@ Mutex _recordMutex; HifiAudioDeviceInfo defaultAudioDeviceForMode(QAudio::Mode mode); -#include + static QString getHmdAudioDeviceName(QAudio::Mode mode) { foreach(DisplayPluginPointer displayPlugin, PluginManager::getInstance()->getAllDisplayPlugins()) { if (displayPlugin && displayPlugin->isHmd()) { @@ -568,7 +570,7 @@ HifiAudioDeviceInfo defaultAudioDeviceForMode(QAudio::Mode mode) { HifiAudioDeviceInfo foundDevice; foreach(QAudioDeviceInfo audioDevice, devices) { if (audioDevice.deviceName().trimmed() == deviceName.trimmed()) { - foundDevice=HifiAudioDeviceInfo(audioDevice,true,mode, HifiAudioDeviceInfo::desktop); + foundDevice=HifiAudioDeviceInfo(audioDevice, true, mode, HifiAudioDeviceInfo::desktop); break; } } @@ -594,7 +596,7 @@ HifiAudioDeviceInfo defaultAudioDeviceForMode(QAudio::Mode mode) { } #endif // fallback for failed lookup is the default device - return (mode == QAudio::AudioInput) ? HifiAudioDeviceInfo(QAudioDeviceInfo::defaultInputDevice(), true,mode, HifiAudioDeviceInfo::desktop) : + return (mode == QAudio::AudioInput) ? HifiAudioDeviceInfo(QAudioDeviceInfo::defaultInputDevice(), true, mode, HifiAudioDeviceInfo::desktop) : HifiAudioDeviceInfo(QAudioDeviceInfo::defaultOutputDevice(), true, mode, HifiAudioDeviceInfo::desktop); } diff --git a/libraries/audio-client/src/HifiAudioDeviceInfo.cpp b/libraries/audio-client/src/HifiAudioDeviceInfo.cpp index 5cbb15ff73..73d0670fa6 100644 --- a/libraries/audio-client/src/HifiAudioDeviceInfo.cpp +++ b/libraries/audio-client/src/HifiAudioDeviceInfo.cpp @@ -32,5 +32,4 @@ bool HifiAudioDeviceInfo::operator==(const HifiAudioDeviceInfo& rhs) const { } bool HifiAudioDeviceInfo::operator!=(const HifiAudioDeviceInfo& rhs) const { return getDevice() != rhs.getDevice() || isDefault() != rhs.isDefault(); -} - +} \ No newline at end of file diff --git a/libraries/audio-client/src/HifiAudioDeviceInfo.h b/libraries/audio-client/src/HifiAudioDeviceInfo.h index 9b77f77c9e..5bc7125574 100644 --- a/libraries/audio-client/src/HifiAudioDeviceInfo.h +++ b/libraries/audio-client/src/HifiAudioDeviceInfo.h @@ -37,7 +37,6 @@ public: _deviceType = deviceInfo.getDeviceType(); } - HifiAudioDeviceInfo(QAudioDeviceInfo deviceInfo, bool isDefault, QAudio::Mode mode, DeviceType devType=both) : _audioDeviceInfo(deviceInfo), _isDefault(isDefault), @@ -66,7 +65,6 @@ public: bool operator==(const HifiAudioDeviceInfo& rhs) const; bool operator!=(const HifiAudioDeviceInfo& rhs) const; - private: QAudioDeviceInfo _audioDeviceInfo; bool _isDefault { false }; diff --git a/libraries/plugins/src/plugins/PluginManager.cpp b/libraries/plugins/src/plugins/PluginManager.cpp index 1ecc4f1d45..660159d9bd 100644 --- a/libraries/plugins/src/plugins/PluginManager.cpp +++ b/libraries/plugins/src/plugins/PluginManager.cpp @@ -13,6 +13,7 @@ #include #include #include +#include //#define HIFI_PLUGINMANAGER_DEBUG #if defined(HIFI_PLUGINMANAGER_DEBUG) @@ -21,6 +22,7 @@ #include #include +#include #include "RuntimePlugin.h" #include "CodecPlugin.h" @@ -221,10 +223,6 @@ const OculusPlatformPluginPointer PluginManager::getOculusPlatformPlugin() { return oculusPlatformPlugin; } -#include -#include - - DisplayPluginList PluginManager::getAllDisplayPlugins() { if (thread() != QThread::currentThread()) { DisplayPluginList list; diff --git a/libraries/plugins/src/plugins/PluginManager.h b/libraries/plugins/src/plugins/PluginManager.h index 5ec82ea743..f0aa662634 100644 --- a/libraries/plugins/src/plugins/PluginManager.h +++ b/libraries/plugins/src/plugins/PluginManager.h @@ -52,6 +52,7 @@ public: using PluginFilter = std::function; void setPluginFilter(PluginFilter pluginFilter) { _pluginFilter = pluginFilter; } Q_INVOKABLE DisplayPluginList getAllDisplayPlugins(); + signals: void inputDeviceRunningChanged(const QString& pluginName, bool isRunning, const QStringList& runningDevices); From 0410a45da1430f88617704e25b019a6b8fff2a11 Mon Sep 17 00:00:00 2001 From: amer cerkic Date: Tue, 22 Oct 2019 11:11:13 -0700 Subject: [PATCH 05/10] fixed selection issue --- interface/src/scripting/AudioDevices.cpp | 21 ++++++++++++++++----- libraries/audio-client/src/AudioClient.cpp | 2 +- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/interface/src/scripting/AudioDevices.cpp b/interface/src/scripting/AudioDevices.cpp index 4aa1018c23..7fc129de3c 100644 --- a/interface/src/scripting/AudioDevices.cpp +++ b/interface/src/scripting/AudioDevices.cpp @@ -268,9 +268,14 @@ void AudioDeviceList::onDevicesChanged(const QList& devices for (bool isHMD : {false, true}) { auto& backupSelectedDeviceName = isHMD ? _backupSelectedHMDDeviceName : _backupSelectedDesktopDeviceName; if (deviceInfo.deviceName() == backupSelectedDeviceName) { - HifiAudioDeviceInfo& selectedDevice = isHMD ? _selectedHMDDevice : _selectedDesktopDevice; - selectedDevice = deviceInfo; - backupSelectedDeviceName.clear(); + if (isHMD && deviceInfo.getDeviceType() != HifiAudioDeviceInfo::desktop) { + _selectedHMDDevice= deviceInfo; + backupSelectedDeviceName.clear(); + } else if (!isHMD && deviceInfo.getDeviceType() != HifiAudioDeviceInfo::hmd) { + _selectedDesktopDevice = deviceInfo; + backupSelectedDeviceName.clear(); + } + } } } @@ -323,8 +328,14 @@ void AudioDeviceList::onDevicesChanged(const QList& devices } else { //no selected device for context. fallback to saved - const QString& savedDeviceName = isHMD ? _hmdSavedDeviceName : _desktopSavedDeviceName; - isSelected = (device.info.deviceName() == savedDeviceName); + QString& savedDeviceName = isHMD ? _hmdSavedDeviceName : _desktopSavedDeviceName; + + if (device.info.deviceName() == savedDeviceName) { + if ((isHMD && device.info.getDeviceType() != HifiAudioDeviceInfo::desktop) || + (!isHMD && device.info.getDeviceType() != HifiAudioDeviceInfo::hmd)) { + isSelected = true; + } + } } if (isSelected) { diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index cb8128bbc9..3e1557e09b 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -570,7 +570,7 @@ HifiAudioDeviceInfo defaultAudioDeviceForMode(QAudio::Mode mode) { HifiAudioDeviceInfo foundDevice; foreach(QAudioDeviceInfo audioDevice, devices) { if (audioDevice.deviceName().trimmed() == deviceName.trimmed()) { - foundDevice=HifiAudioDeviceInfo(audioDevice, true, mode, HifiAudioDeviceInfo::desktop); + foundDevice = HifiAudioDeviceInfo(audioDevice, true, mode, HifiAudioDeviceInfo::desktop); break; } } From 179f5e0873ff65c5960ef2d3b7e4846083bb8a47 Mon Sep 17 00:00:00 2001 From: amer cerkic Date: Wed, 23 Oct 2019 12:56:43 -0700 Subject: [PATCH 06/10] fixed context switching issue with hmd. included additional output info for other audio crash issues --- interface/src/scripting/AudioDevices.cpp | 4 ++-- libraries/audio-client/src/AudioClient.cpp | 27 ++++++++++++++-------- libraries/audio-client/src/AudioClient.h | 2 +- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/interface/src/scripting/AudioDevices.cpp b/interface/src/scripting/AudioDevices.cpp index 7fc129de3c..76c871fa5c 100644 --- a/interface/src/scripting/AudioDevices.cpp +++ b/interface/src/scripting/AudioDevices.cpp @@ -164,8 +164,8 @@ void AudioDeviceList::resetDevice(bool contextIsHMD) { QString deviceName = getTargetDevice(contextIsHMD, _mode); // FIXME can't use blocking connections here, so we can't determine whether the switch succeeded or not // We need to have the AudioClient emit signals on switch success / failure - QMetaObject::invokeMethod(client, "switchAudioDevice", - Q_ARG(QAudio::Mode, _mode), Q_ARG(QString, deviceName)); + QMetaObject::invokeMethod(client, "switchAudioDevice", + Q_ARG(QAudio::Mode, _mode), Q_ARG(QString, deviceName), Q_ARG(bool, contextIsHMD)); #if 0 bool switchResult = false; diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 3e1557e09b..9ae751d6c3 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -424,12 +424,14 @@ void AudioClient::setAudioPaused(bool pause) { } } -HifiAudioDeviceInfo getNamedAudioDeviceForMode(QAudio::Mode mode, const QString& deviceName) { +HifiAudioDeviceInfo getNamedAudioDeviceForMode(QAudio::Mode mode, const QString& deviceName, bool isHmd=false) { HifiAudioDeviceInfo result; foreach (HifiAudioDeviceInfo audioDevice, getAvailableDevices(mode)) { if (audioDevice.deviceName().trimmed() == deviceName.trimmed()) { - result = audioDevice; - break; + if ((!isHmd && audioDevice.getDeviceType() != HifiAudioDeviceInfo::hmd) || (isHmd && audioDevice.getDeviceType() != HifiAudioDeviceInfo::desktop)) { + result = audioDevice; + break; + } } } return result; @@ -986,13 +988,18 @@ void AudioClient::selectAudioFormat(const QString& selectedCodecName) { void AudioClient::changeDefault(HifiAudioDeviceInfo newDefault, QAudio::Mode mode) { HifiAudioDeviceInfo currentDevice = mode == QAudio::AudioInput ? _inputDeviceInfo : _outputDeviceInfo; - if (currentDevice.isDefault() && currentDevice.getDevice() != newDefault.getDevice()) { + if (currentDevice.isDefault() && currentDevice.getDeviceType() == newDefault.getDeviceType() && currentDevice.getDevice() != newDefault.getDevice()) { switchAudioDevice(mode, newDefault); } } bool AudioClient::switchAudioDevice(QAudio::Mode mode, const HifiAudioDeviceInfo& deviceInfo) { auto device = deviceInfo; + if (deviceInfo.getDevice().isNull()) { + qCDebug(audioclient) << __FUNCTION__ << " switching to null device :" + << deviceInfo.deviceName() << " : " << deviceInfo.getDevice().deviceName(); + } + if (mode == QAudio::AudioInput) { return switchInputToAudioDevice(device); } else { @@ -1000,8 +1007,8 @@ bool AudioClient::switchAudioDevice(QAudio::Mode mode, const HifiAudioDeviceInfo } } -bool AudioClient::switchAudioDevice(QAudio::Mode mode, const QString& deviceName) { - return switchAudioDevice(mode, getNamedAudioDeviceForMode(mode, deviceName)); +bool AudioClient::switchAudioDevice(QAudio::Mode mode, const QString& deviceName, bool isHmd) { + return switchAudioDevice(mode, getNamedAudioDeviceForMode(mode, deviceName, isHmd)); } void AudioClient::configureReverb() { @@ -1809,7 +1816,8 @@ void AudioClient::outputFormatChanged() { bool AudioClient::switchInputToAudioDevice(const HifiAudioDeviceInfo inputDeviceInfo, bool isShutdownRequest) { Q_ASSERT_X(QThread::currentThread() == thread(), Q_FUNC_INFO, "Function invoked on wrong thread"); - qCDebug(audioclient) << __FUNCTION__ << "inputDeviceInfo: [" << _inputDeviceInfo.deviceName() <<"----"< Date: Wed, 23 Oct 2019 14:48:25 -0700 Subject: [PATCH 07/10] android build fix --- libraries/audio-client/src/AudioClient.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 9ae751d6c3..4a00dd9bf3 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -2005,9 +2005,9 @@ void AudioClient::setHeadsetPluggedIn(bool pluggedIn) { bool aecEnabled = enableAEC.get(); if ((pluggedIn || !aecEnabled) && _inputDeviceInfo.deviceName() != VOICE_RECOGNITION) { - switchAudioDevice(QAudio::AudioInput, VOICE_RECOGNITION); + switchAudioDevice(QAudio::AudioInput, VOICE_RECOGNITION, false); } else if (!pluggedIn && aecEnabled && _inputDeviceInfo.deviceName() != VOICE_COMMUNICATION) { - switchAudioDevice(QAudio::AudioInput, VOICE_COMMUNICATION); + switchAudioDevice(QAudio::AudioInput, VOICE_COMMUNICATION, false); } } _isHeadsetPluggedIn = pluggedIn; From ed4df09a261ce4cfd0069bf0608990b1dbe64194 Mon Sep 17 00:00:00 2001 From: amer cerkic Date: Wed, 23 Oct 2019 15:15:41 -0700 Subject: [PATCH 08/10] updated logging added clarifying comment for emit --- libraries/audio-client/src/AudioClient.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 4a00dd9bf3..169a975f96 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -1816,8 +1816,8 @@ void AudioClient::outputFormatChanged() { bool AudioClient::switchInputToAudioDevice(const HifiAudioDeviceInfo inputDeviceInfo, bool isShutdownRequest) { Q_ASSERT_X(QThread::currentThread() == thread(), Q_FUNC_INFO, "Function invoked on wrong thread"); - qCDebug(audioclient) << __FUNCTION__ << "inputDeviceInfo: [" << _inputDeviceInfo.deviceName() << ":" << _inputDeviceInfo.getDevice().deviceName() - <<"-- new device: "<< inputDeviceInfo.deviceName() <<":"<< inputDeviceInfo.getDevice().deviceName() << "]"; + qCDebug(audioclient) << __FUNCTION__ << "_inputDeviceInfo: [" << _inputDeviceInfo.deviceName() << ":" << _inputDeviceInfo.getDevice().deviceName() + << "-- inputDeviceInfo: " << inputDeviceInfo.deviceName() << ":" << inputDeviceInfo.getDevice().deviceName() << "]"; bool supportedFormat = false; // NOTE: device start() uses the Qt internal device list @@ -1869,8 +1869,9 @@ bool AudioClient::switchInputToAudioDevice(const HifiAudioDeviceInfo inputDevice } if (!inputDeviceInfo.getDevice().isNull()) { - qCDebug(audioclient) << "The audio input device " << inputDeviceInfo.deviceName() << "is available."; + qCDebug(audioclient) << "The audio input device " << inputDeviceInfo.deviceName() << ":" << inputDeviceInfo.getDevice().deviceName() << " is available."; + //do not update UI that we're changing devices if default or same device bool doEmit = _inputDeviceInfo.deviceName() != inputDeviceInfo.deviceName(); _inputDeviceInfo = inputDeviceInfo; if (doEmit) { @@ -2053,8 +2054,8 @@ void AudioClient::noteAwakening() { bool AudioClient::switchOutputToAudioDevice(const HifiAudioDeviceInfo outputDeviceInfo, bool isShutdownRequest) { Q_ASSERT_X(QThread::currentThread() == thread(), Q_FUNC_INFO, "Function invoked on wrong thread"); - qCDebug(audioclient) << __FUNCTION__ << "inputDeviceInfo: [" << _outputDeviceInfo.deviceName() << ":" << _outputDeviceInfo.getDevice().deviceName() - << "-- new device: " << outputDeviceInfo.deviceName() << ":" << outputDeviceInfo.getDevice().deviceName() << "]"; + qCDebug(audioclient) << __FUNCTION__ << "_outputdeviceInfo: [" << _outputDeviceInfo.deviceName() << ":" << _outputDeviceInfo.getDevice().deviceName() + << "-- outputDeviceInfo: " << outputDeviceInfo.deviceName() << ":" << outputDeviceInfo.getDevice().deviceName() << "]"; bool supportedFormat = false; // NOTE: device start() uses the Qt internal device list @@ -2110,7 +2111,9 @@ bool AudioClient::switchOutputToAudioDevice(const HifiAudioDeviceInfo outputDevi } if (!outputDeviceInfo.getDevice().isNull()) { - qCDebug(audioclient) << "The audio output device " << outputDeviceInfo.deviceName() << "is available."; + qCDebug(audioclient) << "The audio output device " << outputDeviceInfo.deviceName() << ":" << outputDeviceInfo.getDevice().deviceName() << " is available."; + + //do not update UI that we're changing devices if default or same device bool doEmit = _outputDeviceInfo.deviceName() != outputDeviceInfo.deviceName(); _outputDeviceInfo = outputDeviceInfo; if (doEmit) { From ac8b664537ca25b6fbf2b2c3215985818c5594d6 Mon Sep 17 00:00:00 2001 From: amer cerkic Date: Wed, 23 Oct 2019 15:39:38 -0700 Subject: [PATCH 09/10] addresing pr comments --- libraries/audio-client/src/AudioClient.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 169a975f96..995fe20886 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -1817,7 +1817,7 @@ bool AudioClient::switchInputToAudioDevice(const HifiAudioDeviceInfo inputDevice Q_ASSERT_X(QThread::currentThread() == thread(), Q_FUNC_INFO, "Function invoked on wrong thread"); qCDebug(audioclient) << __FUNCTION__ << "_inputDeviceInfo: [" << _inputDeviceInfo.deviceName() << ":" << _inputDeviceInfo.getDevice().deviceName() - << "-- inputDeviceInfo: " << inputDeviceInfo.deviceName() << ":" << inputDeviceInfo.getDevice().deviceName() << "]"; + << "-- inputDeviceInfo:" << inputDeviceInfo.deviceName() << ":" << inputDeviceInfo.getDevice().deviceName() << "]"; bool supportedFormat = false; // NOTE: device start() uses the Qt internal device list @@ -1869,7 +1869,7 @@ bool AudioClient::switchInputToAudioDevice(const HifiAudioDeviceInfo inputDevice } if (!inputDeviceInfo.getDevice().isNull()) { - qCDebug(audioclient) << "The audio input device " << inputDeviceInfo.deviceName() << ":" << inputDeviceInfo.getDevice().deviceName() << " is available."; + qCDebug(audioclient) << "The audio input device" << inputDeviceInfo.deviceName() << ":" << inputDeviceInfo.getDevice().deviceName() << "is available."; //do not update UI that we're changing devices if default or same device bool doEmit = _inputDeviceInfo.deviceName() != inputDeviceInfo.deviceName(); @@ -2055,7 +2055,7 @@ bool AudioClient::switchOutputToAudioDevice(const HifiAudioDeviceInfo outputDevi Q_ASSERT_X(QThread::currentThread() == thread(), Q_FUNC_INFO, "Function invoked on wrong thread"); qCDebug(audioclient) << __FUNCTION__ << "_outputdeviceInfo: [" << _outputDeviceInfo.deviceName() << ":" << _outputDeviceInfo.getDevice().deviceName() - << "-- outputDeviceInfo: " << outputDeviceInfo.deviceName() << ":" << outputDeviceInfo.getDevice().deviceName() << "]"; + << "-- outputDeviceInfo:" << outputDeviceInfo.deviceName() << ":" << outputDeviceInfo.getDevice().deviceName() << "]"; bool supportedFormat = false; // NOTE: device start() uses the Qt internal device list @@ -2111,7 +2111,7 @@ bool AudioClient::switchOutputToAudioDevice(const HifiAudioDeviceInfo outputDevi } if (!outputDeviceInfo.getDevice().isNull()) { - qCDebug(audioclient) << "The audio output device " << outputDeviceInfo.deviceName() << ":" << outputDeviceInfo.getDevice().deviceName() << " is available."; + qCDebug(audioclient) << "The audio output device" << outputDeviceInfo.deviceName() << ":" << outputDeviceInfo.getDevice().deviceName() << "is available."; //do not update UI that we're changing devices if default or same device bool doEmit = _outputDeviceInfo.deviceName() != outputDeviceInfo.deviceName(); From 5dd5447095e05ea222fb3a2279e3f3ac50d74b75 Mon Sep 17 00:00:00 2001 From: amerhifi Date: Thu, 24 Oct 2019 15:03:55 -0700 Subject: [PATCH 10/10] moved call to hmd device name prior to locking device mutex --- libraries/audio-client/src/AudioClient.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 995fe20886..18e8d11fc9 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -83,7 +83,6 @@ Mutex _recordMutex; HifiAudioDeviceInfo defaultAudioDeviceForMode(QAudio::Mode mode); - static QString getHmdAudioDeviceName(QAudio::Mode mode) { foreach(DisplayPluginPointer displayPlugin, PluginManager::getInstance()->getAllDisplayPlugins()) { if (displayPlugin && displayPlugin->isHmd()) { @@ -100,6 +99,10 @@ static QString getHmdAudioDeviceName(QAudio::Mode mode) { // thread-safe QList getAvailableDevices(QAudio::Mode mode) { + //get hmd device name prior to locking device mutex. in case of shutdown, this thread will be locked and audio client + //cannot properly shut down. + QString hmdDeviceName = getHmdAudioDeviceName(mode); + // NOTE: availableDevices() clobbers the Qt internal device list Lock lock(_deviceMutex); auto devices = QAudioDeviceInfo::availableDevices(mode); @@ -110,8 +113,7 @@ QList getAvailableDevices(QAudio::Mode mode) { } newDevices.push_front(defaultAudioDeviceForMode(mode)); - - QString hmdDeviceName = getHmdAudioDeviceName(mode); + if (!hmdDeviceName.isNull() && !hmdDeviceName.isEmpty()) { HifiAudioDeviceInfo hmdDevice; foreach(auto device, newDevices) { @@ -803,6 +805,7 @@ void AudioClient::stop() { // Destruction of the pointers will occur when the parent object (this) is destroyed) { Lock lock(_checkDevicesMutex); + _checkDevicesTimer->stop(); _checkDevicesTimer = nullptr; } {