From b2ab33116fc402284d0053084b7247f3e22806a4 Mon Sep 17 00:00:00 2001 From: amer cerkic Date: Mon, 4 Nov 2019 15:03:53 -0800 Subject: [PATCH 1/4] removing double calls to switch devices, handling default changes from scripting interface instead --- interface/src/scripting/AudioDevices.cpp | 92 ++++++------------- libraries/audio-client/src/AudioClient.cpp | 28 +----- libraries/audio-client/src/AudioClient.h | 2 - .../audio-client/src/HifiAudioDeviceInfo.cpp | 1 + .../audio-client/src/HifiAudioDeviceInfo.h | 5 +- 5 files changed, 34 insertions(+), 94 deletions(-) diff --git a/interface/src/scripting/AudioDevices.cpp b/interface/src/scripting/AudioDevices.cpp index 688b4df8cd..31b3e9ecee 100644 --- a/interface/src/scripting/AudioDevices.cpp +++ b/interface/src/scripting/AudioDevices.cpp @@ -287,18 +287,19 @@ void AudioDeviceList::onDevicesChanged(QAudio::Mode mode, const QListinfo.deviceName() == device.info.deviceName()) { - isNewDevice = false; - break; - } - } - - if (isNewDevice) { - emit selectedDevicePlugged(device.info, isHMD); - } } } @@ -403,6 +386,15 @@ void AudioDeviceList::onDevicesChanged(QAudio::Mode mode, const QListgetActiveAudioDevice(QAudio::AudioInput), contextIsHMD); - _outputs.onDeviceChanged(client->getActiveAudioDevice(QAudio::AudioOutput), contextIsHMD); - - // connections are made after client is initialized, so we must also fetch the devices - const QList& devicesInput = client->getAudioDevices(QAudio::AudioInput); - const QList& devicesOutput = client->getAudioDevices(QAudio::AudioOutput); - - if (devicesInput.size() > 0 && devicesOutput.size() > 0) { - //setup devices - _inputs.onDevicesChanged(QAudio::AudioInput, devicesInput); - _outputs.onDevicesChanged(QAudio::AudioOutput, devicesOutput); - } } AudioDevices::~AudioDevices() {} @@ -526,29 +505,12 @@ void AudioDevices::onDevicesChanged(QAudio::Mode mode, const QList().data(); - _inputs._hmdSavedDeviceName = getTargetDevice(true, QAudio::AudioInput); _inputs._desktopSavedDeviceName = getTargetDevice(false, QAudio::AudioInput); - //fallback to default device - if (_inputs._desktopSavedDeviceName.isEmpty()) { - _inputs._desktopSavedDeviceName = client->getActiveAudioDevice(QAudio::AudioInput).deviceName(); - } - //fallback to desktop device - if (_inputs._hmdSavedDeviceName.isEmpty()) { - _inputs._hmdSavedDeviceName = _inputs._desktopSavedDeviceName; - } - _outputs._hmdSavedDeviceName = getTargetDevice(true, QAudio::AudioOutput); _outputs._desktopSavedDeviceName = getTargetDevice(false, QAudio::AudioOutput); - if (_outputs._desktopSavedDeviceName.isEmpty()) { - _outputs._desktopSavedDeviceName = client->getActiveAudioDevice(QAudio::AudioOutput).deviceName(); - } - if (_outputs._hmdSavedDeviceName.isEmpty()) { - _outputs._hmdSavedDeviceName = _outputs._desktopSavedDeviceName; - } onContextChanged(QString()); }); diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index d6faea4396..61e0a37161 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -153,9 +153,6 @@ void AudioClient::checkDevices() { auto inputDevices = getAvailableDevices(QAudio::AudioInput, hmdInputName); auto outputDevices = getAvailableDevices(QAudio::AudioOutput, hmdOutputName); - checkDefaultChanges(inputDevices); - checkDefaultChanges(outputDevices); - Lock lock(_deviceMutex); if (inputDevices != _inputDevices) { _inputDevices.swap(inputDevices); @@ -168,14 +165,6 @@ 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); @@ -996,13 +985,6 @@ 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.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()) { @@ -1883,11 +1865,8 @@ bool AudioClient::switchInputToAudioDevice(const HifiAudioDeviceInfo inputDevice 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) { - emit deviceChanged(QAudio::AudioInput, _inputDeviceInfo); - } + emit deviceChanged(QAudio::AudioInput, _inputDeviceInfo); if (adjustedFormatForAudioDevice(_inputDeviceInfo.getDevice(), _desiredInputFormat, _inputFormat)) { qCDebug(audioclient) << "The format to be used for audio input is" << _inputFormat; @@ -2125,11 +2104,8 @@ bool AudioClient::switchOutputToAudioDevice(const HifiAudioDeviceInfo outputDevi 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) { - emit deviceChanged(QAudio::AudioOutput, _outputDeviceInfo); - } + emit deviceChanged(QAudio::AudioOutput, _outputDeviceInfo); if (adjustedFormatForAudioDevice(_outputDeviceInfo.getDevice(), _desiredOutputFormat, _outputFormat)) { qCDebug(audioclient) << "The format to be used for audio output is" << _outputFormat; diff --git a/libraries/audio-client/src/AudioClient.h b/libraries/audio-client/src/AudioClient.h index dafa81081c..e31b4789ce 100644 --- a/libraries/audio-client/src/AudioClient.h +++ b/libraries/audio-client/src/AudioClient.h @@ -237,8 +237,6 @@ public slots: int setOutputBufferSize(int numFrames, bool persist = true); 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()); diff --git a/libraries/audio-client/src/HifiAudioDeviceInfo.cpp b/libraries/audio-client/src/HifiAudioDeviceInfo.cpp index 73d0670fa6..2a4c9065f4 100644 --- a/libraries/audio-client/src/HifiAudioDeviceInfo.cpp +++ b/libraries/audio-client/src/HifiAudioDeviceInfo.cpp @@ -23,6 +23,7 @@ HifiAudioDeviceInfo& HifiAudioDeviceInfo::operator=(const HifiAudioDeviceInfo& o _mode = other.getMode(); _isDefault = other.isDefault(); _deviceType = other.getDeviceType(); + _debugName = other.getDevice().deviceName(); return *this; } diff --git a/libraries/audio-client/src/HifiAudioDeviceInfo.h b/libraries/audio-client/src/HifiAudioDeviceInfo.h index 5bc7125574..ddf5493241 100644 --- a/libraries/audio-client/src/HifiAudioDeviceInfo.h +++ b/libraries/audio-client/src/HifiAudioDeviceInfo.h @@ -35,13 +35,15 @@ public: _mode = deviceInfo.getMode(); _isDefault = deviceInfo.isDefault(); _deviceType = deviceInfo.getDeviceType(); + _debugName = deviceInfo.getDevice().deviceName(); } HifiAudioDeviceInfo(QAudioDeviceInfo deviceInfo, bool isDefault, QAudio::Mode mode, DeviceType devType=both) : _audioDeviceInfo(deviceInfo), _isDefault(isDefault), _mode(mode), - _deviceType(devType){ + _deviceType(devType), + _debugName(deviceInfo.deviceName()) { } void setMode(QAudio::Mode mode) { _mode = mode; } @@ -70,6 +72,7 @@ private: bool _isDefault { false }; QAudio::Mode _mode { QAudio::AudioInput }; DeviceType _deviceType{ both }; + QString _debugName; public: static const QString DEFAULT_DEVICE_NAME; From 81881acafcdf86473706608d22f18a07c3e33064 Mon Sep 17 00:00:00 2001 From: amer cerkic Date: Mon, 4 Nov 2019 15:08:06 -0800 Subject: [PATCH 2/4] fixing a few spacing issues --- interface/src/scripting/AudioDevices.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/interface/src/scripting/AudioDevices.cpp b/interface/src/scripting/AudioDevices.cpp index 31b3e9ecee..57d4865eed 100644 --- a/interface/src/scripting/AudioDevices.cpp +++ b/interface/src/scripting/AudioDevices.cpp @@ -350,7 +350,8 @@ void AudioDeviceList::onDevicesChanged(QAudio::Mode mode, const QList Date: Mon, 4 Nov 2019 15:44:15 -0800 Subject: [PATCH 3/4] removed extra spaces --- interface/src/scripting/AudioDevices.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/interface/src/scripting/AudioDevices.cpp b/interface/src/scripting/AudioDevices.cpp index 57d4865eed..500cedcb09 100644 --- a/interface/src/scripting/AudioDevices.cpp +++ b/interface/src/scripting/AudioDevices.cpp @@ -395,7 +395,6 @@ void AudioDeviceList::onDevicesChanged(QAudio::Mode mode, const QList Date: Tue, 5 Nov 2019 12:50:59 -0800 Subject: [PATCH 4/4] removing lock from WASAPI initialization --- libraries/audio-client/src/AudioClient.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 61e0a37161..612493db2e 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -324,12 +324,10 @@ AudioClient::AudioClient() { connect(&_receivedAudioStream, &InboundAudioStream::mismatchedAudioCodec, this, &AudioClient::handleMismatchAudioFormat); - { - QReadLocker readLock(&_hmdNameLock); - // initialize wasapi; if getAvailableDevices is called from the CheckDevicesThread before this, it will crash - getAvailableDevices(QAudio::AudioInput, _hmdInputName); - getAvailableDevices(QAudio::AudioOutput, _hmdOutputName); - } + // initialize wasapi; if getAvailableDevices is called from the CheckDevicesThread before this, it will crash + getAvailableDevices(QAudio::AudioInput, QString()); + getAvailableDevices(QAudio::AudioOutput, QString()); + // start a thread to detect any device changes _checkDevicesTimer = new QTimer(this); const unsigned long DEVICE_CHECK_INTERVAL_MSECS = 2 * 1000;