diff options
19 files changed, 116 insertions, 74 deletions
diff --git a/examples/multimedia/audiodevices/audiodevices.cpp b/examples/multimedia/audiodevices/audiodevices.cpp index f49f1cb22..ed25fc52a 100644 --- a/examples/multimedia/audiodevices/audiodevices.cpp +++ b/examples/multimedia/audiodevices/audiodevices.cpp @@ -80,7 +80,8 @@ AudioDevicesBase::~AudioDevicesBase() = default; AudioTest::AudioTest(QWidget *parent) - : AudioDevicesBase(parent) + : AudioDevicesBase(parent), + m_manager(new QMediaDeviceManager(this)) { connect(testButton, &QPushButton::clicked, this, &AudioTest::test); connect(modeBox, QOverload<int>::of(&QComboBox::activated), this, &AudioTest::modeChanged); @@ -89,8 +90,8 @@ AudioTest::AudioTest(QWidget *parent) connect(channelsSpinBox, &QSpinBox::valueChanged, this, &AudioTest::channelChanged); connect(sampleFormatBox, QOverload<int>::of(&QComboBox::activated), this, &AudioTest::sampleFormatChanged); connect(populateTableButton, &QPushButton::clicked, this, &AudioTest::populateTable); - connect(QMediaDeviceManager::instance(), &QMediaDeviceManager::audioInputsChanged, this, &AudioTest::updateAudioDevices); - connect(QMediaDeviceManager::instance(), &QMediaDeviceManager::audioOutputsChanged, this, &AudioTest::updateAudioDevices); + connect(m_manager, &QMediaDeviceManager::audioInputsChanged, this, &AudioTest::updateAudioDevices); + connect(m_manager, &QMediaDeviceManager::audioOutputsChanged, this, &AudioTest::updateAudioDevices); modeBox->setCurrentIndex(0); modeChanged(0); @@ -124,8 +125,7 @@ void AudioTest::test() void AudioTest::updateAudioDevices() { deviceBox->clear(); - auto *deviceManager = QMediaDeviceManager::instance(); - const auto devices = m_mode == QAudio::AudioInput ? deviceManager->audioInputs() : deviceManager->audioOutputs(); + const auto devices = m_mode == QAudio::AudioInput ? m_manager->audioInputs() : m_manager->audioOutputs(); for (auto &deviceInfo: devices) deviceBox->addItem(deviceInfo.description(), QVariant::fromValue(deviceInfo)); } diff --git a/examples/multimedia/audiodevices/audiodevices.h b/examples/multimedia/audiodevices/audiodevices.h index 31ec479df..17d8d4888 100644 --- a/examples/multimedia/audiodevices/audiodevices.h +++ b/examples/multimedia/audiodevices/audiodevices.h @@ -52,6 +52,7 @@ #define AUDIODEVICES_H #include <QAudioDeviceInfo> +#include <QMediaDeviceManager> #include <QMainWindow> #include <QObject> @@ -75,6 +76,7 @@ private: QAudioDeviceInfo m_deviceInfo; QAudioFormat m_settings; QAudio::Mode m_mode = QAudio::AudioInput; + QMediaDeviceManager *m_manager = nullptr; private slots: void updateAudioDevices(); diff --git a/examples/multimedia/audioinput/audioinput.cpp b/examples/multimedia/audioinput/audioinput.cpp index 40303340f..a13f58c2c 100644 --- a/examples/multimedia/audioinput/audioinput.cpp +++ b/examples/multimedia/audioinput/audioinput.cpp @@ -147,7 +147,7 @@ void RenderArea::setLevel(qreal value) InputTest::InputTest() - : m_deviceManager(QMediaDeviceManager::instance()) + : m_deviceManager(new QMediaDeviceManager(this)) { initializeWindow(); initializeAudio(m_deviceManager->defaultAudioInput()); diff --git a/examples/multimedia/audiooutput/audiooutput.cpp b/examples/multimedia/audiooutput/audiooutput.cpp index 971972cab..42b4c1bf2 100644 --- a/examples/multimedia/audiooutput/audiooutput.cpp +++ b/examples/multimedia/audiooutput/audiooutput.cpp @@ -141,7 +141,7 @@ qint64 Generator::bytesAvailable() const } AudioTest::AudioTest() - : m_deviceManager(QMediaDeviceManager::instance()), + : m_deviceManager(new QMediaDeviceManager(this)), m_pushTimer(new QTimer(this)) { initializeWindow(); diff --git a/examples/multimedia/audiorecorder/audiorecorder.cpp b/examples/multimedia/audiorecorder/audiorecorder.cpp index 04f72c304..0df27294c 100644 --- a/examples/multimedia/audiorecorder/audiorecorder.cpp +++ b/examples/multimedia/audiorecorder/audiorecorder.cpp @@ -77,11 +77,9 @@ AudioRecorder::AudioRecorder() // this, &AudioRecorder::processBuffer); // m_probe->setSource(m_audioRecorder); - QMediaDeviceManager *manager = QMediaDeviceManager::instance(); - //audio devices ui->audioDeviceBox->addItem(tr("Default"), QVariant(QString())); - for (auto device: manager->audioInputs()) { + for (auto device: QMediaDeviceManager::audioInputs()) { auto name = device.description(); ui->audioDeviceBox->addItem(name, QVariant::fromValue(device)); } diff --git a/examples/multimedia/devices/main.cpp b/examples/multimedia/devices/main.cpp index ab10a8a45..d1bfca542 100644 --- a/examples/multimedia/devices/main.cpp +++ b/examples/multimedia/devices/main.cpp @@ -161,10 +161,9 @@ int main() { QTextStream out(stdout); - auto *deviceManager = QMediaDeviceManager::instance(); - const auto audioInputDevices = deviceManager->audioInputs(); - const auto audioOutputDevices = deviceManager->audioOutputs(); - const auto videoInputDevices = deviceManager->videoInputs(); + const auto audioInputDevices = QMediaDeviceManager::audioInputs(); + const auto audioOutputDevices = QMediaDeviceManager::audioOutputs(); + const auto videoInputDevices = QMediaDeviceManager::videoInputs(); out << "Audio devices detected: " << Qt::endl; out << Qt::endl << "Input" << Qt::endl; diff --git a/examples/multimedia/spectrum/app/engine.cpp b/examples/multimedia/spectrum/app/engine.cpp index 81cc104c1..42828fa5f 100644 --- a/examples/multimedia/spectrum/app/engine.cpp +++ b/examples/multimedia/spectrum/app/engine.cpp @@ -81,7 +81,7 @@ Engine::Engine(QObject *parent) : QObject(parent) , m_mode(QAudio::AudioInput) , m_state(QAudio::StoppedState) - , m_deviceManager(QMediaDeviceManager::instance()) + , m_deviceManager(new QMediaDeviceManager(this)) , m_generateTone(false) , m_file(nullptr) , m_analysisFile(nullptr) diff --git a/examples/multimediawidgets/camera/camera.cpp b/examples/multimediawidgets/camera/camera.cpp index 69445a29f..cf211534e 100644 --- a/examples/multimediawidgets/camera/camera.cpp +++ b/examples/multimediawidgets/camera/camera.cpp @@ -67,7 +67,8 @@ #include <QMediaDeviceManager> #include <QMediaFormat> -Camera::Camera() : ui(new Ui::Camera) +Camera::Camera() + : ui(new Ui::Camera) { ui->setupUi(this); @@ -76,7 +77,7 @@ Camera::Camera() : ui(new Ui::Camera) videoDevicesGroup = new QActionGroup(this); videoDevicesGroup->setExclusive(true); updateCameras(); - connect(QMediaDeviceManager::instance(), &QMediaDeviceManager::videoInputsChanged, this, &Camera::updateCameras); + connect(&m_manager, &QMediaDeviceManager::videoInputsChanged, this, &Camera::updateCameras); connect(videoDevicesGroup, &QActionGroup::triggered, this, &Camera::updateCameraDevice); connect(ui->captureWidget, &QTabWidget::currentChanged, this, &Camera::updateCaptureMode); diff --git a/examples/multimediawidgets/camera/camera.h b/examples/multimediawidgets/camera/camera.h index c443fc195..3a17233b2 100644 --- a/examples/multimediawidgets/camera/camera.h +++ b/examples/multimediawidgets/camera/camera.h @@ -57,6 +57,7 @@ #include <QScopedPointer> #include <QMediaMetaData> #include <QMediaCaptureSession> +#include <QMediaDeviceManager> #include <QMainWindow> @@ -129,6 +130,7 @@ private: QActionGroup *videoDevicesGroup = nullptr; + QMediaDeviceManager m_manager; QMediaCaptureSession m_captureSession; QScopedPointer<QCamera> m_camera; QCameraImageCapture *m_imageCapture; diff --git a/src/multimedia/audio/qaudiodeviceinfo.h b/src/multimedia/audio/qaudiodeviceinfo.h index 6029d244c..561717590 100644 --- a/src/multimedia/audio/qaudiodeviceinfo.h +++ b/src/multimedia/audio/qaudiodeviceinfo.h @@ -57,6 +57,11 @@ QT_BEGIN_NAMESPACE class QAudioDeviceInfoPrivate; class Q_MULTIMEDIA_EXPORT QAudioDeviceInfo { + Q_GADGET + Q_PROPERTY(QByteArray id READ id CONSTANT) + Q_PROPERTY(QString description READ description CONSTANT) + Q_PROPERTY(bool isDefault READ isDefault CONSTANT) + // Q_PROPERTY(QAudio::Mode isDefault READ isDefault CONSTANT) ### Move enum into this class? public: QAudioDeviceInfo(); QAudioDeviceInfo(const QAudioDeviceInfo& other); @@ -87,7 +92,6 @@ public: Range supportedChannelCounts() const; QList<QAudioFormat::SampleFormat> supportedSampleFormats() const; - const QAudioDeviceInfoPrivate *handle() const { return d.get(); } private: friend class QAudioDeviceInfoPrivate; diff --git a/src/multimedia/camera/qcamerainfo.h b/src/multimedia/camera/qcamerainfo.h index 6577bbbfb..fe7540d80 100644 --- a/src/multimedia/camera/qcamerainfo.h +++ b/src/multimedia/camera/qcamerainfo.h @@ -68,6 +68,12 @@ private: class QCameraInfoPrivate; class Q_MULTIMEDIA_EXPORT QCameraInfo { + Q_GADGET + Q_PROPERTY(QByteArray id READ id CONSTANT) + Q_PROPERTY(QString description READ description CONSTANT) + Q_PROPERTY(bool isDefault READ isDefault CONSTANT) + Q_PROPERTY(Position position READ position CONSTANT) + Q_ENUMS(Position) public: QCameraInfo(); QCameraInfo(const QCameraInfo& other); diff --git a/src/multimedia/platform/darwin/qdarwindevicemanager.mm b/src/multimedia/platform/darwin/qdarwindevicemanager.mm index e699268cc..4a6a9a484 100644 --- a/src/multimedia/platform/darwin/qdarwindevicemanager.mm +++ b/src/multimedia/platform/darwin/qdarwindevicemanager.mm @@ -306,9 +306,7 @@ void QDarwinDeviceManager::updateCameraDevices() if (cameras != m_cameraDevices) { m_cameraDevices = cameras; - auto *m = deviceManager(); - if (m) - m->videoInputsChanged(); + videoInputsChanged(); } } @@ -316,20 +314,16 @@ void QDarwinDeviceManager::updateCameraDevices() void QDarwinDeviceManager::updateAudioDevices() { #ifdef Q_OS_MACOS - auto *m = deviceManager(); - QList<QAudioDeviceInfo> inputs = availableAudioDevices(QAudio::AudioInput); if (m_audioInputs != inputs) { m_audioInputs = inputs; - if (m) - m->audioInputsChanged(); + audioInputsChanged(); } QList<QAudioDeviceInfo> outputs = availableAudioDevices(QAudio::AudioOutput); if (m_audioOutputs!= outputs) { m_audioOutputs = outputs; - if (m) - m->audioOutputsChanged(); + audioOutputsChanged(); } #endif } diff --git a/src/multimedia/platform/gstreamer/qgstreamerdevicemanager.cpp b/src/multimedia/platform/gstreamer/qgstreamerdevicemanager.cpp index 4cde85fc3..678603c6e 100644 --- a/src/multimedia/platform/gstreamer/qgstreamerdevicemanager.cpp +++ b/src/multimedia/platform/gstreamer/qgstreamerdevicemanager.cpp @@ -199,22 +199,18 @@ QAbstractAudioOutput *QGstreamerDeviceManager::createAudioOutputDevice(const QAu void QGstreamerDeviceManager::addDevice(GstDevice *device) { - auto *m = deviceManager(); gchar *type = gst_device_get_device_class(device); // qDebug() << "adding device:" << device << type << gst_device_get_display_name(device) << gst_structure_to_string(gst_device_get_properties(device)); gst_object_ref(device); if (!strcmp(type, "Video/Source")) { m_videoSources.insert(device); - if (m) - emit m->videoInputsChanged(); + videoInputsChanged(); } else if (!strcmp(type, "Audio/Source")) { m_audioSources.insert(device); - if (m) - emit m->audioInputsChanged(); + audioInputsChanged(); } else if (!strcmp(type, "Audio/Sink")) { m_audioSinks.insert(device); - if (m) - emit m->audioOutputsChanged(); + audioOutputsChanged(); } else { gst_object_unref(device); } @@ -223,17 +219,13 @@ void QGstreamerDeviceManager::addDevice(GstDevice *device) void QGstreamerDeviceManager::removeDevice(GstDevice *device) { - auto *m = deviceManager(); // qDebug() << "removing device:" << device << gst_device_get_display_name(device); if (m_videoSources.remove(device)) { - if (m) - emit m->videoInputsChanged(); + videoInputsChanged(); } else if (m_audioSources.remove(device)) { - if (m) - emit m->audioInputsChanged(); + audioInputsChanged(); } else if (m_audioSinks.remove(device)) { - if (m) - emit m->audioOutputsChanged(); + audioOutputsChanged(); } gst_object_unref(device); diff --git a/src/multimedia/platform/qplatformmediadevicemanager.cpp b/src/multimedia/platform/qplatformmediadevicemanager.cpp index 53ae652f6..f2a0d4f4e 100644 --- a/src/multimedia/platform/qplatformmediadevicemanager.cpp +++ b/src/multimedia/platform/qplatformmediadevicemanager.cpp @@ -38,6 +38,7 @@ ****************************************************************************/ #include "qplatformmediadevicemanager_p.h" +#include "qmediadevicemanager.h" #include "qaudiodeviceinfo.h" #include "qcamerainfo.h" #include "qaudiosystem_p.h" @@ -102,5 +103,23 @@ QAbstractAudioOutput* QPlatformMediaDeviceManager::audioOutputDevice(const QAudi return p; } +void QPlatformMediaDeviceManager::audioInputsChanged() const +{ + for (auto m : m_deviceManagers) + emit m->audioInputsChanged(); +} + +void QPlatformMediaDeviceManager::audioOutputsChanged() const +{ + for (auto m : m_deviceManagers) + emit m->audioOutputsChanged(); +} + +void QPlatformMediaDeviceManager::videoInputsChanged() const +{ + for (auto m : m_deviceManagers) + emit m->videoInputsChanged(); +} + QT_END_NAMESPACE diff --git a/src/multimedia/platform/qplatformmediadevicemanager_p.h b/src/multimedia/platform/qplatformmediadevicemanager_p.h index 9a8af446c..d46a908a6 100644 --- a/src/multimedia/platform/qplatformmediadevicemanager_p.h +++ b/src/multimedia/platform/qplatformmediadevicemanager_p.h @@ -52,6 +52,7 @@ // #include <private/qtmultimediaglobal_p.h> +#include <qlist.h> QT_BEGIN_NAMESPACE @@ -81,15 +82,22 @@ public: QAbstractAudioInput *audioInputDevice(const QAudioFormat &format, const QAudioDeviceInfo &deviceInfo); QAbstractAudioOutput *audioOutputDevice(const QAudioFormat &format, const QAudioDeviceInfo &deviceInfo); - QMediaDeviceManager *deviceManager() const { return m_manager; } - void setDeviceManager(QMediaDeviceManager *m) + void addDeviceManager(QMediaDeviceManager *m) { - Q_ASSERT(!m_manager); - m_manager = m; + m_deviceManagers.append(m); } + void removeDeviceManager(QMediaDeviceManager *m) + { + m_deviceManagers.removeAll(m); + } + +protected: + void audioInputsChanged() const; + void audioOutputsChanged() const; + void videoInputsChanged() const; private: - QMediaDeviceManager *m_manager = nullptr; + QList<QMediaDeviceManager *> m_deviceManagers; }; QT_END_NAMESPACE diff --git a/src/multimedia/qmediadevicemanager.cpp b/src/multimedia/qmediadevicemanager.cpp index d5441df83..1abaea3fe 100644 --- a/src/multimedia/qmediadevicemanager.cpp +++ b/src/multimedia/qmediadevicemanager.cpp @@ -50,18 +50,13 @@ class QMediaDeviceManagerPrivate { public: QMediaDeviceManagerPrivate() - : manager(new QMediaDeviceManager) { pmanager = QPlatformMediaIntegration::instance()->deviceManager(); - pmanager->setDeviceManager(manager); } ~QMediaDeviceManagerPrivate() { - delete manager; - manager = nullptr; } - QMediaDeviceManager *manager = nullptr; QPlatformMediaDeviceManager *pmanager = nullptr; } priv; @@ -91,14 +86,6 @@ public: QMediaDeviceManager is a singleton object and all getters are thread-safe. */ -/*! - Returns the device manager instance. -*/ -QMediaDeviceManager *QMediaDeviceManager::instance() -{ - return priv.manager; -} - QList<QAudioDeviceInfo> QMediaDeviceManager::audioInputs() { return priv.pmanager->audioInputs(); @@ -123,7 +110,7 @@ QList<QCameraInfo> QMediaDeviceManager::videoInputs() QAudioDeviceInfo QMediaDeviceManager::defaultAudioInput() { const auto inputs = audioInputs(); - for (auto info : inputs) + for (const auto &info : inputs) if (info.isDefault()) return info; return inputs.value(0); @@ -132,7 +119,7 @@ QAudioDeviceInfo QMediaDeviceManager::defaultAudioInput() QAudioDeviceInfo QMediaDeviceManager::defaultAudioOutput() { const auto outputs = audioOutputs(); - for (auto info : outputs) + for (const auto &info : outputs) if (info.isDefault()) return info; return outputs.value(0); @@ -149,7 +136,7 @@ QAudioDeviceInfo QMediaDeviceManager::defaultAudioOutput() QCameraInfo QMediaDeviceManager::defaultVideoInput() { const auto inputs = videoInputs(); - for (auto info : inputs) + for (const auto &info : inputs) if (info.isDefault()) return info; return inputs.value(0); @@ -158,12 +145,19 @@ QCameraInfo QMediaDeviceManager::defaultVideoInput() /*! \internal */ -QMediaDeviceManager::QMediaDeviceManager() = default; +QMediaDeviceManager::QMediaDeviceManager(QObject *parent) + : QObject(parent) +{ + priv.pmanager->addDeviceManager(this); +} /*! \internal */ -QMediaDeviceManager::~QMediaDeviceManager() = default; +QMediaDeviceManager::~QMediaDeviceManager() +{ + priv.pmanager->removeDeviceManager(this); +} QT_END_NAMESPACE diff --git a/src/multimedia/qmediadevicemanager.h b/src/multimedia/qmediadevicemanager.h index 717a4bdbf..b8b4e88ab 100644 --- a/src/multimedia/qmediadevicemanager.h +++ b/src/multimedia/qmediadevicemanager.h @@ -53,9 +53,16 @@ class QMediaDeviceManagerPrivate; class Q_MULTIMEDIA_EXPORT QMediaDeviceManager : public QObject { Q_OBJECT + Q_PROPERTY(QList<QAudioDeviceInfo> audioInputs READ audioInputs NOTIFY audioInputsChanged) + Q_PROPERTY(QList<QAudioDeviceInfo> audioOutputs READ audioOutputs NOTIFY audioOutputsChanged) + Q_PROPERTY(QList<QCameraInfo> videoInputs READ videoInputs NOTIFY videoInputsChanged) + Q_PROPERTY(QAudioDeviceInfo defaultAudioInput READ defaultAudioInput NOTIFY audioInputsChanged) + Q_PROPERTY(QAudioDeviceInfo defaultAudioOutput READ defaultAudioOutput NOTIFY audioOutputsChanged) + Q_PROPERTY(QCameraInfo defaultVideoInput READ defaultVideoInput NOTIFY videoInputsChanged) public: - static QMediaDeviceManager *instance(); + QMediaDeviceManager(QObject *parent = nullptr); + ~QMediaDeviceManager(); static QList<QAudioDeviceInfo> audioInputs(); static QList<QAudioDeviceInfo> audioOutputs(); @@ -71,8 +78,6 @@ signals: void videoInputsChanged(); private: - QMediaDeviceManager(); - ~QMediaDeviceManager(); friend class QMediaDeviceManagerPrivate; }; diff --git a/src/multimediaquick/qtmultimediaquicktypes_p.h b/src/multimediaquick/qtmultimediaquicktypes_p.h index b7c2e9d79..8c438378b 100644 --- a/src/multimediaquick/qtmultimediaquicktypes_p.h +++ b/src/multimediaquick/qtmultimediaquicktypes_p.h @@ -127,10 +127,30 @@ struct QMediaMetaDataForeign { Q_GADGET QML_FOREIGN(QMediaMetaData) - QML_NAMED_ELEMENT(MediaMetaData) + QML_NAMED_ELEMENT(mediaMetaData) }; +struct QMediaDeviceManagerForeign +{ + Q_GADGET + QML_SINGLETON + QML_FOREIGN(QMediaDeviceManager) + QML_NAMED_ELEMENT(MediaDeviceManager) +}; + +struct QAudioDeviceInfoForeign +{ + Q_GADGET + QML_FOREIGN(QAudioDeviceInfo) + QML_NAMED_ELEMENT(audioDeviceInfo) +}; +struct QCameraInfoForeign +{ + Q_GADGET + QML_FOREIGN(QCameraInfo) + QML_NAMED_ELEMENT(cameraInfo) +}; QT_END_NAMESPACE diff --git a/tests/auto/integration/qaudiodeviceinfo/tst_qaudiodeviceinfo.cpp b/tests/auto/integration/qaudiodeviceinfo/tst_qaudiodeviceinfo.cpp index 44e58fa84..d5f3fc9f4 100644 --- a/tests/auto/integration/qaudiodeviceinfo/tst_qaudiodeviceinfo.cpp +++ b/tests/auto/integration/qaudiodeviceinfo/tst_qaudiodeviceinfo.cpp @@ -74,21 +74,19 @@ void tst_QAudioDeviceInfo::initTestCase() void tst_QAudioDeviceInfo::checkAvailableDefaultInput() { - QMediaDeviceManager *manager = QMediaDeviceManager::instance(); // Only perform tests if audio input device exists! - QList<QAudioDeviceInfo> devices = manager->audioInputs(); + QList<QAudioDeviceInfo> devices = QMediaDeviceManager::audioInputs(); if (devices.size() > 0) { - QVERIFY(!manager->defaultAudioInput().isNull()); + QVERIFY(!QMediaDeviceManager::defaultAudioInput().isNull()); } } void tst_QAudioDeviceInfo::checkAvailableDefaultOutput() { - QMediaDeviceManager *manager = QMediaDeviceManager::instance(); // Only perform tests if audio input device exists! - QList<QAudioDeviceInfo> devices = manager->audioOutputs(); + QList<QAudioDeviceInfo> devices = QMediaDeviceManager::audioOutputs(); if (devices.size() > 0) { - QVERIFY(!manager->defaultAudioOutput().isNull()); + QVERIFY(!QMediaDeviceManager::defaultAudioOutput().isNull()); } } |