diff options
author | Jøger Hansegård <joger.hansegard@qt.io> | 2024-01-28 18:21:52 +0100 |
---|---|---|
committer | Jøger Hansegård <joger.hansegard@qt.io> | 2024-01-29 16:26:35 +0100 |
commit | 5070a7343504bbde988a903c2ef0a2d18af4303b (patch) | |
tree | bfa6f6eb7cd34ba5959bc40b4f70e41a7246c21e /src/multimedia/platform | |
parent | 2964b974c24b0e85f7923a2ff0b413d6ba80381c (diff) |
Use regular plugin loader also in multimedia unit tests
This patch switches to regular plugin loading also in unit tests by
introducing a 'mock' media plugin. This plugin is a static plugin, and
does not have to be located in the plugin loader's search path.
This allow us to create the mock plugin by setting an environment
variable instead injecting a mock factory into the
qplatformmediaintegration through private APIs.
The purpose of this change is to simplify how we create the multimedia
backend, and later get better control over its lifetime.
Pick-to: 6.7 6.6 6.5
Change-Id: Ie6cc0ebecc21fb4d81e57cc9f257e4fc82f96e6b
Reviewed-by: Artem Dyomin <artem.dyomin@qt.io>
Diffstat (limited to 'src/multimedia/platform')
-rw-r--r-- | src/multimedia/platform/qplatformmediaintegration.cpp | 53 | ||||
-rw-r--r-- | src/multimedia/platform/qplatformmediaintegration_p.h | 5 |
2 files changed, 17 insertions, 41 deletions
diff --git a/src/multimedia/platform/qplatformmediaintegration.cpp b/src/multimedia/platform/qplatformmediaintegration.cpp index e4258a179..d2ef66b7f 100644 --- a/src/multimedia/platform/qplatformmediaintegration.cpp +++ b/src/multimedia/platform/qplatformmediaintegration.cpp @@ -75,10 +75,24 @@ namespace { struct InstanceHolder { - // TODO: replace the mutex with std::once - QBasicMutex mutex; + InstanceHolder() + { + const auto backends = availableBackends(); + QString backend = QString::fromUtf8(qgetenv("QT_MEDIA_BACKEND")); + if (backend.isEmpty() && !backends.isEmpty()) + backend = defaultBackend(backends); + + qCDebug(qLcMediaPlugin) << "loading backend" << backend; + instance.reset( + qLoadPlugin<QPlatformMediaIntegration, QPlatformMediaPlugin>(loader(), backend)); + + if (!instance) { + qWarning() << "could not load multimedia backend" << backend; + instance = std::make_unique<QDummyIntegration>(); + } + } + std::unique_ptr<QPlatformMediaIntegration> instance; - std::function<std::unique_ptr<QPlatformMediaIntegration>()> factory; }; Q_GLOBAL_STATIC(InstanceHolder, instanceHolder); @@ -89,42 +103,9 @@ QT_BEGIN_NAMESPACE QPlatformMediaIntegration *QPlatformMediaIntegration::instance() { - QMutexLocker locker(&instanceHolder->mutex); - if (instanceHolder->instance) - return instanceHolder->instance.get(); - - if (instanceHolder->factory) { - instanceHolder->instance = instanceHolder->factory(); - return instanceHolder->instance.get(); - } - - const auto backends = availableBackends(); - QString backend = QString::fromUtf8(qgetenv("QT_MEDIA_BACKEND")); - if (backend.isEmpty() && !backends.isEmpty()) - backend = defaultBackend(backends); - - qCDebug(qLcMediaPlugin) << "loading backend" << backend; - instanceHolder->instance.reset( - qLoadPlugin<QPlatformMediaIntegration, QPlatformMediaPlugin>(loader(), backend)); - - if (!instanceHolder->instance) { - qWarning() << "could not load multimedia backend" << backend; - instanceHolder->instance = std::make_unique<QDummyIntegration>(); - } - return instanceHolder->instance.get(); } -/* - This API is there to be able to test with a mock backend. -*/ -void QPlatformMediaIntegration::setPlatformFactory(std::function<std::unique_ptr<QPlatformMediaIntegration>()> factory) -{ - Q_ASSERT((factory == nullptr) ^ (instanceHolder->factory == nullptr)); - instanceHolder->instance.reset(); - instanceHolder->factory = std::move(factory); -} - QList<QCameraDevice> QPlatformMediaIntegration::videoInputs() { auto devices = videoDevices(); diff --git a/src/multimedia/platform/qplatformmediaintegration_p.h b/src/multimedia/platform/qplatformmediaintegration_p.h index 10845326c..3f72c618b 100644 --- a/src/multimedia/platform/qplatformmediaintegration_p.h +++ b/src/multimedia/platform/qplatformmediaintegration_p.h @@ -101,11 +101,6 @@ protected: virtual QPlatformCapturableWindows *createCapturableWindows() { return nullptr; } private: - friend class QMockIntegrationFactory; - // API to be able to test with a mock backend - static void setPlatformFactory(std::function<std::unique_ptr<QPlatformMediaIntegration>()> factory); - -private: std::unique_ptr<QPlatformVideoDevices> m_videoDevices; std::once_flag m_videoDevicesOnceFlag; |