diff options
author | Christian Stromme <christian.stromme@theqtcompany.com> | 2016-04-19 14:53:24 +0200 |
---|---|---|
committer | Christian Stromme <christian.stromme@qt.io> | 2016-05-20 10:54:32 +0000 |
commit | 3c5bbb0dac7bed3199ddddc88c0175d5a2ac1036 (patch) | |
tree | 51b9987225bf224637b87c3dd20558a3cca95811 /src/plugins/wasapi | |
parent | 49461f9cffa5439e536a844ec3a0134c252141e6 (diff) |
Improve QAudioDeviceInfo::defaultDevice().
The previous implementation of QAudioDeviceInfo::defaultXDevice() would
always report the first available device as the "default" one, making
the order, in which devices were listed, a hidden requirement when
implementing audio plugins. To make it easier and more reliable to
retrieve the default device, all new plugins should implement the new
QAudioSystemPluginExtension interface as well as the QAudioSystemPlugin.
Devices will be chosen in the following order (first match wins):
default plugin -> default device
-> first available device
plugins -> default device
-> first available device
Task-number: QTBUG-51292
Change-Id: I8ace78858976fe7c60a2c4a117ef15c4e1bb177f
Reviewed-by: Yoann Lopes <yoann.lopes@qt.io>
Diffstat (limited to 'src/plugins/wasapi')
-rw-r--r-- | src/plugins/wasapi/qwasapiplugin.cpp | 5 | ||||
-rw-r--r-- | src/plugins/wasapi/qwasapiplugin.h | 7 | ||||
-rw-r--r-- | src/plugins/wasapi/qwasapiutils.cpp | 57 | ||||
-rw-r--r-- | src/plugins/wasapi/qwasapiutils.h | 1 |
4 files changed, 38 insertions, 32 deletions
diff --git a/src/plugins/wasapi/qwasapiplugin.cpp b/src/plugins/wasapi/qwasapiplugin.cpp index 7b64a101d..39660b9c1 100644 --- a/src/plugins/wasapi/qwasapiplugin.cpp +++ b/src/plugins/wasapi/qwasapiplugin.cpp @@ -50,6 +50,11 @@ QWasapiPlugin::QWasapiPlugin(QObject *parent) qCDebug(lcMmPlugin) << __FUNCTION__; } +QByteArray QWasapiPlugin::defaultDevice(QAudio::Mode mode) const +{ + return QWasapiUtils::defaultDevice(mode); +} + QList<QByteArray> QWasapiPlugin::availableDevices(QAudio::Mode mode) const { qCDebug(lcMmPlugin) << __FUNCTION__ << mode; diff --git a/src/plugins/wasapi/qwasapiplugin.h b/src/plugins/wasapi/qwasapiplugin.h index 18c2e9575..697e9bd78 100644 --- a/src/plugins/wasapi/qwasapiplugin.h +++ b/src/plugins/wasapi/qwasapiplugin.h @@ -39,22 +39,25 @@ #include <QtCore/QLoggingCategory> #include <QtCore/QList> -#include <QtMultimedia/QAudioSystemPlugin> +#include <QtMultimedia/qaudiosystemplugin.h> +#include <QtMultimedia/private/qaudiosystempluginext_p.h> QT_BEGIN_NAMESPACE Q_DECLARE_LOGGING_CATEGORY(lcMmPlugin) -class QWasapiPlugin : public QAudioSystemPlugin +class QWasapiPlugin : public QAudioSystemPlugin, public QAudioSystemPluginExtension { Q_OBJECT Q_PLUGIN_METADATA(IID "org.qt-project.qt.audiosystemfactory/5.0" FILE "wasapi.json") + Q_INTERFACES(QAudioSystemPluginExtension) public: explicit QWasapiPlugin(QObject *parent = 0); ~QWasapiPlugin() {} + QByteArray defaultDevice(QAudio::Mode mode) const Q_DECL_OVERRIDE; QList<QByteArray> availableDevices(QAudio::Mode mode) const Q_DECL_OVERRIDE; QAbstractAudioInput *createInput(const QByteArray &device) Q_DECL_OVERRIDE; QAbstractAudioOutput *createOutput(const QByteArray &device) Q_DECL_OVERRIDE; diff --git a/src/plugins/wasapi/qwasapiutils.cpp b/src/plugins/wasapi/qwasapiutils.cpp index 87daa4e45..0e39ee32b 100644 --- a/src/plugins/wasapi/qwasapiutils.cpp +++ b/src/plugins/wasapi/qwasapiutils.cpp @@ -175,6 +175,29 @@ bool QWasapiUtils::convertFromNativeFormat(const WAVEFORMATEX *native, QAudioFor return true; } +QByteArray QWasapiUtils::defaultDevice(QAudio::Mode mode) +{ + qCDebug(lcMmUtils) << __FUNCTION__ << mode; + + 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); + return defaultAudioDeviceId.toLocal8Bit(); +} + QList<QByteArray> QWasapiUtils::availableDevices(QAudio::Mode mode) { qCDebug(lcMmUtils) << __FUNCTION__ << mode; @@ -186,16 +209,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; @@ -245,18 +258,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)) { @@ -265,14 +266,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; } diff --git a/src/plugins/wasapi/qwasapiutils.h b/src/plugins/wasapi/qwasapiutils.h index 21eff3583..3dda0e1a5 100644 --- a/src/plugins/wasapi/qwasapiutils.h +++ b/src/plugins/wasapi/qwasapiutils.h @@ -134,6 +134,7 @@ namespace QWasapiUtils bool convertToNativeFormat(const QAudioFormat &qt, WAVEFORMATEX *native); bool convertFromNativeFormat(const WAVEFORMATEX *native, QAudioFormat *qt); + QByteArray defaultDevice(QAudio::Mode mode); QList<QByteArray> availableDevices(QAudio::Mode mode); Microsoft::WRL::ComPtr<AudioInterface> createOrGetInterface(const QByteArray &dev, QAudio::Mode mode); } |