summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtem Dyomin <artem.dyomin@qt.io>2023-06-12 09:56:16 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2023-06-12 19:44:03 +0000
commit186d9b5a8d452bbc79274db04fedfb4647240964 (patch)
tree1ad3d90d1cfe93a04dc4f5e18c73649e9f698ca6
parent32aa80fdd0b0eb29a1cf172c5bd9ef91da0909b8 (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.cpp4
-rw-r--r--src/multimedia/darwin/qdarwinmediadevices.mm4
-rw-r--r--src/multimedia/platform/qplatformmediadevices.cpp23
-rw-r--r--src/multimedia/platform/qplatformmediadevices_p.h29
-rw-r--r--src/multimedia/platform/qplatformvideodevices.cpp2
-rw-r--r--src/multimedia/qmediadevices.cpp14
-rw-r--r--src/multimedia/windows/qwindowsmediadevices.cpp4
-rw-r--r--src/plugins/multimedia/darwin/camera/qavfcamerabase.mm2
-rw-r--r--src/plugins/multimedia/ffmpeg/qv4l2camera.cpp2
-rw-r--r--src/plugins/multimedia/gstreamer/qgstreamervideodevices.cpp4
-rw-r--r--src/plugins/multimedia/windows/qwindowsvideodevices.cpp2
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();
}
}
}