diff options
Diffstat (limited to 'src/plugins/gstreamer')
-rw-r--r-- | src/plugins/gstreamer/mediacapture/qgstreamerrecordercontrol.cpp | 74 | ||||
-rw-r--r-- | src/plugins/gstreamer/mediacapture/qgstreamerrecordercontrol.h | 5 |
2 files changed, 65 insertions, 14 deletions
diff --git a/src/plugins/gstreamer/mediacapture/qgstreamerrecordercontrol.cpp b/src/plugins/gstreamer/mediacapture/qgstreamerrecordercontrol.cpp index c9e8d454c..700517a1c 100644 --- a/src/plugins/gstreamer/mediacapture/qgstreamerrecordercontrol.cpp +++ b/src/plugins/gstreamer/mediacapture/qgstreamerrecordercontrol.cpp @@ -46,10 +46,13 @@ #include <QtCore/QDebug> QGstreamerRecorderControl::QGstreamerRecorderControl(QGstreamerCaptureSession *session) - :QMediaRecorderControl(session), m_session(session), m_state(QMediaRecorder::StoppedState) + :QMediaRecorderControl(session), + m_session(session), + m_state(QMediaRecorder::StoppedState), + m_status(QMediaRecorder::UnloadedStatus) { - connect(m_session, SIGNAL(stateChanged(QGstreamerCaptureSession::State)), SLOT(updateState())); - connect(m_session, SIGNAL(error(int,QString)), SIGNAL(error(int,QString))); + connect(m_session, SIGNAL(stateChanged(QGstreamerCaptureSession::State)), SLOT(updateStatus())); + connect(m_session, SIGNAL(error(int,QString)), SLOT(handleSessionError(int,QString))); connect(m_session, SIGNAL(durationChanged(qint64)), SIGNAL(durationChanged(qint64))); connect(m_session, SIGNAL(mutedChanged(bool)), SIGNAL(mutedChanged(bool))); m_hasPreviewState = m_session->captureMode() != QGstreamerCaptureSession::Audio; @@ -74,29 +77,50 @@ bool QGstreamerRecorderControl::setOutputLocation(const QUrl &sink) QMediaRecorder::State QGstreamerRecorderControl::state() const { + return m_state; +} + +QMediaRecorder::Status QGstreamerRecorderControl::status() const +{ + static QMediaRecorder::Status statusTable[3][3] = { + //Stopped recorder state: + { QMediaRecorder::LoadedStatus, QMediaRecorder::FinalizingStatus, QMediaRecorder::FinalizingStatus }, + //Recording recorder state: + { QMediaRecorder::StartingStatus, QMediaRecorder::RecordingStatus, QMediaRecorder::PausedStatus }, + //Paused recorder state: + { QMediaRecorder::StartingStatus, QMediaRecorder::RecordingStatus, QMediaRecorder::PausedStatus } + }; + + QMediaRecorder::State sessionState = QMediaRecorder::StoppedState; + switch ( m_session->state() ) { case QGstreamerCaptureSession::RecordingState: - return QMediaRecorder::RecordingState; + sessionState = QMediaRecorder::RecordingState; case QGstreamerCaptureSession::PausedState: - return QMediaRecorder::PausedState; + sessionState = QMediaRecorder::PausedState; case QGstreamerCaptureSession::PreviewState: case QGstreamerCaptureSession::StoppedState: - return QMediaRecorder::StoppedState; + sessionState = QMediaRecorder::StoppedState; } - return QMediaRecorder::StoppedState; - + return statusTable[m_state][sessionState]; } -void QGstreamerRecorderControl::updateState() +void QGstreamerRecorderControl::updateStatus() { - QMediaRecorder::State newState = state(); - if (m_state != newState) { - m_state = newState; - emit stateChanged(m_state); + QMediaRecorder::Status newStatus = status(); + if (m_status != newStatus) { + m_status = newStatus; + emit statusChanged(m_status); } } +void QGstreamerRecorderControl::handleSessionError(int code, const QString &description) +{ + emit error(code, description); + stop(); +} + qint64 QGstreamerRecorderControl::duration() const { return m_session->duration(); @@ -104,6 +128,11 @@ qint64 QGstreamerRecorderControl::duration() const void QGstreamerRecorderControl::record() { + if (m_state == QMediaRecorder::RecordingState) + return; + + m_state = QMediaRecorder::RecordingState; + if (m_outputLocation.isEmpty()) { QString container = m_session->mediaContainerControl()->containerExtension(); if (container.isEmpty()) @@ -119,25 +148,44 @@ void QGstreamerRecorderControl::record() emit error(QMediaRecorder::ResourceError, tr("Service has not been started")); m_session->dumpGraph("after-record"); + + emit stateChanged(m_state); + updateStatus(); } void QGstreamerRecorderControl::pause() { + if (m_state == QMediaRecorder::PausedState) + return; + + m_state = QMediaRecorder::PausedState; + m_session->dumpGraph("before-pause"); if (!m_hasPreviewState || m_session->state() != QGstreamerCaptureSession::StoppedState) { m_session->setState(QGstreamerCaptureSession::PausedState); } else emit error(QMediaRecorder::ResourceError, tr("Service has not been started")); + + emit stateChanged(m_state); + updateStatus(); } void QGstreamerRecorderControl::stop() { + if (m_state == QMediaRecorder::StoppedState) + return; + + m_state = QMediaRecorder::StoppedState; + if (!m_hasPreviewState) { m_session->setState(QGstreamerCaptureSession::StoppedState); } else { if (m_session->state() != QGstreamerCaptureSession::StoppedState) m_session->setState(QGstreamerCaptureSession::PreviewState); } + + emit stateChanged(m_state); + updateStatus(); } void QGstreamerRecorderControl::applySettings() diff --git a/src/plugins/gstreamer/mediacapture/qgstreamerrecordercontrol.h b/src/plugins/gstreamer/mediacapture/qgstreamerrecordercontrol.h index 799a9a28e..c765c55fd 100644 --- a/src/plugins/gstreamer/mediacapture/qgstreamerrecordercontrol.h +++ b/src/plugins/gstreamer/mediacapture/qgstreamerrecordercontrol.h @@ -62,6 +62,7 @@ public: bool setOutputLocation(const QUrl &sink); QMediaRecorder::State state() const; + QMediaRecorder::Status status() const; qint64 duration() const; @@ -76,7 +77,8 @@ public slots: void setMuted(bool); private slots: - void updateState(); + void updateStatus(); + void handleSessionError(int code, const QString &description); private: QDir defaultDir() const; @@ -85,6 +87,7 @@ private: QUrl m_outputLocation; QGstreamerCaptureSession *m_session; QMediaRecorder::State m_state; + QMediaRecorder::Status m_status; bool m_hasPreviewState; }; |