summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/audiocapture/audiomediarecordercontrol.cpp53
-rw-r--r--src/plugins/audiocapture/audiomediarecordercontrol.h7
-rw-r--r--src/plugins/gstreamer/mediacapture/qgstreamerrecordercontrol.cpp74
-rw-r--r--src/plugins/gstreamer/mediacapture/qgstreamerrecordercontrol.h5
4 files changed, 120 insertions, 19 deletions
diff --git a/src/plugins/audiocapture/audiomediarecordercontrol.cpp b/src/plugins/audiocapture/audiomediarecordercontrol.cpp
index e1fb14d35..e17157c6a 100644
--- a/src/plugins/audiocapture/audiomediarecordercontrol.cpp
+++ b/src/plugins/audiocapture/audiomediarecordercontrol.cpp
@@ -46,11 +46,13 @@
AudioMediaRecorderControl::AudioMediaRecorderControl(QObject *parent)
:QMediaRecorderControl(parent)
+ , m_state(QMediaRecorder::StoppedState)
+ , m_prevStatus(QMediaRecorder::UnloadedStatus)
{
m_session = qobject_cast<AudioCaptureSession*>(parent);
connect(m_session,SIGNAL(positionChanged(qint64)),this,SIGNAL(durationChanged(qint64)));
- connect(m_session,SIGNAL(stateChanged(QMediaRecorder::State)),this,SIGNAL(stateChanged(QMediaRecorder::State)));
- connect(m_session,SIGNAL(error(int,QString)),this,SIGNAL(error(int,QString)));
+ connect(m_session,SIGNAL(stateChanged(QMediaRecorder::State)), this,SLOT(updateStatus()));
+ connect(m_session,SIGNAL(error(int,QString)),this,SLOT(handleSessionError(int,QString)));
}
AudioMediaRecorderControl::~AudioMediaRecorderControl()
@@ -72,6 +74,20 @@ QMediaRecorder::State AudioMediaRecorderControl::state() const
return (QMediaRecorder::State)m_session->state();
}
+QMediaRecorder::Status AudioMediaRecorderControl::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 }
+ };
+
+ return statusTable[m_state][m_session->state()];
+}
+
qint64 AudioMediaRecorderControl::duration() const
{
return m_session->position();
@@ -79,17 +95,29 @@ qint64 AudioMediaRecorderControl::duration() const
void AudioMediaRecorderControl::record()
{
- m_session->record();
+ if (m_state != QMediaRecorder::RecordingState) {
+ m_state = QMediaRecorder::RecordingState;
+ m_session->record();
+ updateStatus();
+ }
}
void AudioMediaRecorderControl::pause()
{
- m_session->stop();
+ if (m_state != QMediaRecorder::PausedState) {
+ m_state = QMediaRecorder::PausedState;
+ m_session->pause();
+ updateStatus();
+ }
}
void AudioMediaRecorderControl::stop()
{
- m_session->stop();
+ if (m_state != QMediaRecorder::StoppedState) {
+ m_state = QMediaRecorder::StoppedState;
+ m_session->pause();
+ updateStatus();
+ }
}
bool AudioMediaRecorderControl::isMuted() const
@@ -100,3 +128,18 @@ bool AudioMediaRecorderControl::isMuted() const
void AudioMediaRecorderControl::setMuted(bool)
{
}
+
+void AudioMediaRecorderControl::updateStatus()
+{
+ QMediaRecorder::Status newStatus = status();
+ if (m_prevStatus != newStatus) {
+ m_prevStatus = newStatus;
+ emit statusChanged(m_prevStatus);
+ }
+}
+
+void AudioMediaRecorderControl::handleSessionError(int code, const QString &description)
+{
+ emit error(code, description);
+ stop();
+}
diff --git a/src/plugins/audiocapture/audiomediarecordercontrol.h b/src/plugins/audiocapture/audiomediarecordercontrol.h
index 10e20d793..edd54ec83 100644
--- a/src/plugins/audiocapture/audiomediarecordercontrol.h
+++ b/src/plugins/audiocapture/audiomediarecordercontrol.h
@@ -62,6 +62,7 @@ public:
bool setOutputLocation(const QUrl &sink);
QMediaRecorder::State state() const;
+ QMediaRecorder::Status status() const;
qint64 duration() const;
@@ -75,8 +76,14 @@ public slots:
void stop();
void setMuted(bool);
+private slots:
+ void updateStatus();
+ void handleSessionError(int code, const QString &description);
+
private:
AudioCaptureSession* m_session;
+ QMediaRecorder::State m_state;
+ QMediaRecorder::Status m_prevStatus;
};
#endif
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;
};