From 66725f5f1b48d7247cb246c590095603d0909bed Mon Sep 17 00:00:00 2001 From: amerhifi Date: Tue, 17 Sep 2019 07:50:22 -0700 Subject: [PATCH] working on swapping default devices on system change --- interface/src/scripting/AudioDevices.cpp | 2 ++ libraries/audio-client/src/AudioClient.cpp | 28 +++++++++++++++++-- .../audio-client/src/HifiAudioDeviceInfo.h | 2 +- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/interface/src/scripting/AudioDevices.cpp b/interface/src/scripting/AudioDevices.cpp index 7e31d36f7d..b7c2d1e973 100644 --- a/interface/src/scripting/AudioDevices.cpp +++ b/interface/src/scripting/AudioDevices.cpp @@ -121,6 +121,8 @@ AudioDeviceList::~AudioDeviceList() { // store the selected device foreach(std::shared_ptr adevice, _devices) { if (adevice->selectedDesktop) { + qDebug() << "AMER ----> " << adevice->info.getId(); + qDebug() << " AMER-------------> " << adevice->info.deviceName(); settingDesktop.set(adevice->info.deviceName()); } if (adevice->selectedHMD) { diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 4f5edef1b8..a926865025 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -119,6 +119,31 @@ void AudioClient::checkDevices() { auto inputDevices = getAvailableDevices(QAudio::AudioInput); auto outputDevices = getAvailableDevices(QAudio::AudioOutput); + { + Lock lock(_deviceMutex); + //is the current device the default selected device? + if (_inputDeviceInfo.isDefault() && _inputDeviceInfo == _defaultInputDevice) { + auto defInput = defaultAudioDeviceForMode(QAudio::AudioInput); + + //Has the default device changed + if (_defaultInputDevice.getDevice() != defInput.getDevice()) { + qDebug() << "Changing Current Default device " << _defaultInputDevice.getAudioDeviceName(); + _defaultInputDevice.setDevice(defInput.getDevice()); + qDebug() << "NEW Default device " << _defaultInputDevice.getAudioDeviceName(); + QMetaObject::invokeMethod(this, "switchInputToAudioDevice", Qt::QueuedConnection, Q_ARG(HifiAudioDeviceInfo, _defaultInputDevice)); + } + } + + if (_outputDeviceInfo.isDefault() && _inputDeviceInfo == _defaultInputDevice) { + auto defOutput = defaultAudioDeviceForMode(QAudio::AudioOutput); + + if (_defaultOutputDevice.getDevice() != defOutput.getDevice()) { + _defaultOutputDevice.setDevice(defOutput.getDevice()); + QMetaObject::invokeMethod(this, "switchOutputToAudioDevice", Qt::QueuedConnection, Q_ARG(HifiAudioDeviceInfo, _defaultOutputDevice)); + } + } + } + //add the pseudo device to the list of devices inputDevices.push_front(_defaultInputDevice); outputDevices.push_front(_defaultOutputDevice); @@ -342,19 +367,16 @@ AudioClient::AudioClient() : connect(&_receivedAudioStream, &InboundAudioStream::mismatchedAudioCodec, this, &AudioClient::handleMismatchAudioFormat); - _defaultOutputDevice = defaultAudioDeviceForMode(QAudio::AudioOutput); _defaultOutputDevice.setDeviceName("Default audio (recommended)"); _defaultOutputDevice.setIsDefault(true); _defaultOutputDevice.setMode(QAudio::AudioOutput); - _defaultInputDevice = defaultAudioDeviceForMode(QAudio::AudioInput); _defaultInputDevice.setDeviceName("Default microphone (recommended)"); _defaultInputDevice.setIsDefault(true); _defaultInputDevice.setMode(QAudio::AudioInput); - // initialize wasapi; if getAvailableDevices is called from the CheckDevicesThread before this, it will crash getAvailableDevices(QAudio::AudioInput); getAvailableDevices(QAudio::AudioOutput); diff --git a/libraries/audio-client/src/HifiAudioDeviceInfo.h b/libraries/audio-client/src/HifiAudioDeviceInfo.h index e044562a35..2647235e15 100644 --- a/libraries/audio-client/src/HifiAudioDeviceInfo.h +++ b/libraries/audio-client/src/HifiAudioDeviceInfo.h @@ -36,7 +36,7 @@ public: } void setDevice(QAudioDeviceInfo devInfo); void setId(QString name); - + QString getAudioDeviceName() { return _audioDeviceInfo.deviceName(); } QString getId() const { return _uniqueId; } QAudioDeviceInfo getDevice() const { return _audioDeviceInfo; } QString deviceName() const { return _deviceName; }