diff options
author | Dmytro Poplavskiy <dmytro.poplavskiy@nokia.com> | 2012-01-31 13:20:17 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-02-01 08:10:33 +0100 |
commit | ba37f73d44269920c904a3110f9090b8c091c118 (patch) | |
tree | e37895afcdd32c6603ac0b3c99b01680fa459a63 | |
parent | a26bf6c8b6dbf91d0f556dfd41222db2775ba038 (diff) |
Added QMediaRecorder::actualLocation property
To report the actual location file was written.
Change-Id: Ibb56a720a258a1e5cedceaf0f9bcea73fb93bc96
Reviewed-by: Michael Goddard <michael.goddard@nokia.com>
-rw-r--r-- | src/multimedia/controls/qmediarecordercontrol.cpp | 11 | ||||
-rw-r--r-- | src/multimedia/controls/qmediarecordercontrol.h | 1 | ||||
-rw-r--r-- | src/multimedia/recording/qmediarecorder.cpp | 37 | ||||
-rw-r--r-- | src/multimedia/recording/qmediarecorder.h | 5 | ||||
-rw-r--r-- | src/multimedia/recording/qmediarecorder_p.h | 3 | ||||
-rw-r--r-- | tests/auto/unit/qmediarecorder/tst_qmediarecorder.cpp | 17 | ||||
-rw-r--r-- | tests/auto/unit/qmultimedia_common/mockmediarecordercontrol.h | 3 |
7 files changed, 76 insertions, 1 deletions
diff --git a/src/multimedia/controls/qmediarecordercontrol.cpp b/src/multimedia/controls/qmediarecordercontrol.cpp index c6af5bced..6caefd9bb 100644 --- a/src/multimedia/controls/qmediarecordercontrol.cpp +++ b/src/multimedia/controls/qmediarecordercontrol.cpp @@ -111,7 +111,9 @@ QMediaRecorderControl::~QMediaRecorderControl() The \a location can be relative or empty; in this case the service should use the system specific place and file naming scheme. - After recording has stated, QMediaRecorderControl::outputLocation() should return the actual output location. + + After recording has started, the backend should report the actual file location + with actualLocationChanged() signal. */ /*! @@ -185,6 +187,13 @@ QMediaRecorderControl::~QMediaRecorderControl() */ /*! + \fn void QMediaRecorderControl::actualLocationChanged(const QUrl &location) + + Signals that the actual media \a location has changed. + This signal should be emitted at start of recording. +*/ + +/*! \fn void QMediaRecorderControl::error(int error, const QString &errorString) Signals that an \a error has occurred. The \a errorString describes the error. diff --git a/src/multimedia/controls/qmediarecordercontrol.h b/src/multimedia/controls/qmediarecordercontrol.h index ac952708a..73e5430df 100644 --- a/src/multimedia/controls/qmediarecordercontrol.h +++ b/src/multimedia/controls/qmediarecordercontrol.h @@ -78,6 +78,7 @@ Q_SIGNALS: void stateChanged(QMediaRecorder::State state); void durationChanged(qint64 position); void mutedChanged(bool muted); + void actualLocationChanged(const QUrl &location); void error(int error, const QString &errorString); public Q_SLOTS: diff --git a/src/multimedia/recording/qmediarecorder.cpp b/src/multimedia/recording/qmediarecorder.cpp index 879d584c5..2bdb50b74 100644 --- a/src/multimedia/recording/qmediarecorder.cpp +++ b/src/multimedia/recording/qmediarecorder.cpp @@ -145,6 +145,14 @@ void QMediaRecorderPrivate::_q_serviceDestroyed() metaDataControl = 0; } +void QMediaRecorderPrivate::_q_updateActualLocation(const QUrl &location) +{ + if (actualLocation != location) { + actualLocation = location; + emit q_func()->actualLocationChanged(actualLocation); + } +} + void QMediaRecorderPrivate::_q_notify() { emit q_func()->durationChanged(q_func()->duration()); @@ -257,6 +265,9 @@ bool QMediaRecorder::setMediaObject(QMediaObject *object) 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))); } @@ -338,6 +349,9 @@ bool QMediaRecorder::setMediaObject(QMediaObject *object) connect(d->control, SIGNAL(durationChanged(qint64)), this, SIGNAL(durationChanged(qint64))); + connect(d->control, SIGNAL(actualLocationChanged(QUrl)), + this, SLOT(_q_updateActualLocation(QUrl))); + connect(d->control, SIGNAL(error(int,QString)), this, SLOT(_q_error(int,QString))); @@ -372,6 +386,14 @@ bool QMediaRecorder::setMediaObject(QMediaObject *object) */ /*! + \property QMediaRecorder::actualLocation + \brief the actual location of the last media content. + + The actual location is usually available after recording starts, + and reset when new location is set or new recording starts. +*/ + +/*! Returns true if media recorder service ready to use. */ bool QMediaRecorder::isAvailable() const @@ -401,9 +423,15 @@ QUrl QMediaRecorder::outputLocation() const bool QMediaRecorder::setOutputLocation(const QUrl &location) { Q_D(QMediaRecorder); + d->actualLocation.clear(); return d->control ? d->control->setOutputLocation(location) : false; } +QUrl QMediaRecorder::actualLocation() const +{ + return d_func()->actualLocation; +} + /*! Returns the current media recorder state. @@ -743,6 +771,8 @@ void QMediaRecorder::record() { Q_D(QMediaRecorder); + d->actualLocation.clear(); + if (d->settingsChanged) d->_q_applySettings(); @@ -805,6 +835,13 @@ void QMediaRecorder::stop() */ /*! + \fn QMediaRecorder::actualLocationChanged(const QUrl &location) + + Signals that the actual \a location of the recorded media has changed. + This signal is usually emitted when recording starts. +*/ + +/*! \fn QMediaRecorder::error(QMediaRecorder::Error error) Signals that an \a error has occurred. diff --git a/src/multimedia/recording/qmediarecorder.h b/src/multimedia/recording/qmediarecorder.h index 2a8d62fac..3b210ddc6 100644 --- a/src/multimedia/recording/qmediarecorder.h +++ b/src/multimedia/recording/qmediarecorder.h @@ -75,6 +75,7 @@ class Q_MULTIMEDIA_EXPORT QMediaRecorder : public QObject, public QMediaBindable Q_ENUMS(Error) Q_PROPERTY(qint64 duration READ duration NOTIFY durationChanged) Q_PROPERTY(QUrl outputLocation READ outputLocation WRITE setOutputLocation) + Q_PROPERTY(QUrl actualLocation READ actualLocation NOTIFY actualLocationChanged) Q_PROPERTY(bool muted READ isMuted WRITE setMuted NOTIFY mutedChanged) Q_PROPERTY(bool metaDataAvailable READ isMetaDataAvailable NOTIFY metaDataAvailableChanged) Q_PROPERTY(bool metaDataWritable READ isMetaDataWritable NOTIFY metaDataWritableChanged) @@ -105,6 +106,8 @@ public: QUrl outputLocation() const; bool setOutputLocation(const QUrl &location); + QUrl actualLocation() const; + State state() const; Error error() const; @@ -161,6 +164,7 @@ Q_SIGNALS: void stateChanged(QMediaRecorder::State state); void durationChanged(qint64 duration); void mutedChanged(bool muted); + void actualLocationChanged(const QUrl &location); void error(QMediaRecorder::Error error); @@ -180,6 +184,7 @@ private: 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)) Q_PRIVATE_SLOT(d_func(), void _q_applySettings()) }; diff --git a/src/multimedia/recording/qmediarecorder_p.h b/src/multimedia/recording/qmediarecorder_p.h index c868c4705..b899665eb 100644 --- a/src/multimedia/recording/qmediarecorder_p.h +++ b/src/multimedia/recording/qmediarecorder_p.h @@ -44,6 +44,7 @@ #include "qmediarecorder.h" #include "qmediaobject_p.h" +#include <QtCore/qurl.h> QT_BEGIN_NAMESPACE @@ -80,10 +81,12 @@ public: QMediaRecorder::State state; QMediaRecorder::Error error; QString errorString; + QUrl actualLocation; 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); void _q_applySettings(); diff --git a/tests/auto/unit/qmediarecorder/tst_qmediarecorder.cpp b/tests/auto/unit/qmediarecorder/tst_qmediarecorder.cpp index 550809ec7..c99308631 100644 --- a/tests/auto/unit/qmediarecorder/tst_qmediarecorder.cpp +++ b/tests/auto/unit/qmediarecorder/tst_qmediarecorder.cpp @@ -210,6 +210,7 @@ void tst_QMediaRecorder::testNullControls() recorder.setOutputLocation(QUrl("file://test/save/file.mp4")); QCOMPARE(recorder.outputLocation(), QUrl()); + QCOMPARE(recorder.actualLocation(), QUrl()); QAudioEncoderSettings audio; audio.setCodec(id); @@ -285,6 +286,22 @@ void tst_QMediaRecorder::testSink() capture->setOutputLocation(QUrl("test.tmp")); QUrl s = capture->outputLocation(); QCOMPARE(s.toString(), QString("test.tmp")); + QCOMPARE(capture->actualLocation(), QUrl()); + + //the actual location is available after record + capture->record(); + QCOMPARE(capture->actualLocation().toString(), QString("test.tmp")); + capture->stop(); + QCOMPARE(capture->actualLocation().toString(), QString("test.tmp")); + + //setOutputLocation resets the actual location + capture->setOutputLocation(QUrl()); + QCOMPARE(capture->actualLocation(), QUrl()); + + capture->record(); + QCOMPARE(capture->actualLocation(), QUrl::fromLocalFile("default_name.mp4")); + capture->stop(); + QCOMPARE(capture->actualLocation(), QUrl::fromLocalFile("default_name.mp4")); } void tst_QMediaRecorder::testRecord() diff --git a/tests/auto/unit/qmultimedia_common/mockmediarecordercontrol.h b/tests/auto/unit/qmultimedia_common/mockmediarecordercontrol.h index 577d09b29..3f622fe61 100644 --- a/tests/auto/unit/qmultimedia_common/mockmediarecordercontrol.h +++ b/tests/auto/unit/qmultimedia_common/mockmediarecordercontrol.h @@ -100,6 +100,9 @@ public slots: m_position=1; emit stateChanged(m_state); emit durationChanged(m_position); + + QUrl actualLocation = m_sink.isEmpty() ? QUrl::fromLocalFile("default_name.mp4") : m_sink; + emit actualLocationChanged(actualLocation); } void pause() |