diff options
author | Artem Dyomin <artem.dyomin@qt.io> | 2023-06-12 09:56:16 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2023-06-12 19:44:03 +0000 |
commit | 186d9b5a8d452bbc79274db04fedfb4647240964 (patch) | |
tree | 1ad3d90d1cfe93a04dc4f5e18c73649e9f698ca6 | |
parent | 32aa80fdd0b0eb29a1cf172c5bd9ef91da0909b8 (diff) |
Prettify calling of QMediaDevice signals
The idea is inheriting QPlatformMediaDevices from QObject and
connect it to QMediaDevice instances instead of manual collecting
and managing pointers.
Advantages:
- avoid UB behavior with static object destruction order in case
a user makes any QMediaDevices static.
- align the signals parent: send singals from the QMediaDevice instance
Task-number: QTBUG-110071
Change-Id: I7c30694210864ff8c6c90c7299abdbf383f398fa
Reviewed-by: Pavel Dubsky <pavel.dubsky@qt.io>
Reviewed-by: Lars Knoll <lars@knoll.priv.no>
Reviewed-by: Jøger Hansegård <joger.hansegard@qt.io>
(cherry picked from commit a9471cbff3bf9d978620e6e962ea196acdd8dc0b)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/multimedia/android/qandroidmediadevices.cpp | 4 | ||||
-rw-r--r-- | src/multimedia/darwin/qdarwinmediadevices.mm | 4 | ||||
-rw-r--r-- | src/multimedia/platform/qplatformmediadevices.cpp | 23 | ||||
-rw-r--r-- | src/multimedia/platform/qplatformmediadevices_p.h | 29 | ||||
-rw-r--r-- | src/multimedia/platform/qplatformvideodevices.cpp | 2 | ||||
-rw-r--r-- | src/multimedia/qmediadevices.cpp | 14 | ||||
-rw-r--r-- | src/multimedia/windows/qwindowsmediadevices.cpp | 4 | ||||
-rw-r--r-- | src/plugins/multimedia/darwin/camera/qavfcamerabase.mm | 2 | ||||
-rw-r--r-- | src/plugins/multimedia/ffmpeg/qv4l2camera.cpp | 2 | ||||
-rw-r--r-- | src/plugins/multimedia/gstreamer/qgstreamervideodevices.cpp | 4 | ||||
-rw-r--r-- | src/plugins/multimedia/windows/qwindowsvideodevices.cpp | 2 |
11 files changed, 30 insertions, 60 deletions
diff --git a/src/multimedia/android/qandroidmediadevices.cpp b/src/multimedia/android/qandroidmediadevices.cpp index 9e45479a5..022e758da 100644 --- a/src/multimedia/android/qandroidmediadevices.cpp +++ b/src/multimedia/android/qandroidmediadevices.cpp @@ -43,12 +43,12 @@ QPlatformAudioSink *QAndroidMediaDevices::createAudioSink(const QAudioDevice &de void QAndroidMediaDevices::forwardAudioOutputsChanged() { - audioOutputsChanged(); + emit audioOutputsChanged(); } void QAndroidMediaDevices::forwardAudioInputsChanged() { - audioInputsChanged(); + emit audioInputsChanged(); } static void onAudioInputDevicesUpdated(JNIEnv */*env*/, jobject /*thiz*/) diff --git a/src/multimedia/darwin/qdarwinmediadevices.mm b/src/multimedia/darwin/qdarwinmediadevices.mm index 1a9dbe218..3ab7e6c05 100644 --- a/src/multimedia/darwin/qdarwinmediadevices.mm +++ b/src/multimedia/darwin/qdarwinmediadevices.mm @@ -238,7 +238,7 @@ void QDarwinMediaDevices::onInputsUpdated() auto inputs = availableAudioDevices(QAudioDevice::Input); if (m_cachedAudioInputs != inputs) { m_cachedAudioInputs = inputs; - audioInputsChanged(); + emit audioInputsChanged(); } } @@ -247,7 +247,7 @@ void QDarwinMediaDevices::onOutputsUpdated() auto outputs = availableAudioDevices(QAudioDevice::Output); if (m_cachedAudioOutputs != outputs) { m_cachedAudioOutputs = outputs; - audioOutputsChanged(); + emit audioOutputsChanged(); } } diff --git a/src/multimedia/platform/qplatformmediadevices.cpp b/src/multimedia/platform/qplatformmediadevices.cpp index 95cf3b7a0..09c26a670 100644 --- a/src/multimedia/platform/qplatformmediadevices.cpp +++ b/src/multimedia/platform/qplatformmediadevices.cpp @@ -132,27 +132,8 @@ QPlatformAudioSink *QPlatformMediaDevices::audioOutputDevice(const QAudioFormat return p; } -void QPlatformMediaDevices::audioInputsChanged() const -{ - const auto devices = allMediaDevices(); - for (auto m : devices) - emit m->audioInputsChanged(); -} - -void QPlatformMediaDevices::audioOutputsChanged() const -{ - const auto devices = allMediaDevices(); - for (auto m : devices) - emit m->audioOutputsChanged(); -} - -void QPlatformMediaDevices::videoInputsChanged() const -{ - const auto devices = allMediaDevices(); - for (auto m : devices) - emit m->videoInputsChanged(); -} - void QPlatformMediaDevices::prepareAudio() { } QT_END_NAMESPACE + +#include "moc_qplatformmediadevices_p.cpp" diff --git a/src/multimedia/platform/qplatformmediadevices_p.h b/src/multimedia/platform/qplatformmediadevices_p.h index 9b8d0d5e7..d475495d1 100644 --- a/src/multimedia/platform/qplatformmediadevices_p.h +++ b/src/multimedia/platform/qplatformmediadevices_p.h @@ -17,10 +17,10 @@ #include <private/qtmultimediaglobal_p.h> #include <qlist.h> +#include <qobject.h> QT_BEGIN_NAMESPACE -class QObject; class QMediaDevices; class QAudioDevice; class QCameraDevice; @@ -29,11 +29,12 @@ class QPlatformAudioSink; class QAudioFormat; class QPlatformMediaIntegration; -class Q_MULTIMEDIA_EXPORT QPlatformMediaDevices +class Q_MULTIMEDIA_EXPORT QPlatformMediaDevices : public QObject { + Q_OBJECT public: QPlatformMediaDevices(); - virtual ~QPlatformMediaDevices(); + ~QPlatformMediaDevices() override; static void setDevices(QPlatformMediaDevices *); static QPlatformMediaDevices *instance(); @@ -49,26 +50,12 @@ public: QPlatformAudioSink *audioOutputDevice(const QAudioFormat &format, const QAudioDevice &deviceInfo, QObject *parent); - void addMediaDevices(QMediaDevices *m) - { - m_devices.append(m); - } - void removeMediaDevices(QMediaDevices *m) - { - m_devices.removeAll(m); - } - - QList<QMediaDevices *> allMediaDevices() const { return m_devices; } - - void videoInputsChanged() const; - virtual void prepareAudio(); -protected: - void audioInputsChanged() const; - void audioOutputsChanged() const; - - QList<QMediaDevices *> m_devices; +Q_SIGNALS: + void audioInputsChanged(); + void audioOutputsChanged(); + void videoInputsChanged(); }; QT_END_NAMESPACE diff --git a/src/multimedia/platform/qplatformvideodevices.cpp b/src/multimedia/platform/qplatformvideodevices.cpp index 9d2fc3c31..e556bb899 100644 --- a/src/multimedia/platform/qplatformvideodevices.cpp +++ b/src/multimedia/platform/qplatformvideodevices.cpp @@ -13,7 +13,7 @@ QPlatformVideoDevices::~QPlatformVideoDevices() void QPlatformVideoDevices::videoInputsChanged() { - QPlatformMediaDevices::instance()->videoInputsChanged(); + emit QPlatformMediaDevices::instance()->videoInputsChanged(); } QT_END_NAMESPACE diff --git a/src/multimedia/qmediadevices.cpp b/src/multimedia/qmediadevices.cpp index d8486e603..7302d3d98 100644 --- a/src/multimedia/qmediadevices.cpp +++ b/src/multimedia/qmediadevices.cpp @@ -247,17 +247,19 @@ QCameraDevice QMediaDevices::defaultVideoInput() QMediaDevices::QMediaDevices(QObject *parent) : QObject(parent) { - QPlatformMediaDevices::instance()->addMediaDevices(this); + auto platformDevices = QPlatformMediaDevices::instance(); + connect(platformDevices, &QPlatformMediaDevices::videoInputsChanged, this, + &QMediaDevices::videoInputsChanged); + connect(platformDevices, &QPlatformMediaDevices::audioInputsChanged, this, + &QMediaDevices::audioInputsChanged); + connect(platformDevices, &QPlatformMediaDevices::audioOutputsChanged, this, + &QMediaDevices::audioOutputsChanged); } /*! \internal */ -QMediaDevices::~QMediaDevices() -{ - QPlatformMediaDevices::instance()->removeMediaDevices(this); -} - +QMediaDevices::~QMediaDevices() = default; QT_END_NAMESPACE diff --git a/src/multimedia/windows/qwindowsmediadevices.cpp b/src/multimedia/windows/qwindowsmediadevices.cpp index a7e54daf5..1358c317b 100644 --- a/src/multimedia/windows/qwindowsmediadevices.cpp +++ b/src/multimedia/windows/qwindowsmediadevices.cpp @@ -125,9 +125,9 @@ public: { // windowsMediaDevice may be deleted as we are executing the callback if (flow == EDataFlow::eCapture) { - m_windowsMediaDevices->audioInputsChanged(); + emit m_windowsMediaDevices->audioInputsChanged(); } else if (flow == EDataFlow::eRender) { - m_windowsMediaDevices->audioOutputsChanged(); + emit m_windowsMediaDevices->audioOutputsChanged(); } } diff --git a/src/plugins/multimedia/darwin/camera/qavfcamerabase.mm b/src/plugins/multimedia/darwin/camera/qavfcamerabase.mm index 9a8cd62e8..1cf7bb58c 100644 --- a/src/plugins/multimedia/darwin/camera/qavfcamerabase.mm +++ b/src/plugins/multimedia/darwin/camera/qavfcamerabase.mm @@ -218,7 +218,7 @@ void QAVFVideoDevices::updateCameraDevices() if (cameras != m_cameraDevices) { m_cameraDevices = cameras; - videoInputsChanged(); + emit videoInputsChanged(); } } diff --git a/src/plugins/multimedia/ffmpeg/qv4l2camera.cpp b/src/plugins/multimedia/ffmpeg/qv4l2camera.cpp index fcab72faa..b635a7fce 100644 --- a/src/plugins/multimedia/ffmpeg/qv4l2camera.cpp +++ b/src/plugins/multimedia/ffmpeg/qv4l2camera.cpp @@ -54,7 +54,7 @@ QList<QCameraDevice> QV4L2CameraDevices::videoDevices() const void QV4L2CameraDevices::checkCameras() { if (doCheckCameras()) - videoInputsChanged(); + emit videoInputsChanged(); } static const struct { diff --git a/src/plugins/multimedia/gstreamer/qgstreamervideodevices.cpp b/src/plugins/multimedia/gstreamer/qgstreamervideodevices.cpp index 3902d4e9e..510978880 100644 --- a/src/plugins/multimedia/gstreamer/qgstreamervideodevices.cpp +++ b/src/plugins/multimedia/gstreamer/qgstreamervideodevices.cpp @@ -122,7 +122,7 @@ void QGstreamerVideoDevices::addDevice(GstDevice *device) if (gst_device_has_classes(device, "Video/Source")) { gst_object_ref(device); m_videoSources.push_back({device, QByteArray::number(m_idGenerator)}); - videoInputsChanged(); + emit videoInputsChanged(); m_idGenerator++; } } @@ -134,7 +134,7 @@ void QGstreamerVideoDevices::removeDevice(GstDevice *device) if (it != m_videoSources.end()) { m_videoSources.erase(it); - videoInputsChanged(); + emit videoInputsChanged(); } gst_object_unref(device); diff --git a/src/plugins/multimedia/windows/qwindowsvideodevices.cpp b/src/plugins/multimedia/windows/qwindowsvideodevices.cpp index 305bb1227..2dae560b9 100644 --- a/src/plugins/multimedia/windows/qwindowsvideodevices.cpp +++ b/src/plugins/multimedia/windows/qwindowsvideodevices.cpp @@ -24,7 +24,7 @@ LRESULT QT_WIN_CALLBACK deviceNotificationWndProc(HWND hWnd, UINT message, WPARA auto wmd = reinterpret_cast<QWindowsVideoDevices *>(GetWindowLongPtr(hWnd, GWLP_USERDATA)); if (wmd) { if (wParam == DBT_DEVICEARRIVAL || wParam == DBT_DEVICEREMOVECOMPLETE) { - wmd->videoInputsChanged(); + emit wmd->videoInputsChanged(); } } } |