From 49465b1b961196ad21dfe06ed7621d616c7b4428 Mon Sep 17 00:00:00 2001 From: amerhifi Date: Fri, 25 Oct 2019 12:10:26 -0700 Subject: [PATCH] null default device --- libraries/audio-client/src/AudioClient.cpp | 79 +++++++++++----------- 1 file changed, 40 insertions(+), 39 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 18e8d11fc9..0a6b9e1c9c 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -81,7 +81,7 @@ using Lock = std::unique_lock; Mutex _deviceMutex; Mutex _recordMutex; -HifiAudioDeviceInfo defaultAudioDeviceForMode(QAudio::Mode mode); +QString defaultAudioDeviceName(QAudio::Mode mode); static QString getHmdAudioDeviceName(QAudio::Mode mode) { foreach(DisplayPluginPointer displayPlugin, PluginManager::getInstance()->getAllDisplayPlugins()) { @@ -102,18 +102,29 @@ 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); + QString defDeviceName = defaultAudioDeviceName(mode); // NOTE: availableDevices() clobbers the Qt internal device list Lock lock(_deviceMutex); auto devices = QAudioDeviceInfo::availableDevices(mode); - + + HifiAudioDeviceInfo defaultDesktopDevice; QList newDevices; for (auto& device : devices) { newDevices.push_back(HifiAudioDeviceInfo(device, false, mode)); + if (device.deviceName() == defDeviceName.trimmed()) { + defaultDesktopDevice = HifiAudioDeviceInfo(device, true, mode, HifiAudioDeviceInfo::desktop); + } } - - newDevices.push_front(defaultAudioDeviceForMode(mode)); - + + if (!defaultDesktopDevice.getDevice().isNull()) { + newDevices.push_front(defaultDesktopDevice); + } else { + qCDebug(audioclient) << __FUNCTION__ << "Default device not found in list:" << defDeviceName + << "Setting Default to: " << devices.first().deviceName(); + defaultDesktopDevice = HifiAudioDeviceInfo(devices.first(), true, mode, HifiAudioDeviceInfo::desktop); + } + if (!hmdDeviceName.isNull() && !hmdDeviceName.isEmpty()) { HifiAudioDeviceInfo hmdDevice; foreach(auto device, newDevices) { @@ -484,8 +495,27 @@ QString AudioClient::getWinDeviceName(wchar_t* guid) { #endif HifiAudioDeviceInfo defaultAudioDeviceForMode(QAudio::Mode mode) { - QList devices = QAudioDeviceInfo::availableDevices(mode); - + QString deviceName = defaultAudioDeviceName(mode); +#if defined (Q_OS_ANDROID) + if (mode == QAudio::AudioInput) { + Setting::Handle enableAEC(SETTING_AEC_KEY, DEFAULT_AEC_ENABLED); + bool aecEnabled = enableAEC.get(); + auto audioClient = DependencyManager::get(); + bool headsetOn = audioClient ? audioClient->isHeadsetPluggedIn() : false; + for (QAudioDeviceInfo inputDevice : devices) { + if (((headsetOn || !aecEnabled) && inputDevice.deviceName() == VOICE_RECOGNITION) || + ((!headsetOn && aecEnabled) && inputDevice.deviceName() == VOICE_COMMUNICATION)) { + return HifiAudioDeviceInfo(inputDevice, false, QAudio::AudioInput); + } + } + } +#endif + return getNamedAudioDeviceForMode(mode, deviceName); +} + +QString defaultAudioDeviceName(QAudio::Mode mode) { + QString deviceName; + #ifdef __APPLE__ if (devices.size() > 1) { AudioDeviceID defaultDeviceID = 0; @@ -516,18 +546,13 @@ HifiAudioDeviceInfo defaultAudioDeviceForMode(QAudio::Mode mode) { NULL, &propertySize, &deviceName); if (!getPropertyError && propertySize) { - // 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, HifiAudioDeviceInfo::desktop); - } + deviceName = CFStringGetCStringPtr(deviceName, kCFStringEncodingMacRoman)); } } } } #endif #ifdef WIN32 - QString deviceName; //Check for Windows Vista or higher, IMMDeviceEnumerator doesn't work below that. if (!IsWindowsVistaOrGreater()) { // lower then vista if (mode == QAudio::AudioInput) { @@ -571,37 +596,13 @@ HifiAudioDeviceInfo defaultAudioDeviceForMode(QAudio::Mode mode) { CoUninitialize(); } - HifiAudioDeviceInfo foundDevice; - foreach(QAudioDeviceInfo audioDevice, devices) { - if (audioDevice.deviceName().trimmed() == deviceName.trimmed()) { - foundDevice = HifiAudioDeviceInfo(audioDevice, true, mode, HifiAudioDeviceInfo::desktop); - break; - } - } #if !defined(NDEBUG) qCDebug(audioclient) << "defaultAudioDeviceForMode mode: " << (mode == QAudio::AudioOutput ? "Output" : "Input") - << " [" << deviceName << "] [" << foundDevice.deviceName() << "]"; -#endif - return foundDevice; + << " [" << deviceName << "] [" << "]"; #endif -#if defined (Q_OS_ANDROID) - if (mode == QAudio::AudioInput) { - Setting::Handle enableAEC(SETTING_AEC_KEY, DEFAULT_AEC_ENABLED); - bool aecEnabled = enableAEC.get(); - auto audioClient = DependencyManager::get(); - bool headsetOn = audioClient ? audioClient->isHeadsetPluggedIn() : false; - for (QAudioDeviceInfo inputDevice : devices) { - if (((headsetOn || !aecEnabled) && inputDevice.deviceName() == VOICE_RECOGNITION) || - ((!headsetOn && aecEnabled) && inputDevice.deviceName() == VOICE_COMMUNICATION)) { - return HifiAudioDeviceInfo(inputDevice, false, QAudio::AudioInput); - } - } - } #endif - // fallback for failed lookup is the default device - return (mode == QAudio::AudioInput) ? HifiAudioDeviceInfo(QAudioDeviceInfo::defaultInputDevice(), true, mode, HifiAudioDeviceInfo::desktop) : - HifiAudioDeviceInfo(QAudioDeviceInfo::defaultOutputDevice(), true, mode, HifiAudioDeviceInfo::desktop); + return deviceName; } bool AudioClient::getNamedAudioDeviceForModeExists(QAudio::Mode mode, const QString& deviceName) {