From 397586bd19cb9da07a840c641a73dddcb4001abd Mon Sep 17 00:00:00 2001 From: amerhifi Date: Fri, 25 Oct 2019 15:19:24 -0700 Subject: [PATCH] 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.