summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2021-02-11 22:34:54 +0100
committerLars Knoll <lars.knoll@qt.io>2021-02-17 08:27:33 +0000
commitd7aa862d368d6d75fa3413f7e3ea7bcbf758c5f1 (patch)
treec424184ccec45d9149223af33cf7d5ad04c12a13
parenta200375e8a792ca112daa9c521ff682d1539815e (diff)
Remove the QMediaSink inheritance from QMediaRecorder
Change-Id: Ifd504569c3e50d76bfd8c8b5ea6decc53a032464 Reviewed-by: Doris Verria <doris.verria@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
-rw-r--r--src/multimedia/recording/qmediarecorder.cpp168
-rw-r--r--src/multimedia/recording/qmediarecorder.h19
-rw-r--r--src/multimedia/recording/qmediarecorder_p.h12
-rw-r--r--tests/auto/unit/multimedia/qaudiorecorder/tst_qaudiorecorder.cpp4
-rw-r--r--tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp37
-rw-r--r--tests/auto/unit/multimedia/qmediasink/tst_qmediasink.cpp7
6 files changed, 78 insertions, 169 deletions
diff --git a/src/multimedia/recording/qmediarecorder.cpp b/src/multimedia/recording/qmediarecorder.cpp
index 8b1b27bec..777e2ba9b 100644
--- a/src/multimedia/recording/qmediarecorder.cpp
+++ b/src/multimedia/recording/qmediarecorder.cpp
@@ -73,15 +73,6 @@ QT_BEGIN_NAMESPACE
\snippet multimedia-snippets/media.cpp Media recorder
*/
-static void qRegisterMediaRecorderMetaTypes()
-{
- qRegisterMetaType<QMediaRecorder::State>("QMediaRecorder::State");
- qRegisterMetaType<QMediaRecorder::Status>("QMediaRecorder::Status");
- qRegisterMetaType<QMediaRecorder::Error>("QMediaRecorder::Error");
-}
-
-Q_CONSTRUCTOR_FUNCTION(qRegisterMediaRecorderMetaTypes)
-
#define ENUM_NAME(c,e,v) (c::staticMetaObject.enumerator(c::staticMetaObject.indexOfEnumerator(e)).valueToKey((v)))
@@ -113,13 +104,6 @@ void QMediaRecorderPrivate::_q_error(int error, const QString &errorString)
emit q->error(this->error);
}
-void QMediaRecorderPrivate::_q_serviceDestroyed()
-{
- mediaSource = nullptr;
- control = nullptr;
- settingsChanged = true;
-}
-
void QMediaRecorderPrivate::_q_updateActualLocation(const QUrl &location)
{
if (actualLocation != location) {
@@ -157,7 +141,6 @@ void QMediaRecorderPrivate::_q_applySettings()
void QMediaRecorderPrivate::restartCamera()
{
//restart camera if it can't apply new settings in the Active state
- QCamera *camera = qobject_cast<QCamera*>(mediaSource);
if (camera) {
QMetaObject::invokeMethod(camera,
"_q_preparePropertyChange",
@@ -195,11 +178,15 @@ QMediaRecorder::QMediaRecorder(QMediaRecorder::CaptureMode mode, QObject *parent
d->notifyTimer = new QTimer(this);
connect(d->notifyTimer, SIGNAL(timeout()), SLOT(_q_notify()));
- QMediaService *service = QMediaPlatformIntegration::instance()->createCaptureInterface(mode);
- setMediaSource(new QAudioRecorderObject(this, service));
+ if (mode != AudioOnly) {
+ setCamera(new QCamera(this));
+ } else {
+ auto *captureIface = QMediaPlatformIntegration::instance()->createCaptureInterface(mode);
+ d->control = qobject_cast<QMediaRecorderControl*>(captureIface->requestControl(QMediaRecorderControl_iid));
+ }
}
-QMediaRecorder::QMediaRecorder(QMediaSource *mediaSource, QObject *parent)
+QMediaRecorder::QMediaRecorder(QCamera *camera, QObject *parent)
: QObject(parent),
d_ptr(new QMediaRecorderPrivate)
{
@@ -209,23 +196,7 @@ QMediaRecorder::QMediaRecorder(QMediaSource *mediaSource, QObject *parent)
d->notifyTimer = new QTimer(this);
connect(d->notifyTimer, SIGNAL(timeout()), SLOT(_q_notify()));
- setMediaSource(mediaSource);
-}
-
-/*!
- \internal
-*/
-QMediaRecorder::QMediaRecorder(QMediaRecorderPrivate &dd, QMediaSource *mediaSource, QObject *parent):
- QObject(parent),
- d_ptr(&dd)
-{
- Q_D(QMediaRecorder);
- d->q_ptr = this;
-
- d->notifyTimer = new QTimer(this);
- connect(d->notifyTimer, SIGNAL(timeout()), SLOT(_q_notify()));
-
- setMediaSource(mediaSource);
+ setCamera(camera);
}
/*!
@@ -234,7 +205,6 @@ QMediaRecorder::QMediaRecorder(QMediaRecorderPrivate &dd, QMediaSource *mediaSou
QMediaRecorder::~QMediaRecorder()
{
- setMediaSource(nullptr);
delete d_ptr;
}
@@ -299,110 +269,49 @@ void QMediaRecorder::removePropertyWatch(QByteArray const &name)
}
/*!
- Returns the QMediaSource instance that this QMediaRecorder is bound too,
- or 0 otherwise.
-*/
-QMediaSource *QMediaRecorder::mediaSource() const
-{
- return d_func()->mediaSource;
-}
-
-/*!
\internal
*/
-bool QMediaRecorder::setMediaSource(QMediaSource *object)
+bool QMediaRecorder::setCamera(QCamera *object)
{
Q_D(QMediaRecorder);
+ Q_ASSERT(!d->camera);
- if (object == d->mediaSource)
- return true;
-
- if (d->mediaSource) {
- if (d->control) {
- disconnect(d->control, SIGNAL(stateChanged(QMediaRecorder::State)),
- this, SLOT(_q_stateChanged(QMediaRecorder::State)));
-
- disconnect(d->control, SIGNAL(statusChanged(QMediaRecorder::Status)),
- this, SIGNAL(statusChanged(QMediaRecorder::Status)));
-
- disconnect(d->control, SIGNAL(mutedChanged(bool)),
- this, SIGNAL(mutedChanged(bool)));
-
- disconnect(d->control, SIGNAL(volumeChanged(qreal)),
- this, SIGNAL(volumeChanged(qreal)));
-
- disconnect(d->control, SIGNAL(durationChanged(qint64)),
- this, SIGNAL(durationChanged(qint64)));
-
- disconnect(d->control, SIGNAL(actualLocationChanged(QUrl)),
- this, SLOT(_q_updateActualLocation(QUrl)));
-
- disconnect(d->control, SIGNAL(error(int,QString)),
- this, SLOT(_q_error(int,QString)));
- }
-
- disconnect(this, SIGNAL(notifyIntervalChanged(int)), this, SLOT(_q_updateNotifyInterval(int)));
-
- QMediaService *service = d->mediaSource->service();
-
- if (service) {
- disconnect(service, SIGNAL(destroyed()), this, SLOT(_q_serviceDestroyed()));
-
- if (d->control)
- service->releaseControl(d->control);
- }
- }
+ d->camera = object;
- d->control = nullptr;
+ QMediaService *service = d->camera->service();
+ Q_ASSERT(service);
- d->mediaSource = object;
+ d->notifyTimer->setInterval(notifyInterval());
+ connect(this, SIGNAL(notifyIntervalChanged(int)), SLOT(_q_updateNotifyInterval(int)));
- if (d->mediaSource) {
- QMediaService *service = d->mediaSource->service();
+ d->control = qobject_cast<QMediaRecorderControl*>(service->requestControl(QMediaRecorderControl_iid));
+ Q_ASSERT(d->control);
- d->notifyTimer->setInterval(notifyInterval());
- connect(this, SIGNAL(notifyIntervalChanged(int)), SLOT(_q_updateNotifyInterval(int)));
+ connect(d->control, SIGNAL(stateChanged(QMediaRecorder::State)),
+ this, SLOT(_q_stateChanged(QMediaRecorder::State)));
- if (service) {
- d->control = qobject_cast<QMediaRecorderControl*>(service->requestControl(QMediaRecorderControl_iid));
+ connect(d->control, SIGNAL(statusChanged(QMediaRecorder::Status)),
+ this, SIGNAL(statusChanged(QMediaRecorder::Status)));
- if (d->control) {
- connect(d->control, SIGNAL(stateChanged(QMediaRecorder::State)),
- this, SLOT(_q_stateChanged(QMediaRecorder::State)));
+ connect(d->control, SIGNAL(mutedChanged(bool)),
+ this, SIGNAL(mutedChanged(bool)));
- connect(d->control, SIGNAL(statusChanged(QMediaRecorder::Status)),
- this, SIGNAL(statusChanged(QMediaRecorder::Status)));
+ connect(d->control, SIGNAL(volumeChanged(qreal)),
+ this, SIGNAL(volumeChanged(qreal)));
- connect(d->control, SIGNAL(mutedChanged(bool)),
- this, SIGNAL(mutedChanged(bool)));
+ connect(d->control, SIGNAL(durationChanged(qint64)),
+ this, SIGNAL(durationChanged(qint64)));
- connect(d->control, SIGNAL(volumeChanged(qreal)),
- this, SIGNAL(volumeChanged(qreal)));
+ connect(d->control, SIGNAL(actualLocationChanged(QUrl)),
+ this, SLOT(_q_updateActualLocation(QUrl)));
- connect(d->control, SIGNAL(durationChanged(qint64)),
- this, SIGNAL(durationChanged(qint64)));
+ connect(d->control, SIGNAL(error(int,QString)),
+ this, SLOT(_q_error(int,QString)));
- connect(d->control, SIGNAL(actualLocationChanged(QUrl)),
- this, SLOT(_q_updateActualLocation(QUrl)));
+ connect(d->control, SIGNAL(metaDataChanged()),
+ this, SIGNAL(metaDataChanged()));
- connect(d->control, SIGNAL(error(int,QString)),
- this, SLOT(_q_error(int,QString)));
-
- connect(d->control, SIGNAL(metaDataChanged()),
- this, SIGNAL(metaDataChanged()));
-
- connect(service, SIGNAL(destroyed()), this, SLOT(_q_serviceDestroyed()));
-
-
- d->applySettingsLater();
-
- return true;
- }
- }
-
- d->mediaSource = nullptr;
- return false;
- }
+ d->applySettingsLater();
return true;
}
@@ -816,8 +725,13 @@ QCameraInfo QMediaRecorder::videoInput() const
{
Q_D(const QMediaRecorder);
- auto *camera = qobject_cast<QCamera *>(d->mediaSource);
- return camera ? camera->cameraInfo() : QCameraInfo();
+ return d->camera ? d->camera->cameraInfo() : QCameraInfo();
+}
+
+QCamera *QMediaRecorder::camera() const
+{
+ Q_D(const QMediaRecorder);
+ return d->camera;
}
/*!
diff --git a/src/multimedia/recording/qmediarecorder.h b/src/multimedia/recording/qmediarecorder.h
index 844abf966..1d1c815a3 100644
--- a/src/multimedia/recording/qmediarecorder.h
+++ b/src/multimedia/recording/qmediarecorder.h
@@ -54,21 +54,17 @@ QT_BEGIN_NAMESPACE
class QUrl;
class QSize;
class QAudioFormat;
+class QCamera;
class QCameraInfo;
-QT_END_NAMESPACE
-
-QT_BEGIN_NAMESPACE
-
class QMediaRecorderService;
class QAudioEncoderSettings;
class QVideoEncoderSettings;
class QAudioDeviceInfo;
class QMediaRecorderPrivate;
-class Q_MULTIMEDIA_EXPORT QMediaRecorder : public QObject, public QMediaSink
+class Q_MULTIMEDIA_EXPORT QMediaRecorder : public QObject
{
Q_OBJECT
- Q_INTERFACES(QMediaSink)
Q_ENUMS(State)
Q_ENUMS(Status)
Q_ENUMS(Error)
@@ -116,7 +112,7 @@ public:
};
QMediaRecorder(CaptureMode mode = AudioOnly, QObject *parent = nullptr);
- explicit QMediaRecorder(QMediaSource *mediaSource, QObject *parent = nullptr);
+ explicit QMediaRecorder(QCamera *mediaSource, QObject *parent = nullptr);
~QMediaRecorder();
int notifyInterval() const;
@@ -124,9 +120,6 @@ public:
void addPropertyWatch(QByteArray const &name);
void removePropertyWatch(QByteArray const &name);
- QMediaSource *mediaSource() const override;
- QObject *asObject() override { return this; }
-
bool isAvailable() const;
QMultimedia::AvailabilityStatus availability() const;
@@ -156,6 +149,8 @@ public:
QAudioDeviceInfo audioInput() const;
QCameraInfo videoInput() const;
+ QCamera *camera() const;
+
public Q_SLOTS:
void record();
void pause();
@@ -179,8 +174,7 @@ Q_SIGNALS:
void metaDataChanged();
protected:
- QMediaRecorder(QMediaRecorderPrivate &dd, QMediaSource *mediaSource, QObject *parent = nullptr);
- bool setMediaSource(QMediaSource *object) override;
+ bool setCamera(QCamera *object);
QMediaRecorderPrivate *d_ptr;
private:
@@ -188,7 +182,6 @@ private:
Q_DECLARE_PRIVATE(QMediaRecorder)
Q_PRIVATE_SLOT(d_func(), void _q_stateChanged(QMediaRecorder::State))
Q_PRIVATE_SLOT(d_func(), void _q_error(int, const QString &))
- Q_PRIVATE_SLOT(d_func(), void _q_serviceDestroyed())
Q_PRIVATE_SLOT(d_func(), void _q_notify())
Q_PRIVATE_SLOT(d_func(), void _q_updateActualLocation(const QUrl &))
Q_PRIVATE_SLOT(d_func(), void _q_updateNotifyInterval(int))
diff --git a/src/multimedia/recording/qmediarecorder_p.h b/src/multimedia/recording/qmediarecorder_p.h
index 44b3e74b3..e4d6e4be8 100644
--- a/src/multimedia/recording/qmediarecorder_p.h
+++ b/src/multimedia/recording/qmediarecorder_p.h
@@ -52,8 +52,9 @@
//
#include "qmediarecorder.h"
-#include "qmediasource_p.h"
+#include "qcamera.h"
#include <QtCore/qurl.h>
+#include <QtCore/qpointer.h>
QT_BEGIN_NAMESPACE
@@ -63,6 +64,10 @@ class QAudioEncoderSettingsControl;
class QVideoEncoderSettingsControl;
class QTimer;
+#define Q_DECLARE_NON_CONST_PUBLIC(Class) \
+ inline Class* q_func() { return static_cast<Class *>(q_ptr); } \
+ friend class Class;
+
class QMediaRecorderPrivate
{
Q_DECLARE_NON_CONST_PUBLIC(QMediaRecorder)
@@ -73,7 +78,7 @@ public:
void applySettingsLater();
void restartCamera();
- QPointer<QMediaSource> mediaSource;
+ QPointer<QCamera> camera;
QMediaRecorderControl *control = nullptr;
@@ -91,7 +96,6 @@ public:
void _q_stateChanged(QMediaRecorder::State state);
void _q_error(int error, const QString &errorString);
- void _q_serviceDestroyed();
void _q_updateActualLocation(const QUrl &);
void _q_notify();
void _q_updateNotifyInterval(int ms);
@@ -100,6 +104,8 @@ public:
QMediaRecorder *q_ptr = nullptr;
};
+#undef Q_DECLARE_NON_CONST_PUBLIC
+
QT_END_NAMESPACE
#endif
diff --git a/tests/auto/unit/multimedia/qaudiorecorder/tst_qaudiorecorder.cpp b/tests/auto/unit/multimedia/qaudiorecorder/tst_qaudiorecorder.cpp
index 599d87dca..59593c277 100644
--- a/tests/auto/unit/multimedia/qaudiorecorder/tst_qaudiorecorder.cpp
+++ b/tests/auto/unit/multimedia/qaudiorecorder/tst_qaudiorecorder.cpp
@@ -109,9 +109,9 @@ void tst_QAudioRecorder::testNullControl()
void tst_QAudioRecorder::testAudioSource()
{
- audiosource = new QMediaRecorder;
+ audiosource = new QMediaRecorder(QMediaRecorder::AudioOnly);
- QCOMPARE(audiosource->mediaSource()->service(),(QMediaService *) mockIntegration->lastCaptureService());
+ QCOMPARE(audiosource->camera(), nullptr);
}
void tst_QAudioRecorder::testDevices()
diff --git a/tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp b/tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp
index f8c2258d0..f38d1968e 100644
--- a/tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp
+++ b/tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp
@@ -91,7 +91,7 @@ private slots:
private:
QMockIntegration *mockIntegration = nullptr;
- MockMediaSource *object = nullptr;
+ QCamera *object = nullptr;
MockMediaRecorderService *service = nullptr;
MockMediaRecorderControl *mock;
QMediaRecorder *capture;
@@ -103,7 +103,7 @@ void tst_QMediaRecorder::initTestCase()
qRegisterMetaType<QMediaRecorder::Error>("QMediaRecorder::Error");
mockIntegration = new QMockIntegration;
- object = new MockMediaSource(this, mockIntegration->createCaptureInterface(QMediaRecorder::AudioAndVideo));
+ object = new QCamera;
capture = new QMediaRecorder(object);
service = mockIntegration->lastCaptureService();
mock = service->mockControl;
@@ -121,7 +121,7 @@ void tst_QMediaRecorder::testNullService()
{
const QString id(QLatin1String("application/x-format"));
- MockMediaSource object(nullptr, nullptr);
+ QCamera object;
QMediaRecorder recorder(&object);
QCOMPARE(recorder.outputLocation(), QUrl());
@@ -136,7 +136,7 @@ void tst_QMediaRecorder::testNullService()
void tst_QMediaRecorder::testNullControls()
{
service->hasControls = false;
- MockMediaSource object(nullptr, service);
+ QCamera object;
QMediaRecorder recorder(&object);
QCOMPARE(recorder.outputLocation(), QUrl());
@@ -182,17 +182,15 @@ void tst_QMediaRecorder::testNullControls()
void tst_QMediaRecorder::testDeleteMediaSource()
{
- MockMediaSource *object = new MockMediaSource(this, service);
+ QCamera *object = new QCamera;
QMediaRecorder *capture = new QMediaRecorder(object);
- QVERIFY(capture->mediaSource() == object);
+ QVERIFY(capture->camera() == object);
QVERIFY(capture->isAvailable());
delete object;
- delete service;
- delete mock;
- QVERIFY(capture->mediaSource() == nullptr);
+ QVERIFY(capture->camera() == nullptr);
QVERIFY(!capture->isAvailable());
delete capture;
@@ -729,7 +727,7 @@ void tst_QMediaRecorder::metaData()
QFETCH(QString, genre);
QFETCH(QString, custom);
- MockMediaSource object(nullptr, service);
+ QCamera object;
QMediaRecorder recorder(&object);
QVERIFY(object.metaData().isEmpty());
@@ -879,23 +877,21 @@ void tst_QMediaRecorder::testAudioSettingsDestructor()
void tst_QMediaRecorder::testAvailabilityStatus()
{
{
- MockMediaSource object(nullptr, service);
+ QCamera object;
QMediaRecorder recorder(&object);
QCOMPARE(recorder.availability(), QMultimedia::ServiceMissing);
QCOMPARE(recorder.isAvailable(), false);
}
{
mockIntegration->createCaptureInterface(QMediaRecorder::AudioAndVideo);
- auto *service1 = mockIntegration->lastCaptureService();
- MockMediaSource object1(nullptr, service1);
+ QCamera object1;
QMediaRecorder recorder1(&object1);
QCOMPARE(recorder1.availability(), QMultimedia::Available);
QCOMPARE(recorder1.isAvailable(), true);
}
{
mockIntegration->createCaptureInterface(QMediaRecorder::AudioAndVideo);
- auto *service1 = mockIntegration->lastCaptureService();
- MockMediaSource object1(nullptr, service1);
+ QCamera object1;
QMediaRecorder recorder1(&object1);
QCOMPARE(recorder1.availability(), QMultimedia::Available);
@@ -906,13 +902,12 @@ void tst_QMediaRecorder::testAvailabilityStatus()
/* isAvailable() API test. */
void tst_QMediaRecorder::testIsAvailable()
{
- MockMediaSource object(nullptr, service);
+ QCamera object;
QMediaRecorder recorder(&object);
QCOMPARE(recorder.isAvailable(), false);
mockIntegration->createCaptureInterface(QMediaRecorder::AudioAndVideo);
- auto *service1 = mockIntegration->lastCaptureService();
- MockMediaSource object1(nullptr, service1);
+ QCamera object1;
QMediaRecorder recorder1(&object1);
QCOMPARE(recorder1.isAvailable(), true);
}
@@ -921,13 +916,13 @@ void tst_QMediaRecorder::testIsAvailable()
void tst_QMediaRecorder::testMediaSource()
{
service->hasControls = false;
- MockMediaSource object(nullptr, service);
+ QCamera object;
QMediaRecorder recorder(&object);
- QMediaSource *medobj = recorder.mediaSource();
+ QCamera *medobj = recorder.camera();
QVERIFY(medobj == nullptr);
- QMediaSource *medobj1 = capture->mediaSource();
+ QMediaSource *medobj1 = capture->camera();
QVERIFY(medobj1 != nullptr);
}
diff --git a/tests/auto/unit/multimedia/qmediasink/tst_qmediasink.cpp b/tests/auto/unit/multimedia/qmediasink/tst_qmediasink.cpp
index 140bddccd..612200841 100644
--- a/tests/auto/unit/multimedia/qmediasink/tst_qmediasink.cpp
+++ b/tests/auto/unit/multimedia/qmediasink/tst_qmediasink.cpp
@@ -35,6 +35,7 @@
#include <qmediarecordercontrol.h>
#include <qmediarecorder.h>
#include <qaudioformat.h>
+#include <qcamera.h>
#include "mockmediarecordercontrol.h"
#include "mockmediasource.h"
@@ -84,9 +85,9 @@ private slots:
{
MockMediaRecorderControl recorderControl(nullptr);
TestBindableService service(nullptr, &recorderControl);
- MockMediaSource object(nullptr, &service);
+ QCamera object;
QMediaRecorder recorder(&object);
- QMediaSource *obj = recorder.mediaSource();
+ QCamera *obj = recorder.camera();
QVERIFY(obj != nullptr);
QVERIFY(obj->isAvailable());
}
@@ -95,7 +96,7 @@ private slots:
{
MockMediaRecorderControl recorderControl(nullptr);
TestBindableService service(nullptr, &recorderControl);
- MockMediaSource object(nullptr, &service);
+ QCamera object;
QMediaRecorder *recorder = new QMediaRecorder(&object);
QVERIFY(recorder->isAvailable());
delete recorder;