diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index cc5c9524e4..0f356c70a8 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -118,8 +118,9 @@ void AudioClient::checkDevices() { auto inputDevices = getAvailableDevices(QAudio::AudioInput); auto outputDevices = getAvailableDevices(QAudio::AudioOutput); - QMetaObject::invokeMethod(this, "setDefaultDevice", Qt::BlockingQueuedConnection, Q_ARG(QList&, inputDevices), Q_ARG(QAudio::Mode, QAudio::AudioInput)); - QMetaObject::invokeMethod(this, "setDefaultDevice", Qt::BlockingQueuedConnection, Q_ARG(QList&, outputDevices), Q_ARG(QAudio::Mode, QAudio::AudioOutput)); + //add the pseudo device to the list of devices + inputDevices.push_front(_defaultInputDevice); + outputDevices.push_front(_defaultOutputDevice); Lock lock(_deviceMutex); if (inputDevices != _inputDevices) { @@ -308,6 +309,21 @@ AudioClient::AudioClient() : connect(&_receivedAudioStream, &InboundAudioStream::mismatchedAudioCodec, this, &AudioClient::handleMismatchAudioFormat); + + _defaultOutputDevice = HifiAudioDeviceInfo(); + _defaultOutputDevice.setDevice(defaultAudioDeviceForMode(QAudio::AudioOutput)); + _defaultOutputDevice.setDeviceName("Default audio (recommended)"); + _defaultOutputDevice.setIsDefault(true); + _defaultOutputDevice.setMode(QAudio::AudioOutput); + + + _defaultInputDevice = HifiAudioDeviceInfo(); + _defaultInputDevice.setDevice(defaultAudioDeviceForMode(QAudio::AudioInput)); + _defaultInputDevice.setDeviceName("Default microphone (recommended)"); + _defaultInputDevice.setIsDefault(true); + _defaultInputDevice.setMode(QAudio::AudioOutput); + + // 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/AudioClient.h b/libraries/audio-client/src/AudioClient.h index eb6ebb9339..15f0772dc3 100644 --- a/libraries/audio-client/src/AudioClient.h +++ b/libraries/audio-client/src/AudioClient.h @@ -182,7 +182,6 @@ public: bool startRecording(const QString& filename); void stopRecording(); void setAudioPaused(bool pause); - AudioSolo& getAudioSolo() override { return _solo; } @@ -474,6 +473,9 @@ private: HifiAudioDeviceInfo _inputDeviceInfo; HifiAudioDeviceInfo _outputDeviceInfo; + HifiAudioDeviceInfo _defaultInputDevice; + HifiAudioDeviceInfo _defaultOutputDevice; + QList _inputDevices; QList _outputDevices; diff --git a/libraries/audio-client/src/HifiAudioDeviceInfo.h b/libraries/audio-client/src/HifiAudioDeviceInfo.h index 6a6ca602f8..d2a349ed8c 100644 --- a/libraries/audio-client/src/HifiAudioDeviceInfo.h +++ b/libraries/audio-client/src/HifiAudioDeviceInfo.h @@ -10,7 +10,7 @@ class HifiAudioDeviceInfo : public QObject { Q_OBJECT public: - HifiAudioDeviceInfo() {} + HifiAudioDeviceInfo() : QObject() {} HifiAudioDeviceInfo(const HifiAudioDeviceInfo &deviceInfo){ _audioDeviceInfo = deviceInfo.getDevice(); _mode = deviceInfo.getMode(); @@ -19,51 +19,35 @@ public: } HifiAudioDeviceInfo(QAudioDeviceInfo deviceInfo, bool isDefault, QAudio::Mode mode) : - _audioDeviceInfo(deviceInfo), - _isDefault(isDefault), - _mode(mode) { - setDeviceName(); + _isDefault(isDefault), + _mode(mode), + _audioDeviceInfo(deviceInfo), + _deviceName(deviceInfo.deviceName()){ } - void setMode(QAudio::Mode mode); - void setIsDefault(bool isDefault = false); - void setDeviceName(QString name); - void setDevice(QAudioDeviceInfo devInfo) { - _audioDeviceInfo = devInfo; - setDeviceName(); + void setMode(QAudio::Mode mode) { _mode = mode; } + void setIsDefault(bool isDefault = false) { _isDefault = isDefault; } + + void setDeviceName(QString name) { + _deviceName = name; } + void setDevice(QAudioDeviceInfo devInfo); + QAudioDeviceInfo getDevice() const { return _audioDeviceInfo; } QString deviceName() const { return _deviceName; } bool isDefault() const { return _isDefault; } QAudio::Mode getMode() const { return _mode; } - - HifiAudioDeviceInfo& operator=(const HifiAudioDeviceInfo& other) { - _audioDeviceInfo = other.getDevice(); - _deviceName = other.deviceName(); - _mode = other.getMode(); - _isDefault = other.isDefault(); - return *this; - } - - bool operator==(const HifiAudioDeviceInfo& rhs) const { - return _audioDeviceInfo == rhs.getDevice(); - } - - bool operator!=(const HifiAudioDeviceInfo& rhs) const { - return _audioDeviceInfo != rhs.getDevice(); - } - - -private: - void setDeviceName(); + HifiAudioDeviceInfo& operator=(const HifiAudioDeviceInfo& other); + bool operator==(const HifiAudioDeviceInfo& rhs) const; + bool operator!=(const HifiAudioDeviceInfo& rhs) const; private: QAudioDeviceInfo _audioDeviceInfo; - QString _deviceName; - bool _isDefault; - QAudio::Mode _mode; + QString _deviceName{ "" }; + bool _isDefault { false }; + QAudio::Mode _mode { QAudio::AudioInput }; }; #endif \ No newline at end of file diff --git a/libraries/audio-client/src/HifiAudioDeviceinfo.cpp b/libraries/audio-client/src/HifiAudioDeviceinfo.cpp index 3d40d418fc..91a6324c26 100644 --- a/libraries/audio-client/src/HifiAudioDeviceinfo.cpp +++ b/libraries/audio-client/src/HifiAudioDeviceinfo.cpp @@ -1,25 +1,22 @@ #include "HifiAudioDeviceInfo.h" -void HifiAudioDeviceInfo::setMode(QAudio::Mode mode) { - _mode = mode; - setDeviceName(); +void HifiAudioDeviceInfo::setDevice(QAudioDeviceInfo devInfo) { + _audioDeviceInfo = devInfo; } -void HifiAudioDeviceInfo::setIsDefault(bool isDefault) { - _isDefault = isDefault; - setDeviceName(); +HifiAudioDeviceInfo& HifiAudioDeviceInfo::operator=(const HifiAudioDeviceInfo& other) { + _audioDeviceInfo = other.getDevice(); + _deviceName = other.deviceName(); + _mode = other.getMode(); + _isDefault = other.isDefault(); + return *this; } - void HifiAudioDeviceInfo::setDeviceName() { - if (_isDefault) { - if (_mode == QAudio::Mode::AudioInput) { - _deviceName = "Default microphone (recommended)"; - } else { - _deviceName = "Default audio (recommended)"; - } - } else { - _deviceName = _audioDeviceInfo.deviceName(); - } - } +bool HifiAudioDeviceInfo::operator==(const HifiAudioDeviceInfo& rhs) const { + return _audioDeviceInfo == rhs.getDevice(); +} + +bool HifiAudioDeviceInfo::operator!=(const HifiAudioDeviceInfo& rhs) const { + return _audioDeviceInfo != rhs.getDevice(); +} - \ No newline at end of file