From d7aa862d368d6d75fa3413f7e3ea7bcbf758c5f1 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Thu, 11 Feb 2021 22:34:54 +0100 Subject: Remove the QMediaSink inheritance from QMediaRecorder Change-Id: Ifd504569c3e50d76bfd8c8b5ea6decc53a032464 Reviewed-by: Doris Verria Reviewed-by: Lars Knoll --- src/multimedia/recording/qmediarecorder.cpp | 168 +++++---------------- src/multimedia/recording/qmediarecorder.h | 19 +-- src/multimedia/recording/qmediarecorder_p.h | 12 +- .../qaudiorecorder/tst_qaudiorecorder.cpp | 4 +- .../qmediarecorder/tst_qmediarecorder.cpp | 37 ++--- .../unit/multimedia/qmediasink/tst_qmediasink.cpp | 7 +- 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"); - qRegisterMetaType("QMediaRecorder::Status"); - qRegisterMetaType("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(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(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; } @@ -298,111 +268,50 @@ 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(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(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(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 +#include 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(q_ptr); } \ + friend class Class; + class QMediaRecorderPrivate { Q_DECLARE_NON_CONST_PUBLIC(QMediaRecorder) @@ -73,7 +78,7 @@ public: void applySettingsLater(); void restartCamera(); - QPointer mediaSource; + QPointer 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"); 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 #include #include +#include #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; -- cgit v1.2.3