summaryrefslogtreecommitdiffstats
path: root/src/multimedia/audio
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2021-01-13 15:39:29 +0100
committerLars Knoll <lars.knoll@qt.io>2021-01-22 07:03:16 +0000
commit85e2f9712f257627529b3877e0c71dcc344a5313 (patch)
tree68859195970d7374f28074b5cabf458926e2a5fc /src/multimedia/audio
parent98148969b112f82d2b49e77950ea5f6d8b37b8b2 (diff)
Add a QMediaDeviceInfo class to enumerate input/output devices
Use this as the starting point for a new QPA like backend infrastructure. Refactor places that use the device information to use the new infrastructure. Cleanup the audio subsystem part and port it over to the new infrastructure. Android and QNX are not ported yet. Change-Id: I99c459c998f1f05e1c40ad30c700011e41cef533 Reviewed-by: Doris Verria <doris.verria@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/multimedia/audio')
-rw-r--r--src/multimedia/audio/audio.pri3
-rw-r--r--src/multimedia/audio/qaudiodevicefactory.cpp187
-rw-r--r--src/multimedia/audio/qaudiodeviceinfo.cpp110
-rw-r--r--src/multimedia/audio/qaudiodeviceinfo.h15
-rw-r--r--src/multimedia/audio/qaudiodeviceinfo_p.h (renamed from src/multimedia/audio/qaudiodevicefactory_p.h)56
-rw-r--r--src/multimedia/audio/qaudioinput.cpp11
-rw-r--r--src/multimedia/audio/qaudioinput.h2
-rw-r--r--src/multimedia/audio/qaudiooutput.cpp12
-rw-r--r--src/multimedia/audio/qaudiooutput.h2
-rw-r--r--src/multimedia/audio/qaudiosystem.cpp106
-rw-r--r--src/multimedia/audio/qaudiosystem_p.h29
11 files changed, 93 insertions, 440 deletions
diff --git a/src/multimedia/audio/audio.pri b/src/multimedia/audio/audio.pri
index 7be447e32..6b9bc59cf 100644
--- a/src/multimedia/audio/audio.pri
+++ b/src/multimedia/audio/audio.pri
@@ -13,7 +13,7 @@ PUBLIC_HEADERS += \
PRIVATE_HEADERS += \
audio/qaudiobuffer_p.h \
- audio/qaudiodevicefactory_p.h \
+ audio/qaudiodeviceinfo_p.h \
audio/qwavedecoder_p.h \
audio/qsamplecache_p.h \
audio/qaudiohelpers_p.h \
@@ -26,7 +26,6 @@ SOURCES += \
audio/qaudiooutput.cpp \
audio/qaudioinput.cpp \
audio/qaudiosystem.cpp \
- audio/qaudiodevicefactory.cpp \
audio/qsoundeffect.cpp \
audio/qwavedecoder_p.cpp \
audio/qsamplecache_p.cpp \
diff --git a/src/multimedia/audio/qaudiodevicefactory.cpp b/src/multimedia/audio/qaudiodevicefactory.cpp
deleted file mode 100644
index 5821e8721..000000000
--- a/src/multimedia/audio/qaudiodevicefactory.cpp
+++ /dev/null
@@ -1,187 +0,0 @@
-/****************************************************************************
-**
-** 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$
-**
-****************************************************************************/
-
-#include <QtCore/qdebug.h>
-
-#include "qaudiosystem_p.h"
-
-#include "qaudiodevicefactory_p.h"
-
-QT_BEGIN_NAMESPACE
-
-class QNullDeviceInfo : public QAbstractAudioDeviceInfo
-{
-public:
- [[nodiscard]] QAudioFormat preferredFormat() const override { qWarning()<<"using null deviceinfo, none available"; return QAudioFormat(); }
- [[nodiscard]] bool isFormatSupported(const QAudioFormat& ) const override { return false; }
- [[nodiscard]] QAudioFormat nearestFormat(const QAudioFormat& ) const { return QAudioFormat(); }
- [[nodiscard]] QString deviceName() const override { return QString(); }
- QString description() const override { return deviceName(); };
- QStringList supportedCodecs() override { return QStringList(); }
- QList<int> supportedSampleRates() override { return QList<int>(); }
- QList<int> supportedChannelCounts() override { return QList<int>(); }
- QList<int> supportedSampleSizes() override { return QList<int>(); }
- QList<QAudioFormat::Endian> supportedByteOrders() override { return QList<QAudioFormat::Endian>(); }
- QList<QAudioFormat::SampleType> supportedSampleTypes() override { return QList<QAudioFormat::SampleType>(); }
-};
-
-class QNullInputDevice : public QAbstractAudioInput
-{
-public:
- void start(QIODevice*) override { qWarning()<<"using null input device, none available";}
- QIODevice *start() override { qWarning()<<"using null input device, none available"; return nullptr; }
- void stop() override {}
- void reset() override {}
- void suspend() override {}
- void resume() override {}
- [[nodiscard]] int bytesReady() const override { return 0; }
- [[nodiscard]] int periodSize() const override { return 0; }
- void setBufferSize(int ) override {}
- [[nodiscard]] int bufferSize() const override { return 0; }
- void setNotifyInterval(int ) override {}
- [[nodiscard]] int notifyInterval() const override { return 0; }
- [[nodiscard]] qint64 processedUSecs() const override { return 0; }
- [[nodiscard]] qint64 elapsedUSecs() const override { return 0; }
- [[nodiscard]] QAudio::Error error() const override { return QAudio::OpenError; }
- [[nodiscard]] QAudio::State state() const override { return QAudio::StoppedState; }
- void setFormat(const QAudioFormat&) override {}
- [[nodiscard]] QAudioFormat format() const override { return QAudioFormat(); }
- void setVolume(qreal) override {}
- [[nodiscard]] qreal volume() const override {return 1.0f;}
-};
-
-class QNullOutputDevice : public QAbstractAudioOutput
-{
-public:
- void start(QIODevice*) override {qWarning()<<"using null output device, none available";}
- QIODevice *start() override { qWarning()<<"using null output device, none available"; return nullptr; }
- void stop() override {}
- void reset() override {}
- void suspend() override {}
- void resume() override {}
- [[nodiscard]] int bytesFree() const override { return 0; }
- [[nodiscard]] int periodSize() const override { return 0; }
- void setBufferSize(int ) override {}
- [[nodiscard]] int bufferSize() const override { return 0; }
- void setNotifyInterval(int ) override {}
- [[nodiscard]] int notifyInterval() const override { return 0; }
- [[nodiscard]] qint64 processedUSecs() const override { return 0; }
- [[nodiscard]] qint64 elapsedUSecs() const override { return 0; }
- [[nodiscard]] QAudio::Error error() const override { return QAudio::OpenError; }
- [[nodiscard]] QAudio::State state() const override { return QAudio::StoppedState; }
- void setFormat(const QAudioFormat&) override {}
- [[nodiscard]] QAudioFormat format() const override { return QAudioFormat(); }
-};
-
-QList<QAudioDeviceInfo> QAudioDeviceFactory::availableDevices(QAudio::Mode mode)
-{
- QList<QAudioDeviceInfo> devices;
- auto *iface = QAudioSystemInterface::instance();
- if (iface) {
- const auto availableDevices = iface->availableDevices(mode);
- for (const QByteArray& handle : availableDevices)
- devices << QAudioDeviceInfo(handle, mode);
- }
-
- return devices;
-}
-
-QAudioDeviceInfo QAudioDeviceFactory::defaultDevice(QAudio::Mode mode)
-{
- auto *iface = QAudioSystemInterface::instance();
- if (iface) {
- // Ask for the default device.
- const QByteArray &device = iface->defaultDevice(mode);
- if (!device.isEmpty())
- return QAudioDeviceInfo(device, mode);
-
- // If there were no default devices then just pick the first device that's available.
- const auto &devices = iface->availableDevices(mode);
- if (!devices.isEmpty())
- return QAudioDeviceInfo(devices.first(), mode);
- }
-
- return QAudioDeviceInfo();
-}
-
-QAbstractAudioDeviceInfo* QAudioDeviceFactory::audioDeviceInfo(const QByteArray &handle, QAudio::Mode mode)
-{
- QAbstractAudioDeviceInfo *rc = nullptr;
-
- auto *iface = QAudioSystemInterface::instance();
- if (iface)
- rc = iface->createDeviceInfo(handle, mode);
-
- return rc == nullptr ? new QNullDeviceInfo() : rc;
-}
-
-QAbstractAudioInput* QAudioDeviceFactory::createInputDevice(const QAudioFormat &format, const QAudioDeviceInfo &deviceInfo)
-{
- QAudioDeviceInfo info = deviceInfo;
- if (info.isNull())
- info = defaultDevice(QAudio::AudioInput);
-
- auto *iface = QAudioSystemInterface::instance();
- if (iface) {
- QAbstractAudioInput* p = iface->createInput(info.handle());
- if (p) p->setFormat(format);
- return p;
- }
-
- return new QNullInputDevice();
-}
-
-QAbstractAudioOutput* QAudioDeviceFactory::createOutputDevice(const QAudioFormat &format, const QAudioDeviceInfo &deviceInfo)
-{
- QAudioDeviceInfo info = deviceInfo;
- if (info.isNull())
- info = defaultDevice(QAudio::AudioOutput);
-
- auto *iface = QAudioSystemInterface::instance();
- if (iface) {
- QAbstractAudioOutput* p = iface->createOutput(info.handle());
- if (p) p->setFormat(format);
- return p;
- }
-
- return new QNullOutputDevice();
-}
-
-QT_END_NAMESPACE
-
diff --git a/src/multimedia/audio/qaudiodeviceinfo.cpp b/src/multimedia/audio/qaudiodeviceinfo.cpp
index 880106964..8358f3d54 100644
--- a/src/multimedia/audio/qaudiodeviceinfo.cpp
+++ b/src/multimedia/audio/qaudiodeviceinfo.cpp
@@ -37,9 +37,10 @@
**
****************************************************************************/
-#include "qaudiodevicefactory_p.h"
#include "qaudiosystem_p.h"
-#include "qaudiodeviceinfo.h"
+#include "qaudiodeviceinfo_p.h"
+#include <private/qmediaplatformdevicemanager_p.h>
+#include <private/qmediaplatformintegration_p.h>
#include <QtCore/qmap.h>
@@ -52,46 +53,14 @@ static void qRegisterAudioDeviceInfoMetaTypes()
Q_CONSTRUCTOR_FUNCTION(qRegisterAudioDeviceInfoMetaTypes)
-class QAudioDeviceInfoPrivate : public QSharedData
+QAudioDeviceInfoPrivate::QAudioDeviceInfoPrivate(const QByteArray &h, QAudio::Mode m)
+ : id(h), mode(m)
{
-public:
- QAudioDeviceInfoPrivate() = default;
- QAudioDeviceInfoPrivate(const QByteArray &h, QAudio::Mode m)
- : handle(h), mode(m)
- {
- if (!handle.isEmpty())
- info = QAudioDeviceFactory::audioDeviceInfo(handle, mode);
- else
- info = nullptr;
- }
-
- QAudioDeviceInfoPrivate(const QAudioDeviceInfoPrivate &other):
- QSharedData(other),
- handle(other.handle), mode(other.mode)
- {
- info = QAudioDeviceFactory::audioDeviceInfo(handle, mode);
- }
-
- QAudioDeviceInfoPrivate& operator=(const QAudioDeviceInfoPrivate &other)
- {
- delete info;
-
- handle = other.handle;
- mode = other.mode;
- info = QAudioDeviceFactory::audioDeviceInfo(handle, mode);
- return *this;
- }
-
- ~QAudioDeviceInfoPrivate()
- {
- delete info;
- }
-
- QByteArray handle;
- QAudio::Mode mode = QAudio::AudioOutput;
- QAbstractAudioDeviceInfo *info = nullptr;
-};
+}
+QAudioDeviceInfoPrivate::~QAudioDeviceInfoPrivate()
+{
+}
/*!
\class QAudioDeviceInfo
@@ -148,7 +117,7 @@ public:
Constructs an empty QAudioDeviceInfo object.
*/
QAudioDeviceInfo::QAudioDeviceInfo():
- d(new QAudioDeviceInfoPrivate)
+ d(nullptr)
{
}
@@ -184,9 +153,9 @@ bool QAudioDeviceInfo::operator ==(const QAudioDeviceInfo &other) const
{
if (d == other.d)
return true;
- if (d->mode == other.d->mode
- && d->handle == other.d->handle
- && deviceName() == other.deviceName())
+ if (!d || !other.d)
+ return false;
+ if (d->mode == other.d->mode && d->id == other.d->id)
return true;
return false;
}
@@ -205,7 +174,7 @@ bool QAudioDeviceInfo::operator !=(const QAudioDeviceInfo &other) const
*/
bool QAudioDeviceInfo::isNull() const
{
- return d->info == nullptr;
+ return d == nullptr;
}
/*!
@@ -217,9 +186,9 @@ bool QAudioDeviceInfo::isNull() const
eg. default, Intel, U0x46d0x9a4
*/
-QString QAudioDeviceInfo::deviceName() const
+QByteArray QAudioDeviceInfo::id() const
{
- return isNull() ? QString() : d->info->deviceName();
+ return isNull() ? QByteArray() : d->id;
}
/*!
@@ -229,7 +198,15 @@ QString QAudioDeviceInfo::deviceName() const
*/
QString QAudioDeviceInfo::description() const
{
- return isNull() ? QString() : d->info->description();
+ return isNull() ? QString() : d->description();
+}
+
+/*!
+ Returns true if this is the default audio device for it's mode.
+*/
+bool QAudioDeviceInfo::isDefault() const
+{
+ return d ? d->isDefault : false;
}
/*!
@@ -238,7 +215,7 @@ QString QAudioDeviceInfo::description() const
*/
bool QAudioDeviceInfo::isFormatSupported(const QAudioFormat &settings) const
{
- return isNull() ? false : d->info->isFormatSupported(settings);
+ return isNull() ? false : d->isFormatSupported(settings);
}
/*!
@@ -256,7 +233,7 @@ bool QAudioDeviceInfo::isFormatSupported(const QAudioFormat &settings) const
*/
QAudioFormat QAudioDeviceInfo::preferredFormat() const
{
- return isNull() ? QAudioFormat() : d->info->preferredFormat();
+ return isNull() ? QAudioFormat() : d->preferredFormat();
}
/*!
@@ -361,7 +338,7 @@ QAudioFormat QAudioDeviceInfo::nearestFormat(const QAudioFormat &settings) const
*/
QStringList QAudioDeviceInfo::supportedCodecs() const
{
- return isNull() ? QStringList() : d->info->supportedCodecs();
+ return isNull() ? QStringList() : d->supportedCodecs();
}
/*!
@@ -370,7 +347,7 @@ QStringList QAudioDeviceInfo::supportedCodecs() const
*/
QList<int> QAudioDeviceInfo::supportedSampleRates() const
{
- return isNull() ? QList<int>() : d->info->supportedSampleRates();
+ return isNull() ? QList<int>() : d->supportedSampleRates();
}
/*!
@@ -381,7 +358,7 @@ QList<int> QAudioDeviceInfo::supportedSampleRates() const
*/
QList<int> QAudioDeviceInfo::supportedChannelCounts() const
{
- return isNull() ? QList<int>() : d->info->supportedChannelCounts();
+ return isNull() ? QList<int>() : d->supportedChannelCounts();
}
/*!
@@ -392,7 +369,7 @@ QList<int> QAudioDeviceInfo::supportedChannelCounts() const
*/
QList<int> QAudioDeviceInfo::supportedSampleSizes() const
{
- return isNull() ? QList<int>() : d->info->supportedSampleSizes();
+ return isNull() ? QList<int>() : d->supportedSampleSizes();
}
/*!
@@ -400,7 +377,7 @@ QList<int> QAudioDeviceInfo::supportedSampleSizes() const
*/
QList<QAudioFormat::Endian> QAudioDeviceInfo::supportedByteOrders() const
{
- return isNull() ? QList<QAudioFormat::Endian>() : d->info->supportedByteOrders();
+ return isNull() ? QList<QAudioFormat::Endian>() : d->supportedByteOrders();
}
/*!
@@ -408,7 +385,7 @@ QList<QAudioFormat::Endian> QAudioDeviceInfo::supportedByteOrders() const
*/
QList<QAudioFormat::SampleType> QAudioDeviceInfo::supportedSampleTypes() const
{
- return isNull() ? QList<QAudioFormat::SampleType>() : d->info->supportedSampleTypes();
+ return isNull() ? QList<QAudioFormat::SampleType>() : d->supportedSampleTypes();
}
/*!
@@ -417,7 +394,7 @@ QList<QAudioFormat::SampleType> QAudioDeviceInfo::supportedSampleTypes() const
*/
QAudioDeviceInfo QAudioDeviceInfo::defaultInputDevice()
{
- return QAudioDeviceFactory::defaultDevice(QAudio::AudioInput);
+ return QMediaPlatformIntegration::instance()->deviceManager()->audioInputs().value(0);
}
/*!
@@ -426,7 +403,7 @@ QAudioDeviceInfo QAudioDeviceInfo::defaultInputDevice()
*/
QAudioDeviceInfo QAudioDeviceInfo::defaultOutputDevice()
{
- return QAudioDeviceFactory::defaultDevice(QAudio::AudioOutput);
+ return QMediaPlatformIntegration::instance()->deviceManager()->audioOutputs().value(0);
}
/*!
@@ -434,24 +411,22 @@ QAudioDeviceInfo QAudioDeviceInfo::defaultOutputDevice()
*/
QList<QAudioDeviceInfo> QAudioDeviceInfo::availableDevices(QAudio::Mode mode)
{
- return QAudioDeviceFactory::availableDevices(mode);
+ return mode == QAudio::AudioInput ?
+ QMediaPlatformIntegration::instance()->deviceManager()->audioInputs() :
+ QMediaPlatformIntegration::instance()->deviceManager()->audioOutputs();
}
-/*!
- \internal
-*/
-QAudioDeviceInfo::QAudioDeviceInfo(const QByteArray &handle, QAudio::Mode mode):
- d(new QAudioDeviceInfoPrivate(handle, mode))
-{
-}
+QAudioDeviceInfo::QAudioDeviceInfo(QAudioDeviceInfoPrivate *p)
+ : d(p)
+{}
/*!
\internal
*/
QByteArray QAudioDeviceInfo::handle() const
{
- return d->handle;
+ return d->id;
}
@@ -464,4 +439,3 @@ QAudio::Mode QAudioDeviceInfo::mode() const
}
QT_END_NAMESPACE
-
diff --git a/src/multimedia/audio/qaudiodeviceinfo.h b/src/multimedia/audio/qaudiodeviceinfo.h
index ff2d22d6d..d452dca49 100644
--- a/src/multimedia/audio/qaudiodeviceinfo.h
+++ b/src/multimedia/audio/qaudiodeviceinfo.h
@@ -55,14 +55,9 @@
QT_BEGIN_NAMESPACE
-
-class QAudioDeviceFactory;
-
class QAudioDeviceInfoPrivate;
class Q_MULTIMEDIA_EXPORT QAudioDeviceInfo
{
- friend class QAudioDeviceFactory;
-
public:
QAudioDeviceInfo();
QAudioDeviceInfo(const QAudioDeviceInfo& other);
@@ -75,9 +70,12 @@ public:
bool isNull() const;
- QString deviceName() const;
+ QByteArray id() const;
QString description() const;
+ bool isDefault() const;
+ QAudio::Mode mode() const;
+
bool isFormatSupported(const QAudioFormat &format) const;
QAudioFormat preferredFormat() const;
QAudioFormat nearestFormat(const QAudioFormat &format) const;
@@ -89,15 +87,16 @@ public:
QList<QAudioFormat::Endian> supportedByteOrders() const;
QList<QAudioFormat::SampleType> supportedSampleTypes() const;
+ // ### remove those, -> DeviceManager
static QAudioDeviceInfo defaultInputDevice();
static QAudioDeviceInfo defaultOutputDevice();
static QList<QAudioDeviceInfo> availableDevices(QAudio::Mode mode);
+ QAudioDeviceInfo(QAudioDeviceInfoPrivate *p);
+
private:
- QAudioDeviceInfo(const QByteArray &handle, QAudio::Mode mode);
QByteArray handle() const;
- QAudio::Mode mode() const;
QSharedDataPointer<QAudioDeviceInfoPrivate> d;
};
diff --git a/src/multimedia/audio/qaudiodevicefactory_p.h b/src/multimedia/audio/qaudiodeviceinfo_p.h
index a37d04d91..3a7ca53ab 100644
--- a/src/multimedia/audio/qaudiodevicefactory_p.h
+++ b/src/multimedia/audio/qaudiodeviceinfo_p.h
@@ -37,52 +37,46 @@
**
****************************************************************************/
+
+#ifndef QAUDIODEVICEINFO_P_H
+#define QAUDIODEVICEINFO_P_H
+
//
// W A R N I N G
// -------------
//
-// This file is not part of the Qt API. It exists for the convenience
-// of other Qt classes. This header file may change from version to
+// 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.
//
-#ifndef QAUDIODEVICEFACTORY_P_H
-#define QAUDIODEVICEFACTORY_P_H
-
-#include <QtCore/qbytearray.h>
-#include <QtCore/qlist.h>
-
-#include <qtmultimediaglobal.h>
-#include <qmultimedia.h>
-
-#include "qaudiodeviceinfo.h"
+#include <QtMultimedia/qaudiodeviceinfo.h>
QT_BEGIN_NAMESPACE
-
-class QAbstractAudioInput;
-class QAbstractAudioOutput;
-class QAbstractAudioDeviceInfo;
-
-class QAudioDeviceFactory
+class QAudioDeviceInfoPrivate : public QSharedData
{
public:
- static QList<QAudioDeviceInfo> availableDevices(QAudio::Mode mode);
-
- static QAudioDeviceInfo defaultDevice(QAudio::Mode mode);
-
- static QAbstractAudioDeviceInfo* audioDeviceInfo(const QByteArray &handle, QAudio::Mode mode);
-
- static QAbstractAudioInput* createInputDevice(const QAudioFormat &format, const QAudioDeviceInfo &device = {});
- static QAbstractAudioOutput* createOutputDevice(const QAudioFormat &format, const QAudioDeviceInfo &device = {});
-
- static QAbstractAudioInput* createNullInput();
- static QAbstractAudioOutput* createNullOutput();
+ QAudioDeviceInfoPrivate(const QByteArray &h, QAudio::Mode m);
+ virtual ~QAudioDeviceInfoPrivate();
+
+ virtual QAudioFormat preferredFormat() const = 0;
+ virtual bool isFormatSupported(const QAudioFormat &format) const = 0;
+ virtual QString description() const = 0;
+ virtual QStringList supportedCodecs() const = 0;
+ virtual QList<int> supportedSampleRates() const = 0;
+ virtual QList<int> supportedChannelCounts() const = 0;
+ virtual QList<int> supportedSampleSizes() const = 0;
+ virtual QList<QAudioFormat::Endian> supportedByteOrders() const = 0;
+ virtual QList<QAudioFormat::SampleType> supportedSampleTypes() const = 0;
+
+ QByteArray id;
+ QAudio::Mode mode = QAudio::AudioOutput;
+ bool isDefault = false;
};
QT_END_NAMESPACE
-#endif // QAUDIODEVICEFACTORY_P_H
-
+#endif // QAUDIODEVICEINFO_H
diff --git a/src/multimedia/audio/qaudioinput.cpp b/src/multimedia/audio/qaudioinput.cpp
index c6ee37bc4..5ffdf1073 100644
--- a/src/multimedia/audio/qaudioinput.cpp
+++ b/src/multimedia/audio/qaudioinput.cpp
@@ -43,7 +43,8 @@
#include "qaudiosystem_p.h"
#include "qaudioinput.h"
-#include "qaudiodevicefactory_p.h"
+#include <private/qmediaplatformdevicemanager_p.h>
+#include <private/qmediaplatformintegration_p.h>
QT_BEGIN_NAMESPACE
@@ -131,9 +132,11 @@ QAudioInput::QAudioInput(const QAudioFormat &format, QObject *parent)
QAudioInput::QAudioInput(const QAudioDeviceInfo &audioDevice, const QAudioFormat &format, QObject *parent):
QObject(parent)
{
- d = QAudioDeviceFactory::createInputDevice(format, audioDevice);
- connect(d, SIGNAL(notify()), SIGNAL(notify()));
- connect(d, SIGNAL(stateChanged(QAudio::State)), SIGNAL(stateChanged(QAudio::State)));
+ d = QMediaPlatformIntegration::instance()->deviceManager()->audioInputDevice(format, audioDevice);
+ if (d) {
+ connect(d, SIGNAL(notify()), SIGNAL(notify()));
+ connect(d, SIGNAL(stateChanged(QAudio::State)), SIGNAL(stateChanged(QAudio::State)));
+ }
}
/*!
diff --git a/src/multimedia/audio/qaudioinput.h b/src/multimedia/audio/qaudioinput.h
index b17fd4d79..1f1b84fb5 100644
--- a/src/multimedia/audio/qaudioinput.h
+++ b/src/multimedia/audio/qaudioinput.h
@@ -66,6 +66,8 @@ public:
explicit QAudioInput(const QAudioDeviceInfo &audioDeviceInfo, const QAudioFormat &format = QAudioFormat(), QObject *parent = nullptr);
~QAudioInput();
+ bool isNull() const { return !d; }
+
QAudioFormat format() const;
void start(QIODevice *device);
diff --git a/src/multimedia/audio/qaudiooutput.cpp b/src/multimedia/audio/qaudiooutput.cpp
index f0ae769da..0042921cb 100644
--- a/src/multimedia/audio/qaudiooutput.cpp
+++ b/src/multimedia/audio/qaudiooutput.cpp
@@ -43,8 +43,8 @@
#include "qaudiosystem_p.h"
#include "qaudiooutput.h"
-#include "qaudiodevicefactory_p.h"
-
+#include <private/qmediaplatformdevicemanager_p.h>
+#include <private/qmediaplatformintegration_p.h>
QT_BEGIN_NAMESPACE
@@ -131,9 +131,11 @@ QAudioOutput::QAudioOutput(const QAudioFormat &format, QObject *parent)
QAudioOutput::QAudioOutput(const QAudioDeviceInfo &audioDevice, const QAudioFormat &format, QObject *parent):
QObject(parent)
{
- d = QAudioDeviceFactory::createOutputDevice(format, audioDevice);
- connect(d, SIGNAL(notify()), SIGNAL(notify()));
- connect(d, SIGNAL(stateChanged(QAudio::State)), SIGNAL(stateChanged(QAudio::State)));
+ d = QMediaPlatformIntegration::instance()->deviceManager()->audioOutputDevice(format, audioDevice);
+ if (d) {
+ connect(d, SIGNAL(notify()), SIGNAL(notify()));
+ connect(d, SIGNAL(stateChanged(QAudio::State)), SIGNAL(stateChanged(QAudio::State)));
+ }
}
/*!
diff --git a/src/multimedia/audio/qaudiooutput.h b/src/multimedia/audio/qaudiooutput.h
index 5f466d8e1..8c3c2a831 100644
--- a/src/multimedia/audio/qaudiooutput.h
+++ b/src/multimedia/audio/qaudiooutput.h
@@ -66,6 +66,8 @@ public:
explicit QAudioOutput(const QAudioDeviceInfo &audioDeviceInfo, const QAudioFormat &format = QAudioFormat(), QObject *parent = nullptr);
~QAudioOutput();
+ bool isNull() const { return !d; }
+
QAudioFormat format() const;
void start(QIODevice *device);
diff --git a/src/multimedia/audio/qaudiosystem.cpp b/src/multimedia/audio/qaudiosystem.cpp
index 64002fe11..c0ab776ff 100644
--- a/src/multimedia/audio/qaudiosystem.cpp
+++ b/src/multimedia/audio/qaudiosystem.cpp
@@ -40,22 +40,6 @@
#include <private/qtmultimediaglobal_p.h>
#include "qaudiosystem_p.h"
-#if QT_CONFIG(gstreamer)
-#include <private/qaudiointerface_gstreamer_p.h>
-#elif QT_CONFIG(pulseaudio)
-#include <private/qaudiointerface_pulse_p.h>
-#elif QT_CONFIG(alsa)
-#include <private/qalsainterface_p.h>
-#elif defined(Q_OS_DARWIN)
-#include <private/qcoreaudiointerface_p.h>
-#elif defined(Q_OS_WIN)
-#include <private/qwindowsaudiointerface_p.h>
-#elif defined(Q_OS_ANDROID)
-#include <private/qopenslesinterface_p.h>
-#elif defined(Q_OS_QNX)
-#include <private/qnxaudiointerface_p.h>
-#endif
-
QT_BEGIN_NAMESPACE
/*!
@@ -387,96 +371,6 @@ QT_BEGIN_NAMESPACE
the interval set by setNotifyInterval(x).
*/
-
-/*!
- \class QAudioSystemInterface
- \internal
- \brief The QAudioSystemInterface class provides an abstract base for audio plugins.
-
- \ingroup multimedia
- \ingroup multimedia_audio
- \inmodule QtMultimedia
-
- Writing a audio plugin is achieved by subclassing this base class,
- reimplementing the pure virtual functions availableDevices(),
- createInput(), createOutput() and createDeviceInfo() then exporting
- the class with the Q_PLUGIN_METADATA() macro.
-
- The json file containing the meta data should contain a list of keys
- matching the plugin. Add "default" to your list of keys available
- to override the default audio device to be provided by your plugin.
-
- \code
- { "Keys": [ "default" ] }
- \endcode
-
- Unit tests are available to help in debugging new plugins.
-
- \sa QAbstractAudioDeviceInfo, QAbstractAudioOutput, QAbstractAudioInput
-
- Qt comes with plugins for Windows (WinMM and WASAPI), Linux (ALSA and PulseAudio), \macos / iOS
- (CoreAudio), Android (OpenSL ES) and QNX.
-
- If no audio plugins are available, a fallback dummy backend will be used.
- This should print out warnings if this is the case when you try and use QAudioInput
- or QAudioOutput. To fix this problem, make sure the dependencies for the Qt plugins are
- installed on the system and reconfigure Qt (e.g. alsa-devel package on Linux), or create your
- own plugin with a default key to always override the dummy fallback. The easiest way to
- determine if you have only a dummy backend is to get a list of available audio devices.
-
- QAudioDeviceInfo::availableDevices(QAudio::AudioOutput).size() = 0 (dummy backend)
-*/
-
-QAudioSystemInterface *QAudioSystemInterface::instance()
-{
- static QAudioSystemInterface *system = nullptr;
- if (!system) {
-#if QT_CONFIG(gstreamer)
- system = new QGStreamerAudioInterface();
-#elif QT_CONFIG(pulseaudio)
- system = new QPulseAudioInterface();
-#elif QT_CONFIG(alsa)
- system = new QAlsaInterface();
-#elif defined(Q_OS_DARWIN)
- system = new QCoreAudioInterface();
-#elif defined(Q_OS_WIN)
- system = new QWindowsAudioInterface();
-#elif defined(Q_OS_ANDROID)
- system = new QOpenSLESAudioInterface();
-#elif defined(Q_OS_QNX)
- system = new QnxAudioInterface();
-#endif
- }
- return system;
-}
-
-QAudioSystemInterface::~QAudioSystemInterface()
-{
-
-}
-
-/*!
- \fn QList<QByteArray> QAudioSystemInterface::availableDevices(QAudio::Mode mode) const
- Returns a list of available audio devices for \a mode
-*/
-
-/*!
- \fn QAbstractAudioInput* QAudioSystemInterface::createInput(const QByteArray& device)
- Returns a pointer to a QAbstractAudioInput created using \a device identifier
-*/
-
-/*!
- \fn QAbstractAudioOutput* QAudioSystemInterface::createOutput(const QByteArray& device)
- Returns a pointer to a QAbstractAudioOutput created using \a device identifier
-
-*/
-
-/*!
- \fn QAbstractAudioDeviceInfo* QAudioSystemInterface::createDeviceInfo(const QByteArray& device, QAudio::Mode mode)
- Returns a pointer to a QAbstractAudioDeviceInfo created using \a device and \a mode
-
-*/
-
QT_END_NAMESPACE
#include "moc_qaudiosystem_p.cpp"
diff --git a/src/multimedia/audio/qaudiosystem_p.h b/src/multimedia/audio/qaudiosystem_p.h
index 33b883e8b..efc7ade28 100644
--- a/src/multimedia/audio/qaudiosystem_p.h
+++ b/src/multimedia/audio/qaudiosystem_p.h
@@ -62,23 +62,6 @@ QT_BEGIN_NAMESPACE
class QIODevice;
-class QAbstractAudioDeviceInfo : public QObject
-{
- Q_OBJECT
-
-public:
- virtual QAudioFormat preferredFormat() const = 0;
- virtual bool isFormatSupported(const QAudioFormat &format) const = 0;
- virtual QString deviceName() const = 0;
- virtual QString description() const = 0;
- virtual QStringList supportedCodecs() = 0;
- virtual QList<int> supportedSampleRates() = 0;
- virtual QList<int> supportedChannelCounts() = 0;
- virtual QList<int> supportedSampleSizes() = 0;
- virtual QList<QAudioFormat::Endian> supportedByteOrders() = 0;
- virtual QList<QAudioFormat::SampleType> supportedSampleTypes() = 0;
-};
-
class QAbstractAudioOutput : public QObject
{
Q_OBJECT
@@ -145,18 +128,6 @@ Q_SIGNALS:
void notify();
};
-struct QAudioSystemInterface
-{
- static QAudioSystemInterface *instance();
-
- virtual ~QAudioSystemInterface();
- virtual QList<QByteArray> availableDevices(QAudio::Mode) const = 0;
- virtual QAbstractAudioInput* createInput(const QByteArray& device) = 0;
- virtual QAbstractAudioOutput* createOutput(const QByteArray& device) = 0;
- virtual QAbstractAudioDeviceInfo* createDeviceInfo(const QByteArray& device, QAudio::Mode mode) = 0;
- virtual QByteArray defaultDevice(QAudio::Mode) const = 0;
-};
-
QT_END_NAMESPACE
#endif // QAUDIOSYSTEM_H