summaryrefslogtreecommitdiffstats
path: root/src/plugins/wasapi/qwasapiutils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/wasapi/qwasapiutils.cpp')
-rw-r--r--src/plugins/wasapi/qwasapiutils.cpp66
1 files changed, 36 insertions, 30 deletions
diff --git a/src/plugins/wasapi/qwasapiutils.cpp b/src/plugins/wasapi/qwasapiutils.cpp
index bd1795aee..727c94c23 100644
--- a/src/plugins/wasapi/qwasapiutils.cpp
+++ b/src/plugins/wasapi/qwasapiutils.cpp
@@ -178,6 +178,38 @@ bool QWasapiUtils::convertFromNativeFormat(const WAVEFORMATEX *native, QAudioFor
return true;
}
+QByteArray QWasapiUtils::defaultDevice(QAudio::Mode mode)
+{
+ qCDebug(lcMmUtils) << __FUNCTION__ << mode;
+
+ QList<QByteArray> &deviceNames = mode == QAudio::AudioInput ? gMapping->inputDeviceNames : gMapping->outputDeviceNames;
+ QList<QString> &deviceIds = mode == QAudio::AudioInput ? gMapping->inputDeviceIds : gMapping->outputDeviceIds;
+ if (deviceNames.isEmpty() || deviceIds.isEmpty()) // Initialize
+ availableDevices(mode);
+ if (deviceNames.isEmpty() || deviceIds.isEmpty()) // No audio devices at all
+ return QByteArray();
+
+ ComPtr<IMediaDeviceStatics> mediaDeviceStatics;
+ HRESULT hr;
+
+ hr = GetActivationFactory(HString::MakeReference(RuntimeClass_Windows_Media_Devices_MediaDevice).Get(), &mediaDeviceStatics);
+ Q_ASSERT_SUCCEEDED(hr);
+
+ HString defaultAudioDevice;
+ quint32 dADSize = 0;
+
+ if (mode == QAudio::AudioOutput)
+ hr = mediaDeviceStatics->GetDefaultAudioRenderId(AudioDeviceRole_Default, defaultAudioDevice.GetAddressOf());
+ else
+ hr = mediaDeviceStatics->GetDefaultAudioCaptureId(AudioDeviceRole_Default, defaultAudioDevice.GetAddressOf());
+
+ const wchar_t *dadWStr = defaultAudioDevice.GetRawBuffer(&dADSize);
+ const QString defaultAudioDeviceId = QString::fromWCharArray(dadWStr, dADSize);
+ Q_ASSERT(deviceIds.indexOf(defaultAudioDeviceId) != -1);
+
+ return deviceNames.at(deviceIds.indexOf(defaultAudioDeviceId));
+}
+
QList<QByteArray> QWasapiUtils::availableDevices(QAudio::Mode mode)
{
qCDebug(lcMmUtils) << __FUNCTION__ << mode;
@@ -189,16 +221,6 @@ QList<QByteArray> QWasapiUtils::availableDevices(QAudio::Mode mode)
&statics);
Q_ASSERT_SUCCEEDED(hr);
- ComPtr<IMediaDeviceStatics> mediaDeviceStatics;
- hr = GetActivationFactory(HString::MakeReference(RuntimeClass_Windows_Media_Devices_MediaDevice).Get(), &mediaDeviceStatics);
- Q_ASSERT_SUCCEEDED(hr);
-
- HString defaultAudioRender;
- quint32 dARSize = 0;
- hr = mediaDeviceStatics->GetDefaultAudioRenderId(AudioDeviceRole_Default, defaultAudioRender.GetAddressOf());
- const wchar_t *darWStr = defaultAudioRender.GetRawBuffer(&dARSize);
- const QString defaultAudioDeviceId = QString::fromWCharArray(darWStr, dARSize);
-
DeviceClass dc = mode == QAudio::AudioInput ? DeviceClass_AudioCapture : DeviceClass_AudioRender;
QList<QByteArray> &deviceNames = mode == QAudio::AudioInput ? gMapping->inputDeviceNames : gMapping->outputDeviceNames;
@@ -248,18 +270,6 @@ QList<QByteArray> QWasapiUtils::availableDevices(QAudio::Mode mode)
const wchar_t *idWStr = hString.GetRawBuffer(&size);
const QString deviceId = QString::fromWCharArray(idWStr, size);
- boolean def;
- hr = item->get_IsDefault(&def);
- if (FAILED(hr)) {
- qErrnoWarning(hr, "Could not access audio device default.");
- continue;
- }
-
- // At least on desktop no device is marked as default
- // Hence use the default audio device string from above
- if (!def && !defaultAudioDeviceId.isEmpty())
- def = defaultAudioDeviceId == deviceId;
-
boolean enabled;
hr = item->get_IsEnabled(&enabled);
if (FAILED(hr)) {
@@ -268,14 +278,10 @@ QList<QByteArray> QWasapiUtils::availableDevices(QAudio::Mode mode)
}
qCDebug(lcMmUtils) << "Audio Device:" << deviceName << " ID:" << deviceId
- << " Enabled:" << enabled << " Default:" << def;
- if (def) {
- deviceNames.prepend(deviceName.toLocal8Bit());
- deviceIds.prepend(deviceId);
- } else {
- deviceNames.append(deviceName.toLocal8Bit());
- deviceIds.append(deviceId);
- }
+ << " Enabled:" << enabled;
+
+ deviceNames.append(deviceName.toLocal8Bit());
+ deviceIds.append(deviceId);
}
return deviceNames;
}