From 49465b1b961196ad21dfe06ed7621d616c7b4428 Mon Sep 17 00:00:00 2001 From: amerhifi Date: Fri, 25 Oct 2019 12:10:26 -0700 Subject: [PATCH 1/7] 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) { From 52637320f0fe1a9d04e81abea67184c462756236 Mon Sep 17 00:00:00 2001 From: amerhifi Date: Fri, 25 Oct 2019 12:49:03 -0700 Subject: [PATCH 2/7] mac build fix --- libraries/audio-client/src/AudioClient.cpp | 51 ++++++++++------------ 1 file changed, 24 insertions(+), 27 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 0a6b9e1c9c..008c15e061 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -517,40 +517,37 @@ QString defaultAudioDeviceName(QAudio::Mode mode) { QString deviceName; #ifdef __APPLE__ - if (devices.size() > 1) { - AudioDeviceID defaultDeviceID = 0; - uint32_t propertySize = sizeof(AudioDeviceID); - AudioObjectPropertyAddress propertyAddress = { - kAudioHardwarePropertyDefaultInputDevice, - kAudioObjectPropertyScopeGlobal, - kAudioObjectPropertyElementMaster - }; + AudioDeviceID defaultDeviceID = 0; + uint32_t propertySize = sizeof(AudioDeviceID); + AudioObjectPropertyAddress propertyAddress = { + kAudioHardwarePropertyDefaultInputDevice, + kAudioObjectPropertyScopeGlobal, + kAudioObjectPropertyElementMaster + }; - if (mode == QAudio::AudioOutput) { - propertyAddress.mSelector = kAudioHardwarePropertyDefaultOutputDevice; - } + if (mode == QAudio::AudioOutput) { + propertyAddress.mSelector = kAudioHardwarePropertyDefaultOutputDevice; + } - OSStatus getPropertyError = AudioObjectGetPropertyData(kAudioObjectSystemObject, - &propertyAddress, - 0, - NULL, - &propertySize, - &defaultDeviceID); + OSStatus getPropertyError = AudioObjectGetPropertyData(kAudioObjectSystemObject, + &propertyAddress, + 0, + NULL, + &propertySize, + &defaultDeviceID); + + if (!getPropertyError && propertySize) { + CFStringRef devName = NULL; + propertySize = sizeof(devName); + propertyAddress.mSelector = kAudioDevicePropertyDeviceNameCFString; + getPropertyError = AudioObjectGetPropertyData(defaultDeviceID, &propertyAddress, 0, + NULL, &propertySize, &devName); if (!getPropertyError && propertySize) { - CFStringRef deviceName = NULL; - propertySize = sizeof(deviceName); - propertyAddress.mSelector = kAudioDevicePropertyDeviceNameCFString; - getPropertyError = AudioObjectGetPropertyData(defaultDeviceID, &propertyAddress, 0, - NULL, &propertySize, &deviceName); - - if (!getPropertyError && propertySize) { - deviceName = CFStringGetCStringPtr(deviceName, kCFStringEncodingMacRoman)); - } + deviceName = CFStringGetCStringPtr(devName, kCFStringEncodingMacRoman)); } } - } #endif #ifdef WIN32 //Check for Windows Vista or higher, IMMDeviceEnumerator doesn't work below that. From 3e1f3412254fb1536571fee13e52d391bda599db Mon Sep 17 00:00:00 2001 From: amerhifi Date: Fri, 25 Oct 2019 12:50:13 -0700 Subject: [PATCH 3/7] typo fix --- libraries/audio-client/src/AudioClient.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 008c15e061..c4f188fb53 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -545,7 +545,7 @@ QString defaultAudioDeviceName(QAudio::Mode mode) { NULL, &propertySize, &devName); if (!getPropertyError && propertySize) { - deviceName = CFStringGetCStringPtr(devName, kCFStringEncodingMacRoman)); + deviceName = CFStringGetCStringPtr(devName, kCFStringEncodingMacRoman); } } #endif From 6860ac96935732c25626438b816617f4ff8a7f3b Mon Sep 17 00:00:00 2001 From: amerhifi Date: Fri, 25 Oct 2019 13:09:13 -0700 Subject: [PATCH 4/7] fix missing default device --- libraries/audio-client/src/AudioClient.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index c4f188fb53..77d8ab6baa 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -117,14 +117,13 @@ QList getAvailableDevices(QAudio::Mode mode) { } } - if (!defaultDesktopDevice.getDevice().isNull()) { - newDevices.push_front(defaultDesktopDevice); - } else { - qCDebug(audioclient) << __FUNCTION__ << "Default device not found in list:" << defDeviceName + if (defaultDesktopDevice.getDevice().isNull()) { + qCDebug(audioclient) << __FUNCTION__ << "Default device not found in list:" << defDeviceName << "Setting Default to: " << devices.first().deviceName(); defaultDesktopDevice = HifiAudioDeviceInfo(devices.first(), true, mode, HifiAudioDeviceInfo::desktop); } - + newDevices.push_front(defaultDesktopDevice); + if (!hmdDeviceName.isNull() && !hmdDeviceName.isEmpty()) { HifiAudioDeviceInfo hmdDevice; foreach(auto device, newDevices) { From 397586bd19cb9da07a840c641a73dddcb4001abd Mon Sep 17 00:00:00 2001 From: amerhifi Date: Fri, 25 Oct 2019 15:19:24 -0700 Subject: [PATCH 5/7] setting defauld device code for mac to use QT with optional backup to platform code on failure --- libraries/audio-client/src/AudioClient.cpp | 61 +++++++++++++--------- 1 file changed, 37 insertions(+), 24 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 77d8ab6baa..d932e91933 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -516,37 +516,50 @@ QString defaultAudioDeviceName(QAudio::Mode mode) { QString deviceName; #ifdef __APPLE__ - AudioDeviceID defaultDeviceID = 0; - uint32_t propertySize = sizeof(AudioDeviceID); - AudioObjectPropertyAddress propertyAddress = { - kAudioHardwarePropertyDefaultInputDevice, - kAudioObjectPropertyScopeGlobal, - kAudioObjectPropertyElementMaster - }; - - if (mode == QAudio::AudioOutput) { - propertyAddress.mSelector = kAudioHardwarePropertyDefaultOutputDevice; + QAudioDeviceInfo device; + if (mode == QAudio::AudioInput) { + device = QAudioDeviceInfo::defaultInputDevice(); + } else { + device = QAudioDeviceInfo::defaultOutputDevice(); } + if (!device.isNull()) { + if (!device.deviceName().isEmpty()) { + deviceName = device.deviceName(); + } + } else { + qDebug() << "QT's Default device is null, reverting to platoform code"; + AudioDeviceID defaultDeviceID = 0; + uint32_t propertySize = sizeof(AudioDeviceID); + AudioObjectPropertyAddress propertyAddress = { + kAudioHardwarePropertyDefaultInputDevice, + kAudioObjectPropertyScopeGlobal, + kAudioObjectPropertyElementMaster + }; + + if (mode == QAudio::AudioOutput) { + propertyAddress.mSelector = kAudioHardwarePropertyDefaultOutputDevice; + } - OSStatus getPropertyError = AudioObjectGetPropertyData(kAudioObjectSystemObject, - &propertyAddress, - 0, - NULL, - &propertySize, - &defaultDeviceID); - - if (!getPropertyError && propertySize) { - CFStringRef devName = NULL; - propertySize = sizeof(devName); - propertyAddress.mSelector = kAudioDevicePropertyDeviceNameCFString; - getPropertyError = AudioObjectGetPropertyData(defaultDeviceID, &propertyAddress, 0, - NULL, &propertySize, &devName); + OSStatus getPropertyError = AudioObjectGetPropertyData(kAudioObjectSystemObject, + &propertyAddress, + 0, + NULL, + &propertySize, + &defaultDeviceID); if (!getPropertyError && propertySize) { - deviceName = CFStringGetCStringPtr(devName, kCFStringEncodingMacRoman); + CFStringRef devName = NULL; + propertySize = sizeof(devName); + propertyAddress.mSelector = kAudioDevicePropertyDeviceNameCFString; + getPropertyError = AudioObjectGetPropertyData(defaultDeviceID, &propertyAddress, 0, + NULL, &propertySize, &devName); + + if (!getPropertyError && propertySize) { + deviceName = CFStringGetCStringPtr(devName, kCFStringEncodingMacRoman); } } + } #endif #ifdef WIN32 //Check for Windows Vista or higher, IMMDeviceEnumerator doesn't work below that. From 8dc13ec242959aa813f4528d41dce26dd96e70c5 Mon Sep 17 00:00:00 2001 From: amerhifi Date: Fri, 25 Oct 2019 16:01:24 -0700 Subject: [PATCH 6/7] fixed mac param spacing --- libraries/audio-client/src/AudioClient.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index d932e91933..e98c71629a 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -542,18 +542,18 @@ QString defaultAudioDeviceName(QAudio::Mode mode) { OSStatus getPropertyError = AudioObjectGetPropertyData(kAudioObjectSystemObject, - &propertyAddress, - 0, - NULL, - &propertySize, - &defaultDeviceID); + &propertyAddress, + 0, + NULL, + &propertySize, + &defaultDeviceID); if (!getPropertyError && propertySize) { CFStringRef devName = NULL; propertySize = sizeof(devName); propertyAddress.mSelector = kAudioDevicePropertyDeviceNameCFString; getPropertyError = AudioObjectGetPropertyData(defaultDeviceID, &propertyAddress, 0, - NULL, &propertySize, &devName); + NULL, &propertySize, &devName); if (!getPropertyError && propertySize) { deviceName = CFStringGetCStringPtr(devName, kCFStringEncodingMacRoman); From f1f67f199637dc60d891dc22ea1136a9408ada08 Mon Sep 17 00:00:00 2001 From: amer cerkic Date: Mon, 28 Oct 2019 10:42:25 -0700 Subject: [PATCH 7/7] android build fix --- libraries/audio-client/src/AudioClient.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index e98c71629a..fe4fab8415 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -501,7 +501,7 @@ HifiAudioDeviceInfo defaultAudioDeviceForMode(QAudio::Mode mode) { bool aecEnabled = enableAEC.get(); auto audioClient = DependencyManager::get(); bool headsetOn = audioClient ? audioClient->isHeadsetPluggedIn() : false; - for (QAudioDeviceInfo inputDevice : devices) { + for (QAudioDeviceInfo inputDevice : QAudioDeviceInfo::availableDevices(mode)) { if (((headsetOn || !aecEnabled) && inputDevice.deviceName() == VOICE_RECOGNITION) || ((!headsetOn && aecEnabled) && inputDevice.deviceName() == VOICE_COMMUNICATION)) { return HifiAudioDeviceInfo(inputDevice, false, QAudio::AudioInput);