summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/multimedia/audio/audio.pri3
-rw-r--r--src/multimedia/audio/qaudiodevicefactory.cpp73
-rw-r--r--src/multimedia/audio/qaudiodevicefactory_p.h3
-rw-r--r--src/multimedia/audio/qaudiodeviceinfo.cpp4
-rw-r--r--src/multimedia/audio/qaudiosystemplugin.cpp5
-rw-r--r--src/multimedia/audio/qaudiosystempluginext_p.h71
-rw-r--r--src/plugins/alsa/qalsaaudiodeviceinfo.cpp27
-rw-r--r--src/plugins/alsa/qalsaaudiodeviceinfo.h3
-rw-r--r--src/plugins/alsa/qalsaplugin.cpp5
-rw-r--r--src/plugins/alsa/qalsaplugin.h5
-rw-r--r--src/plugins/coreaudio/coreaudiodeviceinfo.h4
-rw-r--r--src/plugins/coreaudio/coreaudiodeviceinfo.mm53
-rw-r--r--src/plugins/coreaudio/coreaudioplugin.h7
-rw-r--r--src/plugins/coreaudio/coreaudioplugin.mm4
-rw-r--r--src/plugins/opensles/qopenslesengine.cpp6
-rw-r--r--src/plugins/opensles/qopenslesengine.h1
-rw-r--r--src/plugins/opensles/qopenslesplugin.cpp5
-rw-r--r--src/plugins/opensles/qopenslesplugin.h7
-rw-r--r--src/plugins/pulseaudio/qpulseaudioengine.cpp13
-rw-r--r--src/plugins/pulseaudio/qpulseaudioengine.h3
-rw-r--r--src/plugins/pulseaudio/qpulseaudioplugin.cpp5
-rw-r--r--src/plugins/pulseaudio/qpulseaudioplugin.h7
-rw-r--r--src/plugins/qnx-audio/audio/qnxaudioplugin.cpp5
-rw-r--r--src/plugins/qnx-audio/audio/qnxaudioplugin.h7
-rw-r--r--src/plugins/wasapi/qwasapiplugin.cpp5
-rw-r--r--src/plugins/wasapi/qwasapiplugin.h7
-rw-r--r--src/plugins/wasapi/qwasapiutils.cpp57
-rw-r--r--src/plugins/wasapi/qwasapiutils.h1
-rw-r--r--src/plugins/windowsaudio/qwindowsaudiodeviceinfo.cpp16
-rw-r--r--src/plugins/windowsaudio/qwindowsaudiodeviceinfo.h3
-rw-r--r--src/plugins/windowsaudio/qwindowsaudioplugin.cpp5
-rw-r--r--src/plugins/windowsaudio/qwindowsaudioplugin.h5
32 files changed, 264 insertions, 161 deletions
diff --git a/src/multimedia/audio/audio.pri b/src/multimedia/audio/audio.pri
index 96cfb1ce4..4706fd23e 100644
--- a/src/multimedia/audio/audio.pri
+++ b/src/multimedia/audio/audio.pri
@@ -19,7 +19,8 @@ PRIVATE_HEADERS += \
audio/qaudiodevicefactory_p.h \
audio/qwavedecoder_p.h \
audio/qsamplecache_p.h \
- audio/qaudiohelpers_p.h
+ audio/qaudiohelpers_p.h \
+ audio/qaudiosystempluginext_p.h
SOURCES += \
audio/qaudio.cpp \
diff --git a/src/multimedia/audio/qaudiodevicefactory.cpp b/src/multimedia/audio/qaudiodevicefactory.cpp
index 83e1a6c0b..c3e4929b3 100644
--- a/src/multimedia/audio/qaudiodevicefactory.cpp
+++ b/src/multimedia/audio/qaudiodevicefactory.cpp
@@ -41,6 +41,7 @@
#include "qaudiosystem.h"
#include "qaudiosystemplugin.h"
+#include "qaudiosystempluginext_p.h"
#include "qmediapluginloader_p.h"
#include "qaudiodevicefactory_p.h"
@@ -139,41 +140,53 @@ QList<QAudioDeviceInfo> QAudioDeviceFactory::availableDevices(QAudio::Mode mode)
return devices;
}
-QAudioDeviceInfo QAudioDeviceFactory::defaultInputDevice()
+QAudioDeviceInfo QAudioDeviceFactory::defaultDevice(QAudio::Mode mode)
{
#if !defined (QT_NO_LIBRARY) && !defined(QT_NO_SETTINGS)
- QAudioSystemFactoryInterface* plugin = qobject_cast<QAudioSystemFactoryInterface*>(audioLoader()->instance(defaultKey()));
- if (plugin) {
- QList<QByteArray> list = plugin->availableDevices(QAudio::AudioInput);
- if (list.size() > 0)
- return QAudioDeviceInfo(defaultKey(), list.at(0), QAudio::AudioInput);
- }
+ QMediaPluginLoader* l = audioLoader();
- // if no plugin is marked as default or if the default plugin doesn't have any input device,
- // return the first input available from other plugins.
- QList<QAudioDeviceInfo> inputDevices = availableDevices(QAudio::AudioInput);
- if (!inputDevices.isEmpty())
- return inputDevices.first();
-#endif
+ // Check if there is a default plugin.
+ QAudioSystemFactoryInterface *plugin = qobject_cast<QAudioSystemFactoryInterface *>(l->instance(defaultKey()));
+ if (plugin) {
+ // Check if the plugin has the extension interface.
+ QAudioSystemPluginExtension *pluginExt = qobject_cast<QAudioSystemPluginExtension *>(l->instance(defaultKey()));
+ // Ask for the default device.
+ if (pluginExt) {
+ const QByteArray &device = pluginExt->defaultDevice(mode);
+ if (!device.isEmpty())
+ return QAudioDeviceInfo(defaultKey(), device, mode);
+ }
- return QAudioDeviceInfo();
-}
+ // If there were no default devices, e.g., if the plugin did not implement the extent-ion interface,
+ // then just pick the first device that's available.
+ const auto &devices = plugin->availableDevices(mode);
+ if (!devices.isEmpty())
+ return QAudioDeviceInfo(defaultKey(), devices.first(), mode);
+ }
-QAudioDeviceInfo QAudioDeviceFactory::defaultOutputDevice()
-{
-#if !defined (QT_NO_LIBRARY) && !defined(QT_NO_SETTINGS)
- QAudioSystemFactoryInterface* plugin = qobject_cast<QAudioSystemFactoryInterface*>(audioLoader()->instance(defaultKey()));
- if (plugin) {
- QList<QByteArray> list = plugin->availableDevices(QAudio::AudioOutput);
- if (list.size() > 0)
- return QAudioDeviceInfo(defaultKey(), list.at(0), QAudio::AudioOutput);
+ // If no plugin is marked as default, check the other plugins.
+ // Note: We're going to prioritize plugins that report a default device.
+ const auto &keys = l->keys();
+ QAudioDeviceInfo fallbackDevice;
+ for (const auto &key : keys) {
+ if (key == defaultKey())
+ continue;
+ QAudioSystemFactoryInterface* plugin = qobject_cast<QAudioSystemFactoryInterface*>(l->instance(key));
+ if (plugin) {
+ // Check if the plugin has the extent-ion interface.
+ QAudioSystemPluginExtension *pluginExt = qobject_cast<QAudioSystemPluginExtension *>(l->instance(key));
+ if (pluginExt) {
+ const QByteArray &device = pluginExt->defaultDevice(mode);
+ if (!device.isEmpty())
+ return QAudioDeviceInfo(key, device, mode);
+ } else if (fallbackDevice.isNull()) {
+ const auto &devices = plugin->availableDevices(mode);
+ if (!devices.isEmpty())
+ fallbackDevice = QAudioDeviceInfo(key, devices.first(), mode);
+ }
+ }
}
- // if no plugin is marked as default or if the default plugin doesn't have any output device,
- // return the first output available from other plugins.
- QList<QAudioDeviceInfo> outputDevices = availableDevices(QAudio::AudioOutput);
- if (!outputDevices.isEmpty())
- return outputDevices.first();
#endif
return QAudioDeviceInfo();
@@ -196,12 +209,12 @@ QAbstractAudioDeviceInfo* QAudioDeviceFactory::audioDeviceInfo(const QString &re
QAbstractAudioInput* QAudioDeviceFactory::createDefaultInputDevice(QAudioFormat const &format)
{
- return createInputDevice(defaultInputDevice(), format);
+ return createInputDevice(defaultDevice(QAudio::AudioInput), format);
}
QAbstractAudioOutput* QAudioDeviceFactory::createDefaultOutputDevice(QAudioFormat const &format)
{
- return createOutputDevice(defaultOutputDevice(), format);
+ return createOutputDevice(defaultDevice(QAudio::AudioOutput), format);
}
QAbstractAudioInput* QAudioDeviceFactory::createInputDevice(QAudioDeviceInfo const& deviceInfo, QAudioFormat const &format)
diff --git a/src/multimedia/audio/qaudiodevicefactory_p.h b/src/multimedia/audio/qaudiodevicefactory_p.h
index 833184075..7ad5e4e78 100644
--- a/src/multimedia/audio/qaudiodevicefactory_p.h
+++ b/src/multimedia/audio/qaudiodevicefactory_p.h
@@ -71,8 +71,7 @@ class QAudioDeviceFactory
public:
static QList<QAudioDeviceInfo> availableDevices(QAudio::Mode mode);
- static QAudioDeviceInfo defaultInputDevice();
- static QAudioDeviceInfo defaultOutputDevice();
+ static QAudioDeviceInfo defaultDevice(QAudio::Mode mode);
static QAbstractAudioDeviceInfo* audioDeviceInfo(const QString &realm, const QByteArray &handle, QAudio::Mode mode);
diff --git a/src/multimedia/audio/qaudiodeviceinfo.cpp b/src/multimedia/audio/qaudiodeviceinfo.cpp
index 945b415e8..f4f548017 100644
--- a/src/multimedia/audio/qaudiodeviceinfo.cpp
+++ b/src/multimedia/audio/qaudiodeviceinfo.cpp
@@ -419,7 +419,7 @@ QList<QAudioFormat::SampleType> QAudioDeviceInfo::supportedSampleTypes() const
*/
QAudioDeviceInfo QAudioDeviceInfo::defaultInputDevice()
{
- return QAudioDeviceFactory::defaultInputDevice();
+ return QAudioDeviceFactory::defaultDevice(QAudio::AudioInput);
}
/*!
@@ -428,7 +428,7 @@ QAudioDeviceInfo QAudioDeviceInfo::defaultInputDevice()
*/
QAudioDeviceInfo QAudioDeviceInfo::defaultOutputDevice()
{
- return QAudioDeviceFactory::defaultOutputDevice();
+ return QAudioDeviceFactory::defaultDevice(QAudio::AudioOutput);
}
/*!
diff --git a/src/multimedia/audio/qaudiosystemplugin.cpp b/src/multimedia/audio/qaudiosystemplugin.cpp
index b4fc0dbca..018392939 100644
--- a/src/multimedia/audio/qaudiosystemplugin.cpp
+++ b/src/multimedia/audio/qaudiosystemplugin.cpp
@@ -39,6 +39,7 @@
#include "qaudiosystemplugin.h"
+#include "qaudiosystempluginext_p.h"
QT_BEGIN_NAMESPACE
@@ -46,6 +47,10 @@ QAudioSystemFactoryInterface::~QAudioSystemFactoryInterface()
{
}
+QAudioSystemPluginExtension::~QAudioSystemPluginExtension()
+{
+}
+
/*!
\class QAudioSystemPlugin
\brief The QAudioSystemPlugin class provides an abstract base for audio plugins.
diff --git a/src/multimedia/audio/qaudiosystempluginext_p.h b/src/multimedia/audio/qaudiosystempluginext_p.h
new file mode 100644
index 000000000..380bc5afa
--- /dev/null
+++ b/src/multimedia/audio/qaudiosystempluginext_p.h
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QAUDIOSYSTEMPLUGINEXT_P_H
+#define QAUDIOSYSTEMPLUGINEXT_P_H
+
+#include <QtMultimedia/qtmultimediadefs.h>
+#include <QtMultimedia/qaudio.h>
+#include <QtCore/qplugin.h>
+
+QT_BEGIN_NAMESPACE
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+struct Q_MULTIMEDIA_EXPORT QAudioSystemPluginExtension
+{
+ virtual QByteArray defaultDevice(QAudio::Mode) const = 0;
+ virtual ~QAudioSystemPluginExtension();
+};
+
+#define QAudioSystemPluginExtension_iid "org.qt-project.qt.audiosystempluginextension"
+Q_DECLARE_INTERFACE(QAudioSystemPluginExtension, QAudioSystemPluginExtension_iid)
+
+QT_END_NAMESPACE
+
+#endif // QAUDIOSYSTEMPLUGINEXT_P_H
diff --git a/src/plugins/alsa/qalsaaudiodeviceinfo.cpp b/src/plugins/alsa/qalsaaudiodeviceinfo.cpp
index 0342ca546..d0f772d5e 100644
--- a/src/plugins/alsa/qalsaaudiodeviceinfo.cpp
+++ b/src/plugins/alsa/qalsaaudiodeviceinfo.cpp
@@ -140,6 +140,15 @@ QList<QAudioFormat::SampleType> QAlsaAudioDeviceInfo::supportedSampleTypes()
return typez;
}
+QByteArray QAlsaAudioDeviceInfo::defaultDevice(QAudio::Mode mode)
+{
+ const auto &devices = availableDevices(mode);
+ if (devices.size() == 0)
+ return QByteArray();
+
+ return devices.first();
+}
+
bool QAlsaAudioDeviceInfo::open()
{
int err = 0;
@@ -396,24 +405,6 @@ QList<QByteArray> QAlsaAudioDeviceInfo::availableDevices(QAudio::Mode mode)
return devices;
}
-QByteArray QAlsaAudioDeviceInfo::defaultInputDevice()
-{
- QList<QByteArray> devices = availableDevices(QAudio::AudioInput);
- if(devices.size() == 0)
- return QByteArray();
-
- return devices.first();
-}
-
-QByteArray QAlsaAudioDeviceInfo::defaultOutputDevice()
-{
- QList<QByteArray> devices = availableDevices(QAudio::AudioOutput);
- if(devices.size() == 0)
- return QByteArray();
-
- return devices.first();
-}
-
void QAlsaAudioDeviceInfo::checkSurround()
{
surround40 = false;
diff --git a/src/plugins/alsa/qalsaaudiodeviceinfo.h b/src/plugins/alsa/qalsaaudiodeviceinfo.h
index 0147a2cf9..3b14bd489 100644
--- a/src/plugins/alsa/qalsaaudiodeviceinfo.h
+++ b/src/plugins/alsa/qalsaaudiodeviceinfo.h
@@ -88,8 +88,7 @@ public:
QList<int> supportedSampleSizes();
QList<QAudioFormat::Endian> supportedByteOrders();
QList<QAudioFormat::SampleType> supportedSampleTypes();
- static QByteArray defaultInputDevice();
- static QByteArray defaultOutputDevice();
+ static QByteArray defaultDevice(QAudio::Mode mode);
static QList<QByteArray> availableDevices(QAudio::Mode);
private:
diff --git a/src/plugins/alsa/qalsaplugin.cpp b/src/plugins/alsa/qalsaplugin.cpp
index 79adbae59..e52e9ee83 100644
--- a/src/plugins/alsa/qalsaplugin.cpp
+++ b/src/plugins/alsa/qalsaplugin.cpp
@@ -49,6 +49,11 @@ QAlsaPlugin::QAlsaPlugin(QObject *parent)
{
}
+QByteArray QAlsaPlugin::defaultDevice(QAudio::Mode mode) const
+{
+ return QAlsaAudioDeviceInfo::defaultDevice(mode);
+}
+
QList<QByteArray> QAlsaPlugin::availableDevices(QAudio::Mode mode) const
{
return QAlsaAudioDeviceInfo::availableDevices(mode);
diff --git a/src/plugins/alsa/qalsaplugin.h b/src/plugins/alsa/qalsaplugin.h
index 74e3475b7..b3c530f88 100644
--- a/src/plugins/alsa/qalsaplugin.h
+++ b/src/plugins/alsa/qalsaplugin.h
@@ -41,19 +41,22 @@
#define QALSAPLUGIN_H
#include <QtMultimedia/qaudiosystemplugin.h>
+#include <QtMultimedia/private/qaudiosystempluginext_p.h>
QT_BEGIN_NAMESPACE
-class QAlsaPlugin : public QAudioSystemPlugin
+class QAlsaPlugin : public QAudioSystemPlugin, public QAudioSystemPluginExtension
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qt-project.qt.audiosystemfactory/5.0" FILE "alsa.json")
+ Q_INTERFACES(QAudioSystemPluginExtension)
public:
QAlsaPlugin(QObject *parent = 0);
~QAlsaPlugin() {}
+ 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/coreaudio/coreaudiodeviceinfo.h b/src/plugins/coreaudio/coreaudiodeviceinfo.h
index fc8999850..08c3961e6 100644
--- a/src/plugins/coreaudio/coreaudiodeviceinfo.h
+++ b/src/plugins/coreaudio/coreaudiodeviceinfo.h
@@ -65,9 +65,7 @@ public:
QList<QAudioFormat::Endian> supportedByteOrders();
QList<QAudioFormat::SampleType> supportedSampleTypes();
- static QByteArray defaultInputDevice();
- static QByteArray defaultOutputDevice();
-
+ static QByteArray defaultDevice(QAudio::Mode mode);
static QList<QByteArray> availableDevices(QAudio::Mode mode);
private:
diff --git a/src/plugins/coreaudio/coreaudiodeviceinfo.mm b/src/plugins/coreaudio/coreaudiodeviceinfo.mm
index 66e8ed4d7..1a79438cb 100644
--- a/src/plugins/coreaudio/coreaudiodeviceinfo.mm
+++ b/src/plugins/coreaudio/coreaudiodeviceinfo.mm
@@ -280,47 +280,29 @@ static QByteArray get_device_info(AudioDeviceID audioDevice, QAudio::Mode mode)
}
#endif
-QByteArray CoreAudioDeviceInfo::defaultInputDevice()
+QByteArray CoreAudioDeviceInfo::defaultDevice(QAudio::Mode mode)
{
#if defined(Q_OS_OSX)
AudioDeviceID audioDevice;
UInt32 size = sizeof(audioDevice);
- AudioObjectPropertyAddress defaultInputDevicePropertyAddress = { kAudioHardwarePropertyDefaultInputDevice,
- kAudioObjectPropertyScopeGlobal,
- kAudioObjectPropertyElementMaster };
-
- if (AudioObjectGetPropertyData(kAudioObjectSystemObject,
- &defaultInputDevicePropertyAddress,
- 0, NULL, &size, &audioDevice) != noErr) {
- qWarning() << "QAudioDeviceInfo: Unable to find default input device";
- return QByteArray();
- }
-
- return get_device_info(audioDevice, QAudio::AudioInput);
-#else //iOS
- return CoreAudioSessionManager::instance().inputDevices().first();
-#endif
-}
-
-QByteArray CoreAudioDeviceInfo::defaultOutputDevice()
-{
-#if defined(Q_OS_OSX)
- AudioDeviceID audioDevice;
- UInt32 size = sizeof(audioDevice);
- AudioObjectPropertyAddress defaultOutputDevicePropertyAddress = { kAudioHardwarePropertyDefaultOutputDevice,
- kAudioObjectPropertyScopeGlobal,
- kAudioObjectPropertyElementMaster };
+ const AudioObjectPropertySelector selector = (mode == QAudio::AudioOutput) ? kAudioHardwarePropertyDefaultOutputDevice
+ : kAudioHardwarePropertyDefaultInputDevice;
+ AudioObjectPropertyAddress defaultDevicePropertyAddress = { selector,
+ kAudioObjectPropertyScopeGlobal,
+ kAudioObjectPropertyElementMaster };
if (AudioObjectGetPropertyData(kAudioObjectSystemObject,
- &defaultOutputDevicePropertyAddress,
+ &defaultDevicePropertyAddress,
0, NULL, &size, &audioDevice) != noErr) {
- qWarning() << "QAudioDeviceInfo: Unable to find default output device";
+ qWarning("QAudioDeviceInfo: Unable to find default %s device", (mode == QAudio::AudioOutput) ? "output" : "input");
return QByteArray();
}
- return get_device_info(audioDevice, QAudio::AudioOutput);
+ return get_device_info(audioDevice, mode);
#else //iOS
- return CoreAudioSessionManager::instance().outputDevices().first();
+ const auto &devices = (mode == QAudio::AudioOutput) ? CoreAudioSessionManager::instance().outputDevices()
+ : CoreAudioSessionManager::instance().inputDevices();
+ return !devices.isEmpty() ? devices.first() : QByteArray();
#endif
}
@@ -343,15 +325,10 @@ QList<QByteArray> CoreAudioDeviceInfo::availableDevices(QAudio::Mode mode)
AudioDeviceID* audioDevices = new AudioDeviceID[dc];
if (AudioObjectGetPropertyData(kAudioObjectSystemObject, &audioDevicesPropertyAddress, 0, NULL, &propSize, audioDevices) == noErr) {
- QByteArray defaultDevice = (mode == QAudio::AudioOutput) ? defaultOutputDevice() : defaultInputDevice();
for (int i = 0; i < dc; ++i) {
- QByteArray info = get_device_info(audioDevices[i], mode);
- if (!info.isNull()) {
- if (info == defaultDevice)
- devices.prepend(info);
- else
- devices << info;
- }
+ const QByteArray &info = get_device_info(audioDevices[i], mode);
+ if (!info.isNull())
+ devices << info;
}
}
diff --git a/src/plugins/coreaudio/coreaudioplugin.h b/src/plugins/coreaudio/coreaudioplugin.h
index 5868508d2..da18d8cfe 100644
--- a/src/plugins/coreaudio/coreaudioplugin.h
+++ b/src/plugins/coreaudio/coreaudioplugin.h
@@ -39,19 +39,22 @@
#ifndef IOSAUDIOPLUGIN_H
#define IOSAUDIOPLUGIN_H
-#include <qaudiosystemplugin.h>
+#include <QtMultimedia/qaudiosystemplugin.h>
+#include <QtMultimedia/private/qaudiosystempluginext_p.h>
QT_BEGIN_NAMESPACE
-class CoreAudioPlugin : public QAudioSystemPlugin
+class CoreAudioPlugin : public QAudioSystemPlugin, public QAudioSystemPluginExtension
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qt-project.qt.audiosystemfactory/5.0" FILE "coreaudio.json")
+ Q_INTERFACES(QAudioSystemPluginExtension)
public:
explicit CoreAudioPlugin(QObject *parent = 0);
~CoreAudioPlugin() {}
+ 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/coreaudio/coreaudioplugin.mm b/src/plugins/coreaudio/coreaudioplugin.mm
index 6d899fb67..ac51b9cd0 100644
--- a/src/plugins/coreaudio/coreaudioplugin.mm
+++ b/src/plugins/coreaudio/coreaudioplugin.mm
@@ -49,6 +49,10 @@ CoreAudioPlugin::CoreAudioPlugin(QObject *parent)
{
}
+QByteArray CoreAudioPlugin::defaultDevice(QAudio::Mode mode) const
+{
+ return CoreAudioDeviceInfo::defaultDevice(mode);
+}
QList<QByteArray> CoreAudioPlugin::availableDevices(QAudio::Mode mode) const
{
diff --git a/src/plugins/opensles/qopenslesengine.cpp b/src/plugins/opensles/qopenslesengine.cpp
index 0cbd10887..1a16cc2a3 100644
--- a/src/plugins/opensles/qopenslesengine.cpp
+++ b/src/plugins/opensles/qopenslesengine.cpp
@@ -101,6 +101,12 @@ SLDataFormat_PCM QOpenSLESEngine::audioFormatToSLFormatPCM(const QAudioFormat &f
}
+QByteArray QOpenSLESEngine::defaultDevice(QAudio::Mode mode) const
+{
+ const auto &devices = availableDevices(mode);
+ return !devices.isEmpty() ? devices.first() : QByteArray();
+}
+
QList<QByteArray> QOpenSLESEngine::availableDevices(QAudio::Mode mode) const
{
QList<QByteArray> devices;
diff --git a/src/plugins/opensles/qopenslesengine.h b/src/plugins/opensles/qopenslesengine.h
index 364b3ef60..c36b21488 100644
--- a/src/plugins/opensles/qopenslesengine.h
+++ b/src/plugins/opensles/qopenslesengine.h
@@ -62,6 +62,7 @@ public:
static SLDataFormat_PCM audioFormatToSLFormatPCM(const QAudioFormat &format);
+ QByteArray defaultDevice(QAudio::Mode mode) const;
QList<QByteArray> availableDevices(QAudio::Mode mode) const;
QList<int> supportedChannelCounts(QAudio::Mode mode) const;
QList<int> supportedSampleRates(QAudio::Mode mode) const;
diff --git a/src/plugins/opensles/qopenslesplugin.cpp b/src/plugins/opensles/qopenslesplugin.cpp
index 8f89d044d..9a2fbbf79 100644
--- a/src/plugins/opensles/qopenslesplugin.cpp
+++ b/src/plugins/opensles/qopenslesplugin.cpp
@@ -52,6 +52,11 @@ QOpenSLESPlugin::QOpenSLESPlugin(QObject *parent)
{
}
+QByteArray QOpenSLESPlugin::defaultDevice(QAudio::Mode mode) const
+{
+ return m_engine->defaultDevice(mode);
+}
+
QList<QByteArray> QOpenSLESPlugin::availableDevices(QAudio::Mode mode) const
{
return m_engine->availableDevices(mode);
diff --git a/src/plugins/opensles/qopenslesplugin.h b/src/plugins/opensles/qopenslesplugin.h
index 2a967b27e..d45a47923 100644
--- a/src/plugins/opensles/qopenslesplugin.h
+++ b/src/plugins/opensles/qopenslesplugin.h
@@ -40,22 +40,25 @@
#ifndef QOPENSLESPLUGIN_H
#define QOPENSLESPLUGIN_H
-#include <qaudiosystemplugin.h>
+#include <QtMultimedia/qaudiosystemplugin.h>
+#include <QtMultimedia/private/qaudiosystempluginext_p.h>
QT_BEGIN_NAMESPACE
class QOpenSLESEngine;
-class QOpenSLESPlugin : public QAudioSystemPlugin
+class QOpenSLESPlugin : public QAudioSystemPlugin, public QAudioSystemPluginExtension
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qt-project.qt.audiosystemfactory/5.0" FILE "opensles.json")
+ Q_INTERFACES(QAudioSystemPluginExtension)
public:
QOpenSLESPlugin(QObject *parent = 0);
~QOpenSLESPlugin() {}
+ QByteArray defaultDevice(QAudio::Mode mode) const;
QList<QByteArray> availableDevices(QAudio::Mode mode) const;
QAbstractAudioInput *createInput(const QByteArray &device);
QAbstractAudioOutput *createOutput(const QByteArray &device);
diff --git a/src/plugins/pulseaudio/qpulseaudioengine.cpp b/src/plugins/pulseaudio/qpulseaudioengine.cpp
index 19ba7472f..eb8e2bf9d 100644
--- a/src/plugins/pulseaudio/qpulseaudioengine.cpp
+++ b/src/plugins/pulseaudio/qpulseaudioengine.cpp
@@ -338,14 +338,6 @@ void QPulseAudioEngine::updateDevices()
pa_operation_unref(operation);
unlock();
-
- // Swap the default output to index 0
- m_sinks.removeOne(m_defaultSink);
- m_sinks.prepend(m_defaultSink);
-
- // Swap the default input to index 0
- m_sources.removeOne(m_defaultSource);
- m_sources.prepend(m_defaultSource);
}
void QPulseAudioEngine::onContextFailed()
@@ -369,4 +361,9 @@ QList<QByteArray> QPulseAudioEngine::availableDevices(QAudio::Mode mode) const
return mode == QAudio::AudioOutput ? m_sinks : m_sources;
}
+QByteArray QPulseAudioEngine::defaultDevice(QAudio::Mode mode) const
+{
+ return (mode == QAudio::AudioOutput) ? m_defaultSink : m_defaultSource;
+}
+
QT_END_NAMESPACE
diff --git a/src/plugins/pulseaudio/qpulseaudioengine.h b/src/plugins/pulseaudio/qpulseaudioengine.h
index 5eb96bf00..912df5242 100644
--- a/src/plugins/pulseaudio/qpulseaudioengine.h
+++ b/src/plugins/pulseaudio/qpulseaudioengine.h
@@ -53,7 +53,7 @@
#include <QtCore/qmap.h>
#include <QtCore/qbytearray.h>
-#include <qaudiosystemplugin.h>
+#include <QtMultimedia/qaudiosystemplugin.h>
#include <pulse/pulseaudio.h>
#include "qpulsehelpers.h"
#include <qaudioformat.h>
@@ -91,6 +91,7 @@ public:
}
QList<QByteArray> availableDevices(QAudio::Mode mode) const;
+ QByteArray defaultDevice(QAudio::Mode mode) const;
Q_SIGNALS:
void contextFailed();
diff --git a/src/plugins/pulseaudio/qpulseaudioplugin.cpp b/src/plugins/pulseaudio/qpulseaudioplugin.cpp
index 2b7b22089..6b3019279 100644
--- a/src/plugins/pulseaudio/qpulseaudioplugin.cpp
+++ b/src/plugins/pulseaudio/qpulseaudioplugin.cpp
@@ -53,6 +53,11 @@ QPulseAudioPlugin::QPulseAudioPlugin(QObject *parent)
{
}
+QByteArray QPulseAudioPlugin::defaultDevice(QAudio::Mode mode) const
+{
+ return m_pulseEngine->defaultDevice(mode);
+}
+
QList<QByteArray> QPulseAudioPlugin::availableDevices(QAudio::Mode mode) const
{
return m_pulseEngine->availableDevices(mode);
diff --git a/src/plugins/pulseaudio/qpulseaudioplugin.h b/src/plugins/pulseaudio/qpulseaudioplugin.h
index 4bad509e9..120d57df5 100644
--- a/src/plugins/pulseaudio/qpulseaudioplugin.h
+++ b/src/plugins/pulseaudio/qpulseaudioplugin.h
@@ -40,22 +40,25 @@
#ifndef QPULSEAUDIOPLUGIN_H
#define QPULSEAUDIOPLUGIN_H
-#include <qaudiosystemplugin.h>
+#include <QtMultimedia/qaudiosystemplugin.h>
+#include <QtMultimedia/private/qaudiosystempluginext_p.h>
QT_BEGIN_NAMESPACE
class QPulseAudioEngine;
-class QPulseAudioPlugin : public QAudioSystemPlugin
+class QPulseAudioPlugin : public QAudioSystemPlugin, public QAudioSystemPluginExtension
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qt-project.qt.audiosystemfactory/5.0" FILE "pulseaudio.json")
+ Q_INTERFACES(QAudioSystemPluginExtension)
public:
QPulseAudioPlugin(QObject *parent = 0);
~QPulseAudioPlugin() {}
+ QByteArray defaultDevice(QAudio::Mode mode) const;
QList<QByteArray> availableDevices(QAudio::Mode mode) const;
QAbstractAudioInput *createInput(const QByteArray &device);
QAbstractAudioOutput *createOutput(const QByteArray &device);
diff --git a/src/plugins/qnx-audio/audio/qnxaudioplugin.cpp b/src/plugins/qnx-audio/audio/qnxaudioplugin.cpp
index a3793fc3c..5d26c8954 100644
--- a/src/plugins/qnx-audio/audio/qnxaudioplugin.cpp
+++ b/src/plugins/qnx-audio/audio/qnxaudioplugin.cpp
@@ -55,6 +55,11 @@ QnxAudioPlugin::QnxAudioPlugin(QObject *parent)
{
}
+QByteArray QnxAudioPlugin::defaultDevice(QAudio::Mode mode) const
+{
+ return (mode == QAudio::AudioOutput) ? OUTPUT_ID : INPUT_ID;
+}
+
QList<QByteArray> QnxAudioPlugin::availableDevices(QAudio::Mode mode) const
{
if (mode == QAudio::AudioOutput)
diff --git a/src/plugins/qnx-audio/audio/qnxaudioplugin.h b/src/plugins/qnx-audio/audio/qnxaudioplugin.h
index 5e2410619..1d8b8a74b 100644
--- a/src/plugins/qnx-audio/audio/qnxaudioplugin.h
+++ b/src/plugins/qnx-audio/audio/qnxaudioplugin.h
@@ -40,19 +40,22 @@
#ifndef QNXAUDIOPLUGIN_H
#define QNXAUDIOPLUGIN_H
-#include <qaudiosystemplugin.h>
+#include <QtMultimedia/qaudiosystemplugin.h>
+#include <QtMultimedia/private/qaudiosystempluginext_p.h>
QT_BEGIN_NAMESPACE
-class QnxAudioPlugin : public QAudioSystemPlugin
+class QnxAudioPlugin : public QAudioSystemPlugin, public QAudioSystemPluginExtension
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qt-project.qt.audiosystemfactory/5.0" FILE "qnx_audio.json")
+ Q_INTERFACES(QAudioSystemPluginExtension)
public:
explicit QnxAudioPlugin(QObject *parent = 0);
~QnxAudioPlugin() {}
+ 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/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);
}
diff --git a/src/plugins/windowsaudio/qwindowsaudiodeviceinfo.cpp b/src/plugins/windowsaudio/qwindowsaudiodeviceinfo.cpp
index ca79ebbec..83e9ccfc8 100644
--- a/src/plugins/windowsaudio/qwindowsaudiodeviceinfo.cpp
+++ b/src/plugins/windowsaudio/qwindowsaudiodeviceinfo.cpp
@@ -457,22 +457,14 @@ QList<QByteArray> QWindowsAudioDeviceInfo::availableDevices(QAudio::Mode mode)
return devices;
}
-QByteArray QWindowsAudioDeviceInfo::defaultOutputDevice()
+QByteArray QWindowsAudioDeviceInfo::defaultDevice(QAudio::Mode mode)
{
+ const QString &name = (mode == QAudio::AudioOutput) ? QStringLiteral("Default Output Device")
+ : QStringLiteral("Default Input Device");
QByteArray defaultDevice;
QDataStream ds(&defaultDevice, QIODevice::WriteOnly);
ds << quint32(WAVE_MAPPER) // device ID for default device
- << QStringLiteral("Default Output Device");
-
- return defaultDevice;
-}
-
-QByteArray QWindowsAudioDeviceInfo::defaultInputDevice()
-{
- QByteArray defaultDevice;
- QDataStream ds(&defaultDevice, QIODevice::WriteOnly);
- ds << quint32(WAVE_MAPPER) // device ID for default device
- << QStringLiteral("Default Input Device");
+ << name;
return defaultDevice;
}
diff --git a/src/plugins/windowsaudio/qwindowsaudiodeviceinfo.h b/src/plugins/windowsaudio/qwindowsaudiodeviceinfo.h
index d4833d3fc..d84eb8acf 100644
--- a/src/plugins/windowsaudio/qwindowsaudiodeviceinfo.h
+++ b/src/plugins/windowsaudio/qwindowsaudiodeviceinfo.h
@@ -88,8 +88,7 @@ public:
QList<int> supportedSampleSizes();
QList<QAudioFormat::Endian> supportedByteOrders();
QList<QAudioFormat::SampleType> supportedSampleTypes();
- static QByteArray defaultInputDevice();
- static QByteArray defaultOutputDevice();
+ static QByteArray defaultDevice(QAudio::Mode mode);
static QList<QByteArray> availableDevices(QAudio::Mode);
private:
diff --git a/src/plugins/windowsaudio/qwindowsaudioplugin.cpp b/src/plugins/windowsaudio/qwindowsaudioplugin.cpp
index ba1dba4c2..8f532fa70 100644
--- a/src/plugins/windowsaudio/qwindowsaudioplugin.cpp
+++ b/src/plugins/windowsaudio/qwindowsaudioplugin.cpp
@@ -49,6 +49,11 @@ QWindowsAudioPlugin::QWindowsAudioPlugin(QObject *parent)
{
}
+QByteArray QWindowsAudioPlugin::defaultDevice(QAudio::Mode mode) const
+{
+ return QWindowsAudioDeviceInfo::defaultDevice(mode);
+}
+
QList<QByteArray> QWindowsAudioPlugin::availableDevices(QAudio::Mode mode) const
{
return QWindowsAudioDeviceInfo::availableDevices(mode);
diff --git a/src/plugins/windowsaudio/qwindowsaudioplugin.h b/src/plugins/windowsaudio/qwindowsaudioplugin.h
index fb4749e0d..7b500a39c 100644
--- a/src/plugins/windowsaudio/qwindowsaudioplugin.h
+++ b/src/plugins/windowsaudio/qwindowsaudioplugin.h
@@ -41,19 +41,22 @@
#define QWINDOWSAUDIOPLUGIN_H
#include <QtMultimedia/qaudiosystemplugin.h>
+#include <QtMultimedia/private/qaudiosystempluginext_p.h>
QT_BEGIN_NAMESPACE
-class QWindowsAudioPlugin : public QAudioSystemPlugin
+class QWindowsAudioPlugin : public QAudioSystemPlugin, public QAudioSystemPluginExtension
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qt-project.qt.audiosystemfactory/5.0" FILE "windowsaudio.json")
+ Q_INTERFACES(QAudioSystemPluginExtension)
public:
QWindowsAudioPlugin(QObject *parent = 0);
~QWindowsAudioPlugin() {}
+ 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;